6

私はAndroidアプリケーションのコードブロックに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());

4

3 に答える 3

18

Android用SQLCipherの統合中に同じエラーが発生しました。私にとっての解決策は電話することでした

SQLiteDatabase.loadLibs(Context context)

推奨されるように、データベース自体を操作する前に。アプリケーションの派生クラスにある、呼び出すのに適した場所です。

こちらの手順をご覧ください

于 2013-06-10T13:24:14.327 に答える
1
No implementation found for native Linfo/guardianproject/database/sqlcipher/SQLiteDatabase;.dbopen (Ljava/lang/String;I)V

あなたのコードはあなたが実行しているバージョンと互換性がないようです。それらに互換性があることを確認してください。

于 2012-04-30T13:30:17.107 に答える
0

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

この「不十分なリンク」エラーは、クラスがロードされたという事実が原因である可能性がありますが、ランタイムクラスローダーの階層内の間違ったクラスローダーが原因である可能性があります。

ワイルドな推測では、Sqlliteパッケージがそこにあり、クラスパスにありますが、テストを実行するシナリオでは、間違ったローダーインスタンスがDBパッケージをロードしました。

于 2012-04-30T13:52:39.903 に答える