手动集成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.mzph.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…