使用libsqlite库进行Android NDK开发

来源:互联网 发布:淘宝衣服直播主播招聘 编辑:程序博客网 时间:2024/06/14 02:10

刚刚开通了博客,没事捣鼓捣鼓,把之前的笔记搬上来,大笑呀哈哈!

最近在参与一个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 := armLOCAL_MODULE    := sqlLOCAL_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-jniLOCAL_SRC_FILES := hello-jni.cLOCAL_CFLAGS    := -WerrorLOCAL_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与方法一相同


      以上是一点点小经验,如有错误,请留言指正!



















0 0
原创粉丝点击