本指南介绍如何编译支持 x86、ARM 32位(armeabi-v7a)和ARM 64位(arm64-v8a)架构的SQLite库。
-
安装Android NDK
- 可以从Android开发者网站下载
- 推荐使用r21或更高版本的NDK
-
设置环境变量
export ANDROID_NDK=/path/to/android-ndk
-
将sqlite源码 sqlite-autoconf-xxx.tar.gz,解压到当前目录下,或者将当前目录下的所有代码拷贝到sqlite源码目录下
如果您想使用传统的ndk-build:
-
文件:
jni/Android.mk
: NDK编译配置文件jni/Application.mk
: 指定要支持的架构build-android.sh
: 编译脚本
-
运行编译脚本:
./build-android.sh
这个方法使用NDK提供的Clang编译器直接编译SQLite:
-
使用修复过的直接编译脚本:
./android-build.sh
-
该脚本解决了以下问题:
- 添加了
-fPIC
解决ARM relocation错误 - 添加了
-fvisibility=hidden
解决符号可见性问题 - 提高了API级别到21(解决某些兼容性问题)
- 增加了错误检查和路径验证
- 链接数学库(-lm),解决某些数学函数依赖
- 添加了
这是最现代化和稳定的方法:
-
使用CMake构建系统:
./build-with-cmake.sh
-
优势:
- 更好的跨平台兼容性
- 更现代的构建系统
- 自动处理许多常见问题
- 适用于所有主流NDK版本
所有方法都会在output/lib
目录生成:
- x86架构:
output/lib/x86/libsqlite3.so
- ARM 32位架构:
output/lib/armeabi-v7a/libsqlite3.so
- ARM 64位架构:
output/lib/arm64-v8a/libsqlite3.so
头文件位于output/include
目录。
各方法中,SQLite编译选项可以通过以下方式自定义:
- NDK-Build方法:修改
jni/Android.mk
中的LOCAL_CFLAGS
- 直接编译方法:修改
android-build.sh
中的CFLAGS
变量 - CMake方法:修改
CMakeLists.txt
中的CMAKE_C_FLAGS
常用的编译选项包括:
-DSQLITE_THREADSAFE=1
: 启用线程安全-DSQLITE_ENABLE_FTS3
: 启用全文搜索-DSQLITE_ENABLE_JSON1
: 启用JSON扩展-DSQLITE_ENABLE_RTREE
: 启用R树索引-DSQLITE_ENABLE_COLUMN_METADATA
: 启用列元数据
-
将生成的
libsqlite3.so
文件复制到Android项目的src/main/jniLibs/<架构>/
目录下 -
在代码中使用:
static { System.loadLibrary("sqlite3"); }
-
使用JNI接口调用SQLite API,或者使用Android内置的SQLite接口
这通常发生在使用Mac M1/M2芯片的电脑上。解决方法:
- 使用方法2(直接使用NDK工具链)或方法3(CMake)编译
- 或者在
build-android.sh
中添加NDK_HOST_64BIT=1
参数
需要添加-fPIC
选项。我们的修复版脚本已添加此选项。
这是x86架构编译时的符号可见性问题,使用-fvisibility=hidden
选项可以解决。
原因是API级别与NDK版本不匹配。我们的修复版脚本使用API级别21,并添加了错误检查。
- 检查NDK版本是否兼容(推荐r21或更高版本)
- 确保SQLite源文件(
sqlite3.c
和sqlite3.h
)存在 - 尝试使用CMake方法,它通常最可靠