尝试环境:
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)目录下。
测试代码:
@H_502_13@ 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 ** szColName)
9 {
10 int i;
11 for ( i=0; i < argc; i++ )
12 {
13 printf( "%s = %s\n",*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 const char * ssql2 = "insert into users values('guilh',29,'2009-7-16');";
23 const char * ssql3 = "select * from users;";
24
25 sqlite3 * db = 0;
26 char * pErrMsg = 0;
27
28 int ret = 0;
29 const char* const dbname = "gtest.db";
30
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 if ( ret != sqlITE_OK )
45 {
46 //fprintf(stderr,"sql error: %s\n",pErrMsg);
47 printf("sql error: %s\n",pErrMsg);
48 sqlite3_free(pErrMsg);
49 }
50
51 // 执行插入记录sql
52 sqlite3_exec( db,ssql2,&pErrMsg);
53
54 // 查询数据表
55 sqlite3_exec( db,ssql3,_sql_callback,&pErrMsg);
56
57 // 关闭数据库
58 sqlite3_close(db);
59 db = 0;
60
61 return 0;
62 }
Android.mk: Android的make文件
@H_502_13@ 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)
18
19 ### END ###
如果此时直接编译的话会有如下提示:
@H_502_13@ 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,not found (try using -rpath or -rpath-link)
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,not found (try using -rpath or -rpath-link)
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目录(见上)下。
如果出现如下错误:
@H_502_13@ 1 $ make APP=sqlite3
2 Android NDK: Building for application 'sqlite3'
3 Executable : sqlite3
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替换掉你开发环境里面的。
执行结果如下:
@H_502_13@1 # ./sqlite3
2 ./sqlite3
3 open db OK!
4 userid = guilh
5 userid = guilh
6 userid = guilh
整个测试项目源代码:SQLite3.rar