android studio + ndk + cmake + jna +sqlite c层报错SQLITE_CANTOPEN(14),SQLITE_MISUSE(21)问题

最近因项目需要,要在android环境使用jna调用c++代码,而c层需要操作sqlite数据库,作为一个android小白(本人是写java的,我也不知道为什么要写这个)此前对安卓一无所知,只能自己摸索着。

遇到一个问题,即:在c层调用

int res = sqlite3_open("/sdcard/test.db", &db);

打开数据库,抑或创建数据库表的时候:

const char* sql = "CREATE TABLE company2(id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, address CHAR(50), salary REAL );";
res = sqlite3_exec(db, sql, 0, 0, &errmsg);

报错:

SQLITE_CANTOPEN
SQLITE_MISUSE

 

查询sqlite官网,发现对此有解释:

android studio + ndk + cmake + jna +sqlite c层报错SQLITE_CANTOPEN(14),SQLITE_MISUSE(21)问题_第1张图片

误以为是自己打包问题,曾经反复打包编译so文件,未果。

终于,在无意间,

我想将尝试将纯android生成的db文件拷贝到sdcard目录以比较与c层操作db文件有什么不同的时候,发现报出permission denied,最终发现原来是android对文件的读写权限没有开启:

即在AndroidManifest.xml中加入

 

至此,c层调用sqlite函数成功。

困扰了2天,记录一下

源码demo:https://github.com/twistercc/jnaDemo.git

你可能感兴趣的:(android,jna)