![]()
今回はオープンソースのデータベース「SQLite」をAndroid NDKから呼び出して利用してみる。
まずhttp://www.sqlite.org/ download.htmlからSQLiteのソースコードをダウンロードする。利用したバージョンはSQLite 3.7.4だ。
![]()
次にEasyProjectGenerator for Android Ver 1.00を利用してAndroid NDKプロジェクトを生成、Eclipseに取り込む。
![]()
そしてプロジェクトフォルダのjniフォルダの下に「sqlite」というフォルダを作り、中に先ほどダウンロードしたSQLiteのソースコードを一式解凍する。
![]()
さらに自動生成されていたソースコードとmakefileを「test105」というフォルダを作り、その中へ移動する。
![]()
ここでjniフォルダ直下にAndroid.mkファイルを新規作成する。
include $(call all-subdir-makefiles)
このmakefileはAndroidプロジェクトのhttp://code.google.com/ p/rowboat/内で使われていたものを改変した。
#
# from rowboat-external-sqlite-master and modified
#
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := sqlite3.c
ifneq ($(TARGET_ARCH),arm)
LOCAL_LDLIBS += -lpthread -ldl
endif
LOCAL_CFLAGS += -DHAVE_USLEEP=1 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 -DSQLITE_THREADSAFE=1 -DNDEBUG=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_DEFAULT_AUTOVACUUM=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_BACKWARDS -DSQLITE_ENABLE_POISON -Dfdatasync=fsync
ifneq ($(TARGET_SIMULATOR),true)
LOCAL_SHARED_LIBRARIES := libdl
endif
LOCAL_MODULE:= libsqlite
#new sqlite 3.5.6 no longer support external allocator
#LOCAL_CFLAGS += -DSQLITE_OMIT_MEMORY_ALLOCATION
LOCAL_C_INCLUDES += $(call include-path-for, system-core)/cutils
LOCAL_SHARED_LIBRARIES += liblog \
libicuuc \
libicui18n \
libutils
# include android specific methods
LOCAL_WHOLE_STATIC_LIBRARIES := libsqlite3_android
include $(BUILD_SHARED_LIBRARY)
#include <string.h>
#include <jni.h>
#include "../sqlite/sqlite3.h"
jstring
Java_com_Test105_Test105Act_stringFromJNI(JNIEnv* env,jobject thiz)
{
char pszRet[256];
strcpy(pszRet,"Failed.");
sqlite3 *db;
int rc = sqlite3_open("/sdcard/a.db", &db);
sqlite3_stmt *st;
rc = sqlite3_prepare(db, "CREATE TABLE test(id INTEGER PRIMARY KEY,name TEXT);", -1, &st, NULL);
rc = sqlite3_step(st);
rc = sqlite3_finalize(st);
rc = sqlite3_prepare(db, "INSERT INTO test(name) VALUES (?);", -1, &st, NULL);
sqlite3_bind_text(st, 1, "abcdef", -1, SQLITE_STATIC);
rc = sqlite3_step(st);
rc = sqlite3_finalize(st);
rc = sqlite3_prepare(db, "SELECT name FROM test", -1, &st, NULL);
while((rc = sqlite3_step(st)) == SQLITE_ROW)
{
char* pszName = (char*)sqlite3_column_text(st, 0);
strcpy(pszRet,pszName);
break;
}
sqlite3_finalize(st);
sqlite3_close(db);
return (*env)->NewStringUTF(env, pszRet);
}
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Test105jni LOCAL_SRC_FILES := Test105jni.c LOCAL_SHARED_LIBRARIES := libsqlite include $(BUILD_SHARED_LIBRARY)
![]()
これでndk-buildによりネイティブコードをビルドする。
![]()
EclipseのDDMSから仮想SDカード内にSQLiteが作成したデータベースファイルも確認できる。
プロジェクトファイルをダウンロード
