使用NDK开发SQLite3
2019独角兽企业重金招聘Python工程师标准>>>
尝试环境:
Android2.2(源码) SDK
android-ndk-r7
尝试在NDK下面使用C语言做Android的SQLite3数据库存储功能。做了如下尝试:
在Android的源代码中找到sqlite3.h和libsqlite.so拷贝到NDK的lib(D:\android\android-ndk-r7-linux\platforms\android-3\arch-arm\usr\lib)和include(D:\android\android-ndk-r7-linux\platforms\android-3\arch-arm\usr\include)目录下。
测试代码:
/* -- START -- *//**代码借用:http://www.cnblogs.com/sardine/archive/2011/07/30/2121853.html*/#include <sqlite3.h>#include <stdio.h>static int _sql_callback(void * notused, int argc, char ** argv, char ** szColName){int i;for ( i=0; i < argc; i++ ){printf( "%s = %s\n", *szColName, argv == 0 ? "NUL" : *argv );}return 0;}int main(){const char * sSQL1 = "create table users(userid varchar(20) PRIMARY KEY,age int,regtime datetime);";const char * sSQL2 = "insert into users values('guilh',29,'2009-7-16');";const char * sSQL3 = "select * from users;";sqlite3 * db = 0;char * pErrMsg = 0;int ret = 0;const char* const dbname = "gtest.db";//打开数据库,如果数据库不存在,会建立一个数据库ret = sqlite3_open(dbname, &db);if ( ret != SQLITE_OK ){printf("open error! : %s", sqlite3_errmsg(db));return(1);}printf("open db OK!\n");// 执行建表SQLsqlite3_exec( db, sSQL1, 0, 0, &pErrMsg );if ( ret != SQLITE_OK ){//fprintf(stderr, "SQL error: %s\n", pErrMsg);printf("SQL error: %s\n", pErrMsg);sqlite3_free(pErrMsg);}// 执行插入记录SQLsqlite3_exec( db, sSQL2, 0, 0, &pErrMsg);// 查询数据表sqlite3_exec( db, sSQL3, _sql_callback, 0, &pErrMsg);// 关闭数据库sqlite3_close(db);db = 0;return 0;}
Android.mk: Android的make文件
#### START ####LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)#include $(LOCAL_PATH)/../config.mkLOCAL_SRC_FILES:= test.cppLOCAL_LDLIBS := -lcutils -licuuc -licui18n -lutils -licudata -lsqlite #LOCAL_PRELINK_MODULE := falseLOCAL_MODULE := sqlite3include $(BUILD_EXECUTABLE)### END ###
如果此时直接编译的话会有如下提示:
$ make APP=sqlite3Android NDK: Building for application 'sqlite3'Executable : sqlite3D:/android/android-ndk-r7-linux/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/arm-linux-androideabi/bin/ld.exe: warning: libicuuc.so, needed by ./platforms/android-3/arch-arm/usr/lib/libsqlite.so, not found (try using -rpath or -rpath-link)D:/android/android-ndk-r7-linux/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/arm-linux-androideabi/bin/ld.exe: warning: libicui18n.so, needed by ./platforms/android-3/arch-arm/usr/lib/libsqlite.so, not found (try using -rpath or -rpath-link)D:/android/android-ndk-r7-linux/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/arm-linux-androideabi/bin/ld.exe: warning: libutils.so, needed by ./platforms/android-3/arch-arm/usr/lib/libsqlite.so, not found (try using -rpath or -rpath-link)./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_getShortDefinitionString_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_close_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf32_to_utf8'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_open_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `unorm_next_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_isalpha_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_strcollIter_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_getSortKey_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_length_from_utf32'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_appendCharSafeBody_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_strcoll_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_length'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `uiter_setUTF8_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_toupper_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_strtok_r_4_2'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf32_at'./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_setAttribute_4_2'collect2: ld returned 1 exit statusbuild/core/build-binary.mk:324: recipe for target `out/apps/sqlite3/armeabi/sqlite3' failedmake: *** [out/apps/sqlite3/armeabi/sqlite3] Error 1
按照上面提示,依次从目标环境(源码或是你手机中)拷贝libcutils.so libicuuc.so libicui18n.so libutils.so libicudata.so到NDK的lib目录(见上)下。
如果出现如下错误:
$ make APP=sqlite3Android NDK: Building for application 'sqlite3'Executable : sqlite3./platforms/android-3/arch-arm/usr/lib/libcutils.so: undefined reference to `ioprio_set'./platforms/android-3/arch-arm/usr/lib/libicuuc.so: undefined reference to `mbstowcs'./platforms/android-3/arch-arm/usr/lib/libcutils.so: undefined reference to `ioprio_get'./platforms/android-3/arch-arm/usr/lib/libicuuc.so: undefined reference to `wcstombs'collect2: ld returned 1 exit statusbuild/core/build-binary.mk:324: recipe for target `out/apps/sqlite3/armeabi/sqlite3' failedmake: *** [out/apps/sqlite3/armeabi/sqlite3] Error 1
拷贝目标环境的libc.so替换掉你开发环境里面的。
###执行结果如下:
# ./sqlite3./sqlite3open db OK!userid = guilhuserid = guilhuserid = guilh
生成的数据库如下:
整个测试项目源代码:SQLite3.rar
数据库里面的regtime不对,是应该sql语句里面的时间不对。改下就ok:
const char * sSQL2 = "insert into users values('guilh',29,'2012-12-30 00:00:00');";
函数在线列表:http://www.sqlite.org/c3ref/funclist.html
sqlite取表函数(推荐):
int sqlite3_get_table(sqlite3 *db, /* An open database */const char *zSql, /* SQL to be evaluated */char ***pazResult, /* Results of the query */int *pnRow, /* Number of result rows written here */int *pnColumn, /* Number of result columns written here */char **pzErrmsg /* Error msg written here */
);
void sqlite3_free_table(char **result);
API说明文件:http://www.sqlite.org/c3ref/free_table.html
转载于:https://my.oschina.net/chenshouyong/blog/98937
使用NDK开发SQLite3相关推荐
- NDK开发 - C/C++ 访问 Java 变量和方法
上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...
- android ndk怎样加载o文件_JNI初探之NDK 开发环境配置
安装 CMake.LLDB与NDK 开发工具包 CMake 简介 CMake 是一款比make更强大的编译自动配置工具,它可以根据不同平台.不同的编译器,并通过CMakeLists.txt文件中简单的 ...
- JNI/NDK开发指南(八)——调用构造方法和父类实例方法
转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...
- Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发
Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...
- NDK相关概念与NDK开发步骤
1.什么是NDK(官方网站:https://developer.android.com/tools/sdk/ndk/index.html) 帮助我们开发C/C++代码编译的工具,这个工具可以将C代码编 ...
- 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...
- 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )
文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...
- 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...
- 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )
文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...
最新文章
- 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记
- Android开发举步维艰,上弘法寺七七四十九天取得“真经”!
- [周年感悟]看软件项目中的四种角色
- 三丰三坐标编程基本步骤_数控车床编程,经典实例教程
- 好班微校云信聊天解读记录
- java发送html模板
- 从大学生到职场人,一段深刻的思维认知升级补丁
- mergesort_Mergesort算法的功能方法
- 伪代码block转换成程序流程图_程序设计基础
- 方差分析表和回归分析表的那些浆糊糊
- python自动玩游戏_python学习:(2)自动玩2048游戏
- LowMemoryKiller 的使用
- HTC Vive开发笔记之手柄控制
- 【青少年编程】【二级】绘制五彩缤纷的多瓣花
- php实现店铺装修,php 实现店铺装修2
- Android TextView中 代码字体加粗方法
- 一刷131-dp-1143最长公共子序列(m)(剑指 Offer II 095. 最长公共子序列)
- 记一次js逆向详细过程
- excel箱形图中位数_在Excel中创建简单的箱形图
- python dataframe dropna_在Python中使用熊猫在两个DataFrame之间进行值...
热门文章
- vue函数如何调用其他函数?_从源码中学Vue(一)生命周期中的钩子函数的那点事儿...
- Java面试题,深入理解final关键字
- 小花梨的三角形(暴力上下扫三角形)
- 线程间的通信 共享数据安全问题
- css 全局 兼容性问题
- select的5中子句where,group by, havaing, order by, limit的使用顺序及实例
- 让Windows下的Tomcat将控制台信息记录到日志
- treeview递归
- 关于服务器端控件的attributes属性的奇怪问题
- 企业应用系统总体设计-----面向对象方法