手動集成sqlite的方法

注意到sqlite有backup方法(https://www.sqlite.org/backup.html)。

也注意到android中sysroot下,沒有sqlite3的庫,也沒有相關頭文件。

如果要使用 sqlite 的backup,那么就需要手動集成sqlite代碼到項目中。可以如下操作:


以下是手動將 SQLite 源碼集成到 Android NDK 項目中的完整方案(基于 Android.mk),適用于需要 定制 SQLite 版本靜態鏈接 的場景:


步驟 1:獲取 SQLite 源碼

  1. 下載合并版源碼
    訪問 SQLite 官網下載頁,獲取 合并版源碼(文件名類似 sqlite-amalgamation-3420000.zip),解壓后包含:

    • sqlite3.c:所有核心代碼的合并文件
    • sqlite3.h:主頭文件
    • sqlite3ext.h:擴展頭文件(可選)
    • shell.c:命令行工具(無需此文件
  2. 放置源碼到項目
    sqlite3.csqlite3.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.hsqlite3.c 位于 jni 目錄
  • 檢查 LOCAL_SRC_FILES 是否包含 sqlite3.c
2. 功能未生效(如 sqlite3_backup_init 不存在)
  • 確認編譯時添加了 -DSQLITE_ENABLE_BACKUP
  • 檢查 SQLite 源碼版本是否支持該功能

手動集成的優缺點

優點缺點
版本可控:可自由升級/降級 SQLite增大 APK 體積(約 2-3 MB)
功能定制:啟用/禁用特定功能需自行處理安全更新
無系統依賴:兼容所有 Android 版本編譯時間增加

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75558.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯真題 2109.統計子矩陣

原題地址:1.統計子矩陣 - 藍橋云課 問題描述 給定一個 NMNM 的矩陣 AA, 請你統計有多少個子矩陣 (最小 1111, 最大 NM)NM) 滿足子矩陣中所有數的和不超過給定的整數 KK ? 輸入格式 第一行包含三個整數 N,MN,M 和 KK. 之后 NN 行每行包含 MM 個整數, 代表矩陣 AA. 輸出格…

藍橋杯—最少操作數

一.題目 分析:每次可以進行三次操作&#xff0c;求在n步操作后可以達到目標數的最小n&#xff0c;和最短路徑問題相似&#xff0c;分層遍歷加記憶化搜索防止時間復雜度過高&#xff0c;還需要減枝操作 import java.util.HashSet; import java.util.LinkedList; import java.ut…

Linux內核NIC網卡驅動實戰案例分析

以下Linux 內核模塊實現了一個虛擬網絡設備驅動程序&#xff0c;其作用和意義如下&#xff1a; 1. 作用 &#xff08;1&#xff09;創建虛擬網絡設備對 驅動程序動態創建了兩個虛擬網絡設備&#xff08;nic_dev[0]和nic_dev[1]&#xff09;&#xff0c;模擬物理網卡的功能。這兩…

Trae初使用心得(Java后端)

1.前提 2025年3月3日&#xff0c;字節跳動正式官宣“中國首個 AI 原生集成開發環境&#xff08;AI IDE&#xff09;”Trae 國內版正式上線&#xff0c;由于之前項目的原因小編沒有及時的去體驗&#xff0c;這幾日專門抽空去體驗了一下感覺還算可以。 2.特點 Trade重在可以白嫖…

[項目]基于FreeRTOS的STM32四軸飛行器: 十二.角速度加速度濾波

基于FreeRTOS的STM32四軸飛行器: 十二.濾波 一.濾波介紹二.對角速度進行一階低通濾波三.對加速度進行卡爾曼濾波 一.濾波介紹 模擬信號濾波&#xff1a; 最常用的濾波方法可以在信號和地之間并聯一個電容&#xff0c;因為電容通交隔直&#xff0c;信號突變會給電容充電&#x…

UNIX網絡編程筆記:TCP、UDP、SCTP編程的區別

一、核心特性對比 特性TCPUDPSCTP連接方式面向連接&#xff08;三次握手&#xff09;無連接面向連接&#xff08;四次握手&#xff09;可靠性可靠傳輸&#xff08;重傳、確認機制&#xff09;不可靠傳輸可靠傳輸&#xff08;多路徑冗余&#xff09;傳輸單位字節流&#xff08;…

Python爬蟲異常處理:自動跳過無效URL

爬蟲在運行過程中常常會遇到各種異常情況&#xff0c;其中無效URL的出現是較為常見的問題之一。無效URL可能導致爬蟲程序崩潰或陷入無限等待狀態&#xff0c;嚴重影響爬蟲的穩定性和效率。因此&#xff0c;掌握如何在Python爬蟲中自動跳過無效URL的異常處理技巧&#xff0c;對于…

C++語法學習的主要內容

科技特長生方向&#xff0c;主要學習的內容為 一&#xff0c;《C語法》 二&#xff0c;《數據結構》 三&#xff0c;《算法》 四&#xff0c;《計算機基礎知識》 五&#xff0c;《初高中的數學知識》 其中&#xff0c;《C語法》學習的主要內容如下: 1,cout輸出語句和鍵盤…

3、孿生網絡/連體網絡(Siamese Network)

目的: 用Siamese Network (孿生網絡) 解決Few-shot learning (小樣本學習)。 Siamese Network并不是Meta Learning最好的方法, 但是通過學習Siamese Network,非常有助于理解其他Meta Learning算法。 這里介紹了兩種方法:Siamese Network (孿生網絡)、Trplet Loss Siam…

從零構建大語言模型全棧開發指南:第二部分:模型架構設計與實現-2.2.1從零編寫類GPT-2模型架構(規劃模塊與代碼組織)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 2.2.1 從零編寫類GPT-2模型架構(規劃模塊與代碼組織)1. 模型架構設計規劃1.1 架構核心組件2. 模塊化設計實現2.1 輸入處理模塊2.1.1 分詞與嵌入2.1.2 位置編碼2.2 解碼塊設計2.2.1 多頭注意力子層2.2.…

消息隊列(Kafka及RocketMQ等對比聯系)

目錄 消息隊列 一、為什么使用消息隊列&#xff1f;消息隊列有什么優點/缺點&#xff1f;介紹下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么優點缺點&#xff0c;如何取舍&#xff1f; 1.公司業務場景是什么&#xff0c;這個業務場景有什么挑戰&#xff0c;如果不用MQ有什么麻…

Android 13系統定制實戰:基于系統屬性的音量鍵動態屏蔽方案解析

1. 需求背景與實現原理 在Android 13系統定制化開發中&#xff0c;需根據設備場景動態屏蔽音量鍵&#xff08;VOLUME_UP/VOLUME_DOWN&#xff09;功能。其核心訴求是通過系統屬性&#xff08;persist.sys.roco.volumekey.enable&#xff09;控制音量鍵的響應邏輯&#xff0c;確…

解鎖DeepSeek潛能:Docker+Ollama打造本地大模型部署新范式

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、什么是Docker 2、什么是Ollama 二、準備工作 1、操…

uv - Guides 指南 [官方文檔翻譯]

文章目錄 Guides 指南概述安裝 Python入門安裝特定版本重新安裝 Python查看 Python 安裝自動 Python 下載使用現有的 Python 版本 運行腳本在沒有依賴的情況下運行腳本運行帶有依賴的腳本創建一個Python腳本聲明腳本依賴使用替代包索引鎖定依賴提高可重復性使用不同的 Python 版…

根據模板將 Excel 明細數據生成 PDF 文檔 | PDF實現郵件合并功能

在日常辦公中&#xff0c;我們常常會面臨這樣的需求&#xff1a;依據特定的模板&#xff0c;把 Excel 里的每一條數據轉化為單獨的 PDF 文檔&#xff0c;且這些 PDF 文檔中的部分內容會根據 Excel 數據動態變化。這一功能不僅能高效完成任務&#xff0c;還支持圖片的動態替換&a…

apache安裝腳本使用shell建立

注意防火墻&#xff0c;yum&#xff0c;網絡連接等 以下是具體的apache安裝腳本 #!/bin/bash # Set Apache version to install ## author: yuan # 檢查外網連接 echo "檢查外網連接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; …

wordpress主題使用中常見錯誤匯總

在WordPress主題的使用過程中&#xff0c;開發者可能會遇到各種問題。下面是一些常見錯誤的匯總&#xff0c;并給出了相應的解決方法。 一、主題安裝與激活錯誤 無法激活主題&#xff1a;檢查主題文件是否完整&#xff0c;以及是否符合WordPress的主題規范。 激活主題后出現…

如何設計一個訂單號生成服務?應該考慮那些問題?

如何設計一個訂單號生成服務&#xff1f;應該考慮那些問題&#xff1f; description: 在高并發的電商系統中&#xff0c;生成全局唯一的訂單編號是關鍵。本文探討了幾種常見的訂單編號生成方法&#xff0c;包括UUID、數據庫自增、雪花算法和基于Redis的分布式組件&#xff0c;并…

Springboot 集成 Flowable 6.8.0

1. 創建 Spring Boot 項目 通過 Spring Initializr&#xff08;https://start.spring.io/ &#xff09;創建一個基礎的 Spring Boot 項目&#xff0c;添加以下依賴&#xff1a; Spring WebSpring Data JPAMySQL DriverLombok&#xff08;可選&#xff0c;用于簡化代碼&#x…

《TCP/IP網絡編程》學習筆記 | Chapter 22:重疊 I/O 模型

《TCP/IP網絡編程》學習筆記 | Chapter 22&#xff1a;重疊 I/O 模型 《TCP/IP網絡編程》學習筆記 | Chapter 22&#xff1a;重疊 I/O 模型理解重疊 I/O 模型重疊 I/O本章討論的重疊 I/O 的重點不在于 I/O 創建重疊 I/O 套接字執行重疊 I/O 的 WSASend 函數進行重疊 I/O 的 WSA…