使用NDK开发SQLite3

前端之家收集整理的这篇文章主要介绍了使用NDK开发SQLite3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

尝试环境:

  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)目录下。

测试代码

 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,char ** argv,char **@H_404_56@ szColName)
 9 @H_404_56@{
10         int@H_404_56@ i;
11         for ( i=0; i < argc; i++@H_404_56@ )
12 @H_404_56@        {
13                 printf( "%s = %s\n",*szColName,argv == 0 ? "NUL" : *@H_404_56@argv );
14 @H_404_56@        }
15         return 0@H_404_56@;
16 @H_404_56@}
17 
18 
19 int@H_404_56@ main()
20 @H_404_56@{
21     const char * ssql1 = "create table users(userid varchar(20) PRIMARY KEY,age int,regtime datetime);"@H_404_56@;
22     const char * ssql2 = "insert into users values('guilh',29,'2009-7-16');"@H_404_56@;
23     const char * ssql3 = "select * from users;"@H_404_56@;
24 
25         sqlite3 * db = 0@H_404_56@;
26         char * pErrMsg = 0@H_404_56@;
27 
28         int ret = 0@H_404_56@;
29         const char* const dbname = "gtest.db"@H_404_56@;
30     
31         //打开数据库,如果数据库不存在,会建立一个数据库
32     ret = sqlite3_open(dbname,&@H_404_56@db);
33 
34     if ( ret !=@H_404_56@ sqlITE_OK )
35 @H_404_56@    {
36         printf("open error! : %s"@H_404_56@,sqlite3_errmsg(db));
37         return(1@H_404_56@);
38 @H_404_56@    }
39 
40     printf("open db OK!\n"@H_404_56@);
41 
42     // 执行建表sql
43     sqlite3_exec( db,ssql1,0,&@H_404_56@pErrMsg );
44     if ( ret !=@H_404_56@ sqlITE_OK )
45 @H_404_56@    {
46         //fprintf(stderr,"sql error: %s\n",pErrMsg);
47         printf("sql error: %s\n"@H_404_56@,pErrMsg);
48 @H_404_56@        sqlite3_free(pErrMsg);
49 @H_404_56@    }
50 
51     // 执行插入记录sql
52     sqlite3_exec( db,ssql2,&@H_404_56@pErrMsg);
53 
54     // 查询数据表
55     sqlite3_exec( db,ssql3,_sql_callback,&@H_404_56@pErrMsg);
56 
57     // 关闭数据库
58 @H_404_56@    sqlite3_close(db);
59     db = 0@H_404_56@;
60 
61     return 0@H_404_56@;
62 }

Android.mk: Android的make文件

 1 @H_404_56@#### START ####
 2 @H_404_56@LOCAL_PATH:= $(call my-dir)
 3 
 4 @H_404_56@include $(CLEAR_VARS)
 5 @H_404_56@#include $(LOCAL_PATH)/../config.mk
 6 
 7 @H_404_56@LOCAL_SRC_FILES:= test.cpp
 8 
 9 
10 @H_404_56@LOCAL_LDLIBS := -lcutils -licuuc -licui18n -lutils -licudata -lsqlite 
11 
12 
13 @H_404_56@#LOCAL_PRELINK_MODULE := false
14 
15 @H_404_56@LOCAL_MODULE :=  sqlite3
16 
17 @H_404_56@include $(BUILD_EXECUTABLE)
18 
19 ### END ###

如果此时直接编译的话会有如下提示

 1 @H_404_56@$ make APP=sqlite3
 2 @H_404_56@Android NDK: Building for application 'sqlite3'
 3 @H_404_56@Executable     : sqlite3
 4 @H_404_56@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 @H_404_56@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,not found (try using -rpath or -rpath-link)
 6 @H_404_56@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,not found (try using -rpath or -rpath-link)
 7 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_getShortDefinitionString_4_2'
 8 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_close_4_2'
 9 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf32_to_utf8'
10 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_open_4_2'
11 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `unorm_next_4_2'
12 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_isalpha_4_2'
13 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_strcollIter_4_2'
14 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_getSortKey_4_2'
15 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_length_from_utf32'
16 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_appendCharSafeBody_4_2'
17 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_strcoll_4_2'
18 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf8_length'
19 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `uiter_setUTF8_4_2'
20 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_toupper_4_2'
21 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `u_strtok_r_4_2'
22 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `utf32_at'
23 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libsqlite.so: undefined reference to `ucol_setAttribute_4_2'
24 @H_404_56@collect2: ld returned 1 exit status
25 @H_404_56@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目录(见上)下。

如果出现如下错误

 1 @H_404_56@$ make APP=sqlite3
 2 @H_404_56@Android NDK: Building for application 'sqlite3'
 3 @H_404_56@Executable     : sqlite3
 4 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libcutils.so: undefined reference to `ioprio_set'
 5 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libicuuc.so: undefined reference to `mbstowcs'
 6 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libcutils.so: undefined reference to `ioprio_get'
 7 @H_404_56@./platforms/android-3/arch-arm/usr/lib/libicuuc.so: undefined reference to `wcstombs'
 8 @H_404_56@collect2: ld returned 1 exit status
 9 @H_404_56@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 # ./@H_404_56@sqlite3
2 ./@H_404_56@sqlite3
3 open db OK!
4 userid =@H_404_56@ guilh
5 userid =@H_404_56@ guilh
6 userid = guilh

生成数据库如下:

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

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

1     const char * ssql2 = "insert into users values('guilh','2012-12-30 00:00:00');";

猜你在找的Sqlite相关文章