头脑一热想用C做点数据库方面的开发。结果发现NDK没有提供SQLite相关的库与接口。
首先,从android代码中找到sqlite代码,external/sqlite/dist
将代码复制到项目c代码目录下。#include "sqlite3.h"
static int test()
{
sqlite3 *db;
int rc = sqlite3_open_v2("/data/local/tmp/a.db", &db, SQLITE_OPEN_READWRITE, NULL);
sqlite3_stmt *st;
int res = 0;
int rc, i, cols, type;
char *next;
char buf[]="select count(*) from aa;";
rc = sqlite3_prepare(db, buf, strlen(buf), &st, &next);
if (rc != SQLITE_OK)
{
sqlite3_close(db)
return -1;
} for(;;)
{
rc = sqlite3_step(st);
if (rc == SQLITE_ROW)
{
res = sqlite3_column_int(st, 0);
break;
}
}
rc = sqlite3_finalize(st);
sqlite3_close(db);
return res;
}
int main(int argc, char **argv)
{
test();
}
以上是代码,没经过验证,就是说明个意思,重点在下面的Makefile。注意,该Makefile并不是用Android编译系统编译,而是直接使用NDK编译。将下面的文本存到代码目录下,并保存名为Makefile。
请注意:下面的NDK目录是本人NDK安装目录,请看官自行修改为自己安装的路径。
######## START OF MAKEFILE ########
# Set 'ANDROID_NDK' to the location your NDK is installed
ANDROID_NDK = /opt/SDK/android_ndk/android-ndk-r4b# determine the tools directory based on Windows install paths
TOOLDIR=$(ANDROID_NDK)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin# set tools based on TOOLDIR
CC      =       $(TOOLDIR)/arm-eabi-gcc
CPP     =       $(TOOLDIR)/arm-eabi-g++
STRIP   =       $(TOOLDIR)/arm-eabi-strip# prepare the NDK include path and library paths/options
INCLUDES +=-I $(ANDROID_NDK)/build/platforms/android-3/arch-arm/usr/include \LIBS += -Wl,-rpath-link=$(ANDROID_NDK)/build/platforms/android-3/arch-arm/usr/lib \
   -L$(ANDROID_NDK)/build/platforms/android-3/arch-arm/usr/lib \
   -lc -lm -lstdc++ -Wl,--no-undefined -ldl \
   -Wl,--gc-sections -Bdynamic -Wl,-z,nocopyreloc  \
   -Wl,-dynamic-linker,/system/bin/linker  \
   -Wl,-T,$(ANDROID_NDK)/build/prebuilt/linux-x86/arm-eabi-4.4.0/arm-eabi/lib/ldscripts/armelf.x -Wl -nostdlib \
   $(ANDROID_NDK)/build/platforms/android-3/arch-arm/usr/lib/crtbegin_dynamic.o \
   $(ANDROID_NDK)/build/platforms/android-3/arch-arm/usr/lib/crtend_android.oCFLAGS += $(INCLUDES)
CPPFLAGS += $(CFLAGS)
LFLAGS = $(LIBS)
APP  = test
OBJS = test.o sqlite3.o
$(APP): $(OBJS)
$(CC) -o $(APP) $(OBJS) $(LIBS)
$(STRIP) $(APP)clean:
rm -f $(OBJS) $(APP)

解决方案 »

  1.   

    NDK和SDK是一个类型的?也是android开发用到的?了解一下
      

  2.   

    NDK和SDK不同。NDK是基于C/C++的,一方面可以直接编写可执行程序,另外一方面可以创建JNI库来对java程序提速或者完成一些java完成不了的任务。
    比如游戏开发中一些运算量比较大的任务交给C/C++程序会对性能有着较高提升
      

  3.   

    那你怎么配置android.mk文件的?
      

  4.   

    sqlite本身就很大,生成的so文件至少1m吧,java层的调用的本身下面就是ndk写的,没有太大必要啊