使用libsqlite庫進行Android NDK開發
剛剛開通了部落格,沒事搗鼓搗鼓,把之前的筆記搬上來,呀哈哈!
最近在參與一個Android NDK開發的專案,需要在Native層獲取資料並儲存,在Java層得到資料、處理。常用的有兩種方式,一採用xml,二是採用資料庫。Android的資料庫採用輕量型的Sqlite。好吧,這裡說下在NDk下使用第三方庫的方法。
一,首先從Android系統獲取動態庫
1)手機連線電腦,360手機助手或者豌豆莢
2)進入sdk\platform-tools執行adb.exe ,執行adb shell 後,使用ls和cd檢視android系統目錄
3)找到目錄為:system/lib/libsqlite.so,檢視完畢,退出:exit
4)將檔案複製出來: adb pull/system/lib/libsqlite.so E:/
5)儲存在E盤
二、在eclipse中使用libsqlite.so
需要檔案:sqlite3.h和libsqlite.so (sqlite3.h 網上可以找到)
方法一:
1.把libsqlite.so檔案放到 $NDK\platforms\android-19\arch-arm\usr\lib目錄下。($NDK指你NDK的存放路徑)
把sqlite3.h放在 $NDK\platforms\android-19\arch-arm\usr\include目錄下
2.在eclipse中設定NDk include的路徑
右擊專案——>properties——>C/C++ General——>Paths and Symbols——Includes
確認是否有NDK的include路徑,如果沒有,則Add,講NDK的include新增進去(即sqlite3.h存放的路徑)
3)在Android.mk檔案中新增sqlite庫
LOCAL_LDLIBS := -lsqlite
#這是從NDK本地目錄lib中找庫,如果放入工程中,則採用方法二
4)在jni目錄中的C檔案中包含標頭檔案
#include <sqlite3.h>
//這是從NDK本地目錄include中找標頭檔案
5)貼上一丟丟相關程式碼
//db我設定的全域性
int openDatabase(const char* const dbname)
{
sqlite3_initialize();
char * pErrMsg = 0;
int ret = 0;
//開啟資料庫,如果資料庫不存在,會建立一個數據庫
ret = sqlite3_open(dbname, &db);
if ( ret != SQLITE_OK )
{
LOGD("open error! : %s", sqlite3_errmsg(db));
return 1;
}
LOGD("open db OK!\n");
return 0;
}
/*建立資料庫表,nit_table,eit_table,sdt_t*/
int execSql(const char * sql )
{
char * pErrMsg = 0;
int ret=0;
ret=sqlite3_exec( db, sql, 0, 0, &pErrMsg );
if ( ret != SQLITE_OK )
{
//fprintf(stderr, "SQL error: %s\n", pErrMsg);
LOGD("SQL error: %s\n", pErrMsg);
sqlite3_free(pErrMsg);
return 1;
}
return 0;
}
void closeDatabase()
{
sqlite3_close(db);
db = 0;
}
//呼叫部分
//開啟
const char* dbname = "/sdcard/DVB/database/epg.db";
openDatabase(dbname);
//建表
const char * sSQL1 = "create table nit(userid INTEGER PRIMARY KEY AUTOINCREMENT,network_id
int UNIQUE ON CONFLICT REPLACE,version_num int,network_name char(20));";
execSql(sSQL1 );
//關閉
closeDatabase();
PS:Sql語句,可能會用到變數,需要用sprintf連線,如:
char sql[100];
sprintf(sql, "insert into nit(network_id,version_num,network_name) values(%d,%d,'%s')",p_nit->i_network_id ,p_nit->i_version,network_name);
LOGD("sql='%s'",sql);
execSql(sql);
6)最後給sdcard設定寫許可權
AndroidManifest.xml中加入程式碼:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
方法二:
1)把sqlite3.h 和libsqlite.so放入工程檔案的jni目錄中
2)在Android.mk中新增指令碼
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := sql
LOCAL_SRC_FILES := epg/libsqlite.so
LOCAL_EXPORT_C_INCLUDES := epg/sqlite3.h
include $(PREBUILT_SHARED_LIBRARY)
#新增libsql庫
<pre name="code" class="html" style="font-size: 18px; font-weight: bold; ">include $(CLEAR_VARS)
<pre name="code" class="objc">LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_CFLAGS := -Werror
LOCAL_LDLIBS := -llog
<pre name="code" class="html" style="font-size: 18px; font-weight: bold; ">LOCAL_SHARED_LIBRARIES := libsql #載入編譯的共享庫
include $(BUILD_SHARED_LIBRARY)
3)include sqlite3.h標頭檔案
#include "sqlite3.h"
4)如果使用sqlite與方法一相同
以上是一點點小經驗,如有錯誤,請留言指正!