java以应用程序为例添加SQLCipher不起作用
我目前正在关注Mark Murphys SQLite 安卓教程。我偶然发现了SQLCihper,它能够使数据在从设备上取下时无法读取。我制作了自己的示例应用程序,DB和MainActivity工作得非常好。我能够从模拟器中提取数据库,并且能够使用SQLite browser读取数据库的内容。然后,我按照另一个stackoverflow问题中的这些“简单”说明进行操作,但我发现了一些错误
以下是我在示例应用程序中的主要活动中的onCreate:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBHelper db = new DBHelper(this);
db.getReadableDatabase();
同样,上面的代码工作正常
接下来,我尝试将示例应用程序与SQLCipher集成:
- 复制了icudt46l。压缩到/压缩到资产中
- 抄了三张。因此,将文件放入/armeabi
- 抄了三张。因此,将文件转换为/x86
- 将三个jar复制到/libs
- 将我在DBHelper类中的导入更改为使用SQLCipher中的API
- 向getReadableDatabase()添加了一个参数李>
现在,我的主要活动onCreate代码如下所示:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBHelper db = new DBHelper(this);
db.getReadableDatabase("sekrit");
日志:
06-20 20:50:33.178: E/AndroidRuntime(24805): FATAL EXCEPTION: main
06-20 20:50:33.178: E/AndroidRuntime(24805): java.lang.UnsatisfiedLinkError: Native method not found: net.sqlcipher.database.SQLiteDatabase.dbopen:(Ljava/lang/String;I)V
06-20 20:50:33.178: E/AndroidRuntime(24805): at net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method)
06-20 20:50:33.178: E/AndroidRuntime(24805): at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1950)
06-20 20:50:33.178: E/AndroidRuntime(24805): at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:900)
06-20 20:50:33.178: E/AndroidRuntime(24805): at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:943)
06-20 20:50:33.178: E/AndroidRuntime(24805): at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:107)
06-20 20:50:33.178: E/AndroidRuntime(24805): at net.sqlcipher.database.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:173)
06-20 20:50:33.178: E/AndroidRuntime(24805): at com.example.testsqlcipher.MainActivity.onCreate(MainActivity.java:65)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.Activity.performCreate(Activity.java:5104)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.ActivityThread.access$600(ActivityThread.java:141)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.os.Handler.dispatchMessage(Handler.java:99)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.os.Looper.loop(Looper.java:137)
06-20 20:50:33.178: E/AndroidRuntime(24805): at 安卓.app.ActivityThread.main(ActivityThread.java:5041)
06-20 20:50:33.178: E/AndroidRuntime(24805): at java.lang.reflect.Method.invokeNative(Native Method)
06-20 20:50:33.178: E/AndroidRuntime(24805): at java.lang.reflect.Method.invoke(Method.java:511)
06-20 20:50:33.178: E/AndroidRuntime(24805): at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-20 20:50:33.178: E/AndroidRuntime(24805): at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-20 20:50:33.178: E/AndroidRuntime(24805): at dalvik.system.NativeStart.main(Native Method)
# 1 楼答案
看起来你们在对这个问题的评论中把它们都整理好了,但是为了供参考和其他人,我们这里有一个SQLCipher和Android项目的集成教程,其中包含loadLibs位;-)
http://sqlcipher.net/sqlcipher-for-android/
正如@commonware所建议的,也欢迎所有人将问题发布到SQLCipher用户邮件列表:
http://groups.google.com/group/sqlcipher