1. 程式人生 > >使用libsqlite庫進行Android NDK開發

使用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與方法一相同

      以上是一點點小經驗,如有錯誤,請留言指正!