手动集成sqlite的方法
注意到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 版本 | 编译时间增加 |
相关文章:
手动集成sqlite的方法
注意到sqlite有backup方法(https://www.sqlite.org/backup.html)。 也注意到android中sysroot下,没有sqlite3的库,也没有相关头文件。 如果要使用 sqlite 的backup,那么就需要手动集成sqlite代码到项目中。可以如下操…...
比特币牛市还在不在
在加密货币的风云世界里,比特币的一举一动始终牵动着投资者们的神经。近期比特币的涨幅动作,再次引发了市场对于牛市是否仍在延续的激烈讨论。 在深入探索比特币市场的过程中,获取全面且及时的资讯至关重要。您可以通过访问Techub News&#…...
Python、MATLAB和PPT完成数学建模竞赛中的地图绘制
参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是21年亚太赛的那道塞罕坝的题目,期间涉及到温度、降水和森林覆盖率…...
跨平台RTSP高性能实时播放器实现思路
跨平台RTSP高性能实时播放器实现思路 目标:局域网100ms以内超低延迟 一、引言 现有播放器(如VLC)在RTSP实时播放场景中面临高延迟(通常数秒)和资源占用大的问题。本文提出一种跨平台解决方案,通过网络层…...
编写一个简单的chrome截图扩展
文件结构: screenshot |-- background.js ---> service_worker运行的js |-- images ---> 图片 | |-- logo-128x128.png | |-- logo-16x16.png | |-- logo-32x32.png | -- logo-48x48.png -- manifest.json --->…...
吴恩达机器学习笔记复盘(六)梯度下降算法
简介 梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于机器学习、深度学习等领域,在这里是用于求J(w,b)局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是,一个人…...
【机器学习chp14 — 3】生成式模型—生成对抗网络GAN(超详细分析,易于理解,推导严谨,一文就够了)
目录 三、生成对抗网络 ( Generative Adversarial Networks,GAN ) 1、GAN的基本思想 (1)生成器与判别器的基本结构与演变 (2)“对抗”机制及名词由来 2、GAN训练的基本算法 (1)网络初始化与…...
机器人打磨控制技术
工具姿态调整运动 法线方向对齐运动:机器人实时调整工具姿态,使打磨工具的轴线与工件曲面的法线方向一致。例如,在球面打磨时,工具需始终垂直于球面切线。角度补偿运动:针对倾斜或不规则曲面,通过调整机器人…...
K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群
配置altermanager发送告警到钉钉群 创建钉钉群,设置机器人助手(必须是管理员才能设置),获取webhook webhook: https://oapi.dingtalk.com/robot/send?access_token25bed933a52d69f192347b5be4b2193bc0b257a6d9ae68d81619e3ae3d93f7c6…...
Spring Boot + Spring Integration整合MQTT打造双向通信客户端
1. 概述 本文分两个章节讲解MQTT相关的知识,第一部份主要讲解MQTT的原理和相关配置,第二个章节主要讲和Spring boot的integration相结合代码的具体实现,如果想快速实现功能,可直接跳过第一章节查看第二章讲。 1.1 MQTT搭建 为了…...
Sampling – Model Context Protocol Specification
网页链接 https://spec.modelcontextprotocol.io/specification/draft/client/sampling/ 主要内容概述 该网页详细介绍了Model Context Protocol (MCP) 中的“Sampling”功能。Sampling允许服务器通过客户端请求语言模型(LLM)生成文本、音频或图像内容…...
Java 填充 PDF 模版
制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop,安装过程很简单,一路下一步即可。用 OnlyOffice 制作 PDF 模版(表单) 使用 OnlyOffice 表单设计器,制作表单,如下图 注意命名…...
前端项目中应该如何选择正确的图片格式
在前端项目中选择正确的图片格式是优化页面性能、提升用户体验的关键步骤之一。以下是常见图片格式的特点、适用场景及选择建议,帮助你在不同场景下做出最优决策: 一、常见图片格式对比 格式特点适用场景不适用场景JPEG- 有损压缩,文件小- 不…...
Vulnhub-dedecms织梦通关攻略
姿势一、通过文件管理器上传WebShell 第一步:进入后台,找到文件管理器上传木马文件 第二步:使用蚁剑进行连接 #文件地址 http://localhost/dedecms/shell.php 姿势二、修改模板⽂件拿WebShell 第一步:修改模板文件,删除…...
数据集获取
sklearn数据集 sklearn有四部分数据。其中sklearn的数据集有两部分真实的数据,一部分嵌入到了sklearn库中,即安装好sklearn后就自带了一部分数据,这些数据的规模比较小称为small toy datasets ,还有一部分数据是需要在网上下载的,sklearn提供了下载的api接口,这些数据规…...
实验12深度学习
实验12深度学习 一、实验目的 (1)理解并熟悉深度神经网络的工作原理; (2)熟悉常用的深度神经网络模型及其应用环境; (3)掌握Anaconda的安装和设置方法,进一步熟悉Jupyte…...
2024年消费者权益数据分析
📅 2024年315消费者权益数据分析 数据见:https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在数字化时代,消费者维权数据对于市场监管、商家诚信和行业发展具有重要价值。本文基于 2024年315平台线上投诉数据,采用数…...
零知识证明:区块链隐私保护的变革力量
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
rag-给一篇几百页的pdf,如何从中找到关键信息并汇总出关系图
小思考 对pdf肯定要做模糊chunk,能用模型切分就用模型切分,不能用模型就用规则,规则要尽可能保存连续文本,特殊数据格式(图、表格)必须完整保存,必须能被捕捉到。这些独立的表格or图数据&#…...
Rust语言学习
Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目(模块系统)包和crate定义模块来控制作用…...
wordPress WooCommerce 本地文件包含漏洞复现(CVE-2025-1661)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
【CSS文字渐变动画】
CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子,花都开了,小鸟也飞回来了,大山也绿了起来,空气也有点嫩嫩的气息了</p>…...
2021-06-15 C逆序存入数组的元素
缘由编程,逆序存入数组的元素_编程语言-CSDN问答 #define N 7 main() { static int a[N]{12,9,16,5,7,2,l},k,s; for(k0;k<N;k) Printf("%4d",a[k]);for (k0;k<N/2; k) {sa[k]; a[k]a[N-1-k]; a[N-1-k]s; } for (k0;k<N;k) Printf("%4…...
Qt 控件概述 QLabel
目录 QLabel显示类控件 label如何做到与窗口同步变化 边框 Frame QLabel显示类控件 textFormat :设置文件格式 Pixmap :标签图片 label如何做到与窗口同步变化 Qt中对应用户的操作 : 事件和信号 拖拽窗口大小就会触发…...
k8s服务中userspace,iptables,和ipvs的比较
在 Kubernetes 中,kube-proxy 是负责实现服务负载均衡的组件。它支持三种代理模式:userspace、iptables 和 ipvs。这三种模式在性能、功能和复杂性上有所不同。以下是它们的详细比较: 1. Userspace 模式 Userspace 是 Kubernetes 最早支持的…...
Vue 渲染 LaTeX 公式 Markdown 库
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
KMP-子串匹配算法-关键点理解
1.理解next[]数组的使用与来历 2.求解next[]数组 一、kmp算法的原理 首先观察暴力解法:假设主串为:abdxxabc,模式串为abxxabd。 暴力解法,就是对主串每个字符作为第一个字符,开始和模式串比较。 比如:从…...
网络原理之网络层、数据链路层
1. 网络层 1.1 IP协议 1.1.1 基本概念 主机: 配有IP地址,但是不进⾏路由控制的设备路由器: 即配有IP地址,⼜能进⾏路由控制节点: 主机和路由器的统称 1.1.2 协议头格式 说明: 4位版本号(version): 指定IP协议的版本,对于IPv4来说,就是4,对于IPv6来说,就是6 4位头…...
ssh 多重验证的好处:降低密钥长度,动态密码
ssh 多重验证的好处: 多重验证:可能要比单纯提高密钥长度,或密码的长度更好,可以获得更好的保证服务器安全的效果。降低密钥长度:可以提高 CPU运行时的有效速度,特别是在传输大文件、或传输低比特率视频时…...
版本控制器Git ,Gitee如何连接Linux Gitee和Github区别
📖 示例场景 假设你和朋友在开发一个「在线笔记网站」,代码需要频繁修改和协作: 只用本地文件管理 每次修改后手动复制文件,命名为 v1.html、v2.html 问题:无法追踪具体改动内容;多人修改易冲突࿱…...
