注意到sqlite有backup方法(https://www.sqlite.org/backup.html)。
也注意到android中sysroot下,沒有sqlite3的庫,也沒有相關頭文件。
如果要使用 sqlite 的backup,那么就需要手動集成sqlite代碼到項目中。可以如下操作:
以下是手動將 SQLite 源碼集成到 Android NDK 項目中的完整方案(基于 Android.mk
),適用于需要 定制 SQLite 版本 或 靜態鏈接 的場景:
步驟 1:獲取 SQLite 源碼
-
下載合并版源碼
訪問 SQLite 官網下載頁,獲取 合并版源碼(文件名類似sqlite-amalgamation-3420000.zip
),解壓后包含:sqlite3.c
:所有核心代碼的合并文件sqlite3.h
:主頭文件sqlite3ext.h
:擴展頭文件(可選)shell.c
:命令行工具(無需此文件)
-
放置源碼到項目
將sqlite3.c
和sqlite3.h
復制到項目的jni
目錄:project-root/ └── app/└── src/main/└── jni/├── sqlite3.c├── sqlite3.h├── your-code.c├── Android.mk└── Application.mk
步驟 2:配置 Android.mk
LOCAL_PATH := $(call my-dir)# 編譯 SQLite 為靜態庫
include $(CLEAR_VARS)
LOCAL_MODULE := sqlite3
LOCAL_SRC_FILES := sqlite3.c
LOCAL_CFLAGS := -DSQLITE_ENABLE_BACKUP \ # 啟用備份功能-DSQLITE_DEFAULT_MEMSTATUS=0 \ # 禁用內存統計(節省內存)-DSQLITE_OMIT_DEPRECATED # 移除廢棄API
include $(BUILD_STATIC_LIBRARY)# 編譯主模塊
include $(CLEAR_VARS)
LOCAL_MODULE := your-module-name # 與Java中System.loadLibrary()一致
LOCAL_SRC_FILES := your-code.c
LOCAL_STATIC_LIBRARIES := sqlite3 # 鏈接靜態庫
LOCAL_LDLIBS := -llog # 如果需要Android日志
include $(BUILD_SHARED_LIBRARY)
關鍵配置說明
1. SQLite 編譯選項
通過 LOCAL_CFLAGS
定制功能:
-DSQLITE_ENABLE_BACKUP # 必須開啟備份API
-DSQLITE_THREADSAFE=1 # 線程安全模式(默認)
-DSQLITE_ENABLE_FTS5 # 啟用全文搜索FTS5
-DSQLITE_USE_URI=1 # 支持URI格式文件名
2. 優化選項
-DSQLITE_DEFAULT_MEMSTATUS=0 # 關閉內存統計,減少內存占用
-DSQLITE_OMIT_DEPRECATED # 移除廢棄函數
-DNDEBUG=1 # 關閉調試斷言
3. ABI 兼容性
在 Application.mk
中指定支持的 CPU 架構:
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
APP_OPTIM := release # 開啟編譯器優化
步驟 3:在 C 代碼中使用 SQLite
#include <jni.h>
#include <sqlite3.h> // 使用本地源碼JNIEXPORT void JNICALL
Java_com_example_YourClass_method(JNIEnv *env, jobject thiz) {sqlite3 *db;int rc = sqlite3_open(":memory:", &db); // 使用內存數據庫// 執行備份操作sqlite3_backup *backup = sqlite3_backup_init(dest_db, "main", src_db, "main");// ... 備份邏輯 ...
}
驗證是否成功
1. 編譯檢查
運行 ndk-build
時觀察輸出:
$ ndk-build
[armeabi-v7a] Compile thumb : sqlite3 <= sqlite3.c
[armeabi-v7a] StaticLibrary : libsqlite3.a
[armeabi-v7a] Compile thumb : your-module <= your-code.c
[armeabi-v7a] SharedLibrary : libyour-module.so
2. 運行時日志
在代碼中添加版本查詢:
__android_log_print(ANDROID_LOG_DEBUG, "SQLite", "Version: %s", sqlite3_libversion());
預期輸出:
D/SQLite: Version: 3.42.0 # 與下載的源碼版本一致
常見問題解決
1. 頭文件找不到 (sqlite3.h: No such file
)
- 確保
sqlite3.h
和sqlite3.c
位于jni
目錄 - 檢查
LOCAL_SRC_FILES
是否包含sqlite3.c
2. 功能未生效(如 sqlite3_backup_init
不存在)
- 確認編譯時添加了
-DSQLITE_ENABLE_BACKUP
- 檢查 SQLite 源碼版本是否支持該功能
手動集成的優缺點
優點 | 缺點 |
---|---|
版本可控:可自由升級/降級 SQLite | 增大 APK 體積(約 2-3 MB) |
功能定制:啟用/禁用特定功能 | 需自行處理安全更新 |
無系統依賴:兼容所有 Android 版本 | 編譯時間增加 |