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
相关产品推荐
相关产品推荐

