java.lang.UnsatisfiedLinkError: dbopen

6
我正在尝试在Android应用程序的一段代码上编写测试用例。该代码块将与数据库交互(使用sqlcipher库函数),特别是dbopen()函数。运行应用程序时,它可以正常工作。但是,当我们尝试执行涉及数据库交互的该代码块的测试用例时,它会出现以下错误:java.lang.UnsatisfiedLinkError: dbopen。
请问有谁能够查看并提供建议?
测试用例是否具有调用调用sqlcipher库函数的函数的权限?是否需要任何权限或针对此类测试用例的特定过程?
完整的错误日志如下:
            04-30 12:08:33.997: I/TestRunner(2169): started: teststateMachine(com.americanlogistics.mdd.rhapsody.view.test.SigninViewsateMachineTest)
            04-30 12:08:34.147: W/dalvikvm(2169): No implementation found for native Linfo/guardianproject/database/sqlcipher/SQLiteDatabase;.dbopen (Ljava/lang/String;I)V
            04-30 12:08:34.164: I/TestRunner(2169): failed: teststateMachine(com.americanlogistics.mdd.rhapsody.view.test.SigninViewsateMachineTest)
            04-30 12:08:34.164: I/TestRunner(2169): ----- begin exception -----
            04-30 12:08:34.184: I/TestRunner(2169): java.lang.UnsatisfiedLinkError: dbopen
            04-30 12:08:34.184: I/TestRunner(2169):     at info.guardianproject.database.sqlcipher.SQLiteDatabase.dbopen(Native Method)
            04-30 12:08:34.184: I/TestRunner(2169):     at info.guardianproject.database.sqlcipher.SQLiteDatabase.<init>(SQLiteDatabase.java:1870)
            04-30 12:08:34.184: I/TestRunner(2169):     at info.guardianproject.database.sqlcipher.SQLiteDatabase.openDatabase(SQLiteDatabase.java:863)
            04-30 12:08:34.184: I/TestRunner(2169):     at info.guardianproject.database.sqlcipher.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:897)
            04-30 12:08:34.184: I/TestRunner(2169):     at info.guardianproject.database.sqlcipher.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:107)
            04-30 12:08:34.184: I/TestRunner(2169):     at com.americanlogistics.mdd.rhapsody.database.SendQueueDBAdapter.open(SendQueueDBAdapter.java:45)
            04-30 12:08:34.184: I/TestRunner(2169):     at com.americanlogistics.mdd.rhapsody.database.SendQueueDBAdapter.databaseHelperInstance(SendQueueDBAdapter.java:38)
            04-30 12:08:34.184: I/TestRunner(2169):     at com.americanlogistics.mdd.rhapsody.common.ApplicationController.startDatabase(ApplicationController.java:530)
            04-30 12:08:34.184: I/TestRunner(2169):     at com.americanlogistics.mdd.rhapsody.view.test.SigninViewsateMachineTest.teststateMachine(SigninViewsateMachineTest.java:61)
            04-30 12:08:34.184: I/TestRunner(2169):     at java.lang.reflect.Method.invokeNative(Native Method)
            04-30 12:08:34.184: I/TestRunner(2169):     at java.lang.reflect.Method.invoke(Method.java:507)
            04-30 12:08:34.184: I/TestRunner(2169):     at junit.framework.TestCase.runTest(TestCase.java:154)
            04-30 12:08:34.184: I/TestRunner(2169):     at junit.framework.TestCase.runBare(TestCase.java:127)
            04-30 12:08:34.184: I/TestRunner(2169):     at junit.framework.TestResult$1.protect(TestResult.java:106)
            04-30 12:08:34.184: I/TestRunner(2169):     at junit.framework.TestResult.runProtected(TestResult.java:124)
            04-30 12:08:34.184: I/TestRunner(2169):     at junit.framework.TestResult.run(TestResult.java:109)
            04-30 12:08:34.184: I/TestRunner(2169):     at junit.framework.TestCase.run(TestCase.java:118)
            04-30 12:08:34.184: I/TestRunner(2169):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
            04-30 12:08:34.184: I/TestRunner(2169):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
            04-30 12:08:34.184: I/TestRunner(2169):     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
            04-30 12:08:34.184: I/TestRunner(2169):     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)
            04-30 12:08:34.184: I/TestRunner(2169): ----- end exception -----

代码:

测试用例中以下行间接调用了sqlcipher库函数。

ApplicationController.getInstance().startDatabase(this.getContext().getApplicationContext());

(说明:该行代码间接使用了sqlcipher库函数)

也许你正在尝试获取已经可读/可写的数据库副本的可读/可写权限。 - Its not blank
3
你找到解决方案了吗?你已将下面的回答标记为“解决了问题”,但它并没有真正说明该怎么做。 - kmalmur
3个回答

18

在集成SQLCipher for Android时,我遇到了相同的错误。对我来说解决方案是调用

SQLiteDatabase.loadLibs(Context context)

在与数据库本身进行操作之前,建议先调用它。一个好的调用位置是在应用程序派生类中。

请参阅此处的说明


是的,我们正在使用相同的内容,但是即使如此,仍然会出现java.lang.UnsatisfiedLinkError:在java.library.path中没有sqlcipher。注意:这个错误只会出现在Robolectric单元测试用例中。 - sandeepmaaram

1
No implementation found for native Linfo/guardianproject/database/sqlcipher/SQLiteDatabase;.dbopen (Ljava/lang/String;I)V

看起来你的代码与你正在运行的版本不兼容。请确保它们是兼容的。


0

http://www.coderanch.com/t/79145/Websphere/Native-lib-already-loaded-another

这个“不满足的链接”错误可能是由于在运行时类加载器层次结构中,一个类已经被加载,但是被错误的类加载器加载导致的。

猜测是Sqllite包已经存在并且在类路径中,但是在运行测试的情况下,错误的加载器实例已经加载了DB包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接