最近因项目需要,要在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官网,发现对此有解释:
误以为是自己打包问题,曾经反复打包编译so文件,未果。
终于,在无意间,
我想将尝试将纯android生成的db文件拷贝到sdcard目录以比较与c层操作db文件有什么不同的时候,发现报出permission denied,最终发现原来是android对文件的读写权限没有开启:
即在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
至此,c层调用sqlite函数成功。
困扰了2天,记录一下