You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android项目引入SQLite .so库遇jniLibs错误的解决咨询

解决Android库项目中jniLibs属性错误并正确引入SQLite .so库

先搞定你遇到的jniLibs错误

这个报错Could not get unknown property 'jniLibs' for source set 'main'本质是Gradle找不到你声明的jniLibs配置项——要么是你没在sourceSets里显式指定它的路径,要么是老版本Android插件需要明确配置才能识别这个目录。

直接给你修正后的Module级build.gradle配置,照着改就行:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.3" // 建议和compileSdk版本匹配,避免兼容问题

    defaultConfig {
        minSdkVersion 16 // 根据你的项目需求调整最低兼容版本
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        // 可选:指定你需要支持的CPU架构,和.so库的架构对应
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // 核心:显式配置jniLibs的路径,让Gradle能识别这个目录
    sourceSets {
        main {
            // 默认路径是src/main/jniLibs,如果你把.so放在libs目录,就改成['libs']
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 其他依赖按需添加
}

正确引入SQLite .so库的步骤

1. 调整项目目录结构

把编译好的SQLite .so文件按CPU架构分类放到jniLibs目录下,结构如下:

你的库模块/
├── src/
│   ├── main/
│   │   ├── java/
│   │   ├── jniLibs/
│   │   │   ├── armeabi-v7a/
│   │   │   │   └── libsqlite3.so
│   │   │   ├── arm64-v8a/
│   │   │   │   └── libsqlite3.so
│   │   │   ├── x86/
│   │   │   │   └── libsqlite3.so
│   │   │   └── x86_64/
│   │   │       └── libsqlite3.so
│   │   └── jni/  # 如果你有自己的JNI代码,就放这里,没有可以删掉

如果是自己用SQLite amalgamation源码编译.so,直接用NDK编译生成对应架构的文件即可,步骤这里就不展开了。

2. 链接.so库并调用SQLite函数

如果你需要在Java层调用SQLite的API,必须写JNI代码做一层封装:

  • Java层代码示例:
public class SQLiteNativeHelper {
    // 加载SQLite的.so库
    static {
        System.loadLibrary("sqlite3");
        // 如果有自己封装的JNI库,比如libsqlite_wrapper.so,也要加载
        // System.loadLibrary("sqlite_wrapper");
    }

    // 声明native方法,对应JNI层的实现
    public native int openDatabase(String dbFilePath);
}
  • JNI层代码示例(sqlite_wrapper.cpp):
#include <jni.h>
#include <sqlite3.h>

extern "C" JNIEXPORT jint JNICALL
Java_com_yourpackage_SQLiteNativeHelper_openDatabase(JNIEnv* env, jobject thiz, jstring db_path) {
    const char* path = env->GetStringUTFChars(db_path, nullptr);
    sqlite3* db;
    // 调用SQLite的核心API
    int result_code = sqlite3_open(path, &db);
    env->ReleaseStringUTFChars(db_path, path);
    return result_code;
}

3. 用CMake编译JNI代码(推荐Android Studio 3.0+)

如果你的项目用CMake管理JNI编译,需要在build.gradle中添加CMake配置:

android {
    // ...其他配置
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

然后在模块根目录创建CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

# 引入预编译的SQLite .so库
add_library(sqlite3 SHARED IMPORTED)
set_target_properties(sqlite3 PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libsqlite3.so)

# 编译自己的JNI封装库
add_library(sqlite_wrapper SHARED
        src/main/jni/sqlite_wrapper.cpp)

# 链接SQLite库和Android日志库(如果需要打日志)
target_link_libraries(sqlite_wrapper
        sqlite3
        log)

几个注意事项

  • 确保abiFilters配置的架构和你放入jniLibs的.so架构完全一致,否则会出现运行时找不到库的错误。
  • 如果你不需要Java层调用,纯C/C++项目中使用SQLite,只需要在CMake/Android.mk中链接libsqlite3.so即可。
  • 老版本Android插件可能需要用ndk-build代替CMake,配置逻辑类似,只是用Android.mk和Application.mk来管理编译。

内容的提问来源于stack exchange,提问作者Program-Me-Rev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:28:11