(开发历程:关于AS开发NDK的博客并不多,资源也比较少。对于刚开始接触相关知识也是摸了很多次坑,自己慢慢摸索出来)
数据库的简单操作
1. 开发需要
- libsqliteX.so
- classes.jar
- sqlite3.h
2. 新建 Native C++工程
* 这里没有其他需求的话就一直next,最后finish
* 之后导入class.jar包及相关so库,把sqlite3.h(头文件)直接复制在.cpp文件的同一级目录。
如何导入jar包
下图为整个工程目录:
3. 配置
CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
add_library(sql SHARED native-lib.cpp )
add_library(sqliteX SHARED IMPORTED )
set_target_properties(
sqliteX
PROPERTIES IMPORTED_LOCATION
${
CMAKE_SOURCE_DIR}/libs/arm64-v8a/libsqliteX.so)
find_library(log-lib log )
target_link_libraries(sql sqliteX
${
log-lib} )
build.gradle
//----------添加1--------------
ndk{
abiFilters 'arm64-v8a'
}
//-----------添加2--------------
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
4. native-lib.cpp
#include "sqlite3.h"
#include <stdio.h>
#include <stdlib.h>
#include "android/log.h"
#define LOG "JNILOG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__)
sqlite3 * db;
char * pErrMsg = 0;
int ret = 0;
char* sql;
sqlite3_stmt * stmt;
- 打开数据库
//数据库存放的位置(文件名)
const char *filename = "storage//emulated//0//1//myText.db";
/*
* SQLITE_API int sqlite3_open(const char *filename, sqlite3 **ppDb);
* 参数1: 数据库存放的位置(文件名)
* 参数2: 关键数据类型(默认:sqlite3 *,不用管)
*
* 如果正常打开,ret为 0(SQLITE_OK)
* 如果打开失败,ret为其他数
* 文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。
* 如果它存在,就尝试把它当数据库文件来打开。
* */
LOGD("------------打开数据库--------------");
ret = sqlite3_open(filename, &db);
if ( ret != SQLITE_OK )
{
LOGD("打开失败失败,错误码:%d------错误原因:%s",ret,sqlite3_errmsg(db));
return(-1);
}
- 创建表格
//创建一个表名叫:MyTet
//有三个字段:id、name、isExistence
sql = "create table myText(" \
"id int primary key not null," \
"name text not null," \
"isExistence char(4) not null);";
/*
* 执行建表SQL
* int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg );
*
* 参数1:关键数据
* 参数2:sql语句,以/0结尾
* 参数3:回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数
* 参数4:void * 是你所提供的指针,你可以传递任何一个指针参数到这里,
* 这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL
* 参数5:错误信息
* */
LOGD("------------建表--------------");
ret = sqlite3_exec( db, sql, 0, 0, &pErrMsg );
if ( ret != SQLITE_OK )
{
LOGD("创建表失败,错误码:%d--------错误原因:%s",ret,sqlite3_errmsg(db));