【问题标题】:Taking an example app and adding SQLCipher not working以示例应用程序并添加 SQLCipher 不起作用
【发布时间】:2013-06-20 20:53:09
【问题描述】:

我目前正在关注 Mark Murphys SQLite android 教程。我偶然发现了 SQLCihper,它能够在从设备中取出数据时使数据不可读。我制作了自己的示例应用程序,并且 DB 和 MainActivity 完美运行。我能够从模拟器中拉出数据库,并且能够使用SQLite browser 读取数据库的内容。然后我按照另一个 stackoverflow 问题的这些“简单”说明进行操作,但我遇到了错误。

这是我的示例应用中 MainActivity 中的 onCreate:

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBHelper db = new DBHelper(this);
db.getReadableDatabase();

同样,上面的代码运行良好。

接下来我尝试将我的示例应用程序与 SQLCipher 集成:

  1. 将 icudt46l.zip 复制到 /assets
  2. 将三个 .so 文件复制到 /armeabi 中
  3. 将三个 .so 文件复制到 /x86
  4. 将三个 jar 复制到 /libs 中
  5. 更改了我在 DBHelper 类中的导入以使用来自 SQLCipher 的 API
  6. 为getReadableDatabase()添加了一个参数;

所以现在我的 MainActivity 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 android.app.Activity.performCreate(Activity.java:5104)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.os.Looper.loop(Looper.java:137)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at android.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.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-20 20:50:33.178: E/AndroidRuntime(24805):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 确定一下,如果您使用的是 Eclipse 和 R22,您是否修复了构建路径的“订购和导出”部分? stackoverflow.com/questions/16596969/… 另外,/armeabi,你不是说libs/armeabi/ 吗? (x86 同上)
  • 您能详细说明“订购和出口”吗?是的,我的意思是/libs/armeabi。我在 Java Build Path 中添加了三个 jar 和 .zip。然后我进入 Order and Export 并检查了这四个文件(3 .jars 1 .zip)并按下确定。
  • “订单和出口”的内容是我在上面链接到的 SO 答案 (stackoverflow.com/questions/16596969/…) 中介绍的内容。你可以阅读更多关于它的信息:commonsware.com/blog/2013/05/23/…
  • 与其检查这些文件,不如检查“Android Private Libraries”。
  • 让它工作。刚刚在我的数据库初始化和我的db.getReadableDatabase("sekrit"); 行之间添加了SQLiteDatabase.loadLibs(this);。谢谢

标签: java android sqlite sqlcipher


【解决方案1】:

看起来你们已经在 cmets 中对问题进行了排序,但为了参考和其他任何人,我们在此处提供了 SQLCipher 和 Android 项目的集成教程,其中包含 loadLibs 位 ;-)

http://sqlcipher.net/sqlcipher-for-android/

正如@CommonsWare 所建议的,也欢迎大家向 SQLCipher 用户邮件列表发布问题:

http://groups.google.com/group/sqlcipher

【讨论】:

  • 不幸的是,它不是 Windows 友好的教程。另外,我找不到确切的下载文件的位置。 http://sqlcipher.net/storage/android/downloads/SQLCipher%20for%20Android%202.1.1.zip页面上的链接失效了。
  • 啊,这是一个旧链接,我们会修复它。当前的 android 二进制文件在此处:s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+2.2.0.zip,但您始终可以在此处找到最新链接:sqlcipher.net/downloads
  • 尤里卡!我很高兴这不完全是我的错。
猜你喜欢
  • 2013-07-31
  • 2018-08-09
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多