加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用NDK开发SQLite3

发布时间:2020-12-13 00:04:02 所属栏目:百科 来源:网络整理
导读:尝试环境: Android2.2(源码) SDK android-ndk-r7 尝试在NDK下面使用C语言做Android的SQLite3数据库存储功能。做了如下尝试: 在Android的源代码中找到sqlite3.h和libsqlite.so拷贝到NDK的lib(D:androidandroid-ndk-r7-linuxplatformsandroid-3arch-

尝试环境:

  Android2.2(源码) SDK

  android-ndk-r7

尝试在NDK下面使用C语言做Android的SQLite3数据库存储功能。做了如下尝试:

在Android的源代码中找到sqlite3.h和libsqlite.so拷贝到NDK的lib(D:androidandroid-ndk-r7-linuxplatformsandroid-3arch-armusrlib)和include(D:androidandroid-ndk-r7-linuxplatformsandroid-3arch-armusrinclude)目录下。

测试代码:

 1 /* -- START -- */
 2 /*
 3  *代码借用:http://www.cnblogs.com/sardine/archive/2011/07/30/2121853.html
 4   5 #include <sqlite3.h>
 6 #include <stdio.h>
 7 
 8 static int _sql_callback(void * notused,int argc,255)">char ** argv,255)">char ** szColName)
 9 {
10         int i;
11         for ( i=0; i < argc; i++ )
12         {
13                 printf( "%s = %sn",*szColName,argv == 0 ? NUL" : *argv );
14         }
15         return 0;
16 }
17 
18 
19 int main()
20 {
21     const char * sSQL1 = create table users(userid varchar(20) PRIMARY KEY,age int,regtime datetime);";
22     char * sSQL2 = insert into users values('guilh',29,'2009-7-16');23     char * sSQL3 = select * from users;24 
25         sqlite3 * db = 26         char * pErrMsg = 27 
28         int ret = 29         char* const dbname = gtest.db30     
31         //打开数据库,如果数据库不存在,会建立一个数据库
32     ret = sqlite3_open(dbname,&db);
33 
34     if ( ret != SQLITE_OK )
35     {
36         printf(open error! : %s",sqlite3_errmsg(db));
37         return(1);
38     }
39 
40     printf(open db OK!n");
41 
42      执行建表SQL
43     sqlite3_exec( db,sSQL1,0,&pErrMsg );
44     45     {
46         fprintf(stderr,"SQL error: %sn",pErrMsg);
47         printf(SQL error: %sn48         sqlite3_free(pErrMsg);
49     }
50 
51      执行插入记录SQL
52     sqlite3_exec( db,sSQL2,&pErrMsg);
53 
54      查询数据表
55     sqlite3_exec( db,sSQL3,_sql_callback,128)">56 
57      关闭数据库
58     sqlite3_close(db);
59     db = 60 
61     62 }

Android.mk: Android的make文件

1 #### START #### 2 LOCAL_PATH:= $(call my-dir) 3 4 include $(CLEAR_VARS) 5 #include $(LOCAL_PATH)/../config.mk 6 7 LOCAL_SRC_FILES:= test.cpp 8 9 10 LOCAL_LDLIBS := -lcutils -licuuc -licui18n -lutils -licudata -lsqlite 11 12 13 #LOCAL_PRELINK_MODULE := false 14 15 LOCAL_MODULE := sqlite3 16 17 include $(BUILD_EXECUTABLE) 19 ### END ### 如果此时直接编译的话会有如下提示:

1
$ make APP=sqlite3 2 Android NDK: Building for application 'sqlite3' 3 Executable : sqlite3 4 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: libicuuc.so,needed by ./platforms/android-3/arch-arm/usr/lib/libsqlite.so,not found (try using -rpath or -rpath-link) 5 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,128)"> 6 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,128)"> 7 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_getShortDefinitionString_4_2' 8 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_close_4_2' 9 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf32_to_utf8' 10 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_open_4_2' 11 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `unorm_next_4_2' 12 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_isalpha_4_2' 13 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_strcollIter_4_2' 14 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_getSortKey_4_2' 15 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_length_from_utf32' 16 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_appendCharSafeBody_4_2' 17 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_strcoll_4_2' 18 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_length' 19 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `uiter_setUTF8_4_2' 20 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_toupper_4_2' 21 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_strtok_r_4_2' 22 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf32_at' 23 ./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_setAttribute_4_2' 24 collect2: ld returned 1 exit status 25 build/core/build-binary.mk:324: recipe for target `out/apps/sqlite3/armeabi/sqlite3' failed 26 make: *** [out/apps/sqlite3/armeabi/sqlite3] Error 1 按照上面提示,依次从目标环境(源码或是你手机中)拷贝libcutils.so libicuuc.so libicui18n.so libutils.so libicudata.so到NDK的lib目录(见上)下。

如果出现如下错误:

4
./platforms/android-3/arch-arm/usr/lib/libcutils.so: undefined reference to `ioprio_set' 5 ./platforms/android-3/arch-arm/usr/lib/libicuuc.so: undefined reference to `mbstowcs' 6 ./platforms/android-3/arch-arm/usr/lib/libcutils.so: undefined reference to `ioprio_get' 7 ./platforms/android-3/arch-arm/usr/lib/libicuuc.so: undefined reference to `wcstombs' 8 collect2: ld returned 1 exit status 9 build/core/build-binary.mk:324: recipe for target `out/apps/sqlite3/armeabi/sqlite3' failed 10 make: *** [out/apps/sqlite3/armeabi/sqlite3] Error 1 拷贝目标环境的libc.so替换掉你开发环境里面的。

执行结果如下:

1 # ./sqlite3
2 ./sqlite3
3 open db OK!
4 userid = guilh
5 userid = guilh
6 userid = guilh

生成的数据库如下:

整个测试项目源代码:SQLite3.rar

数据库里面的regtime不对,是应该sql语句里面的时间不对。改下就ok:

1
";

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读