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相关推荐

  1. NDK开发 - C/C++ 访问 Java 变量和方法

    上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...

  2. android ndk怎样加载o文件_JNI初探之NDK 开发环境配置

    安装 CMake.LLDB与NDK 开发工具包 CMake 简介 CMake 是一款比make更强大的编译自动配置工具,它可以根据不同平台.不同的编译器,并通过CMakeLists.txt文件中简单的 ...

  3. JNI/NDK开发指南(八)——调用构造方法和父类实例方法

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中 ...

  4. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  5. NDK相关概念与NDK开发步骤

    1.什么是NDK(官方网站:https://developer.android.com/tools/sdk/ndk/index.html) 帮助我们开发C/C++代码编译的工具,这个工具可以将C代码编 ...

  6. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  7. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  8. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  9. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

最新文章

  1. 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记
  2. Android开发举步维艰,上弘法寺七七四十九天取得“真经”!
  3. [周年感悟]看软件项目中的四种角色
  4. 三丰三坐标编程基本步骤_数控车床编程,经典实例教程
  5. 好班微校云信聊天解读记录
  6. java发送html模板
  7. 从大学生到职场人,一段深刻的思维认知升级补丁
  8. mergesort_Mergesort算法的功能方法
  9. 伪代码block转换成程序流程图_程序设计基础
  10. 方差分析表和回归分析表的那些浆糊糊
  11. python自动玩游戏_python学习:(2)自动玩2048游戏
  12. LowMemoryKiller 的使用
  13. HTC Vive开发笔记之手柄控制
  14. 【青少年编程】【二级】绘制五彩缤纷的多瓣花
  15. php实现店铺装修,php 实现店铺装修2
  16. Android TextView中 代码字体加粗方法
  17. 一刷131-dp-1143最长公共子序列(m)(剑指 Offer II 095. 最长公共子序列)
  18. 记一次js逆向详细过程
  19. excel箱形图中位数_在Excel中创建简单的箱形图
  20. python dataframe dropna_在Python中使用熊猫在两个DataFrame之间进行值...

热门文章

  1. vue函数如何调用其他函数?_从源码中学Vue(一)生命周期中的钩子函数的那点事儿...
  2. Java面试题,深入理解final关键字
  3. 小花梨的三角形(暴力上下扫三角形)
  4. 线程间的通信 共享数据安全问题
  5. css 全局 兼容性问题
  6. select的5中子句where,group by, havaing, order by, limit的使用顺序及实例
  7. 让Windows下的Tomcat将控制台信息记录到日志
  8. treeview递归
  9. 关于服务器端控件的attributes属性的奇怪问题
  10. 企业应用系统总体设计-----面向对象方法