2012-04-30 13 views
5

Android uygulamasında bir kod bloğunda bir Android test vakası yazmaya çalışıyorum.Kod bloğu veritabanı (sqlcipher kütüphane fonksiyonları) ile özellikle dbopen() işleviyle etkileşime girecektir. Uygulamayı çalıştırırken, iyi çalışıyor. Bu kod bloğu için test durumunu yürütmeye çalıştığımızda (veritabanı etkileşimini içeren). Aşağıdaki hatayı veriyor: java.lang.UnsatisfiedLinkError: dbopenjava.lang.UnsatisfiedLinkError: dbopen

Herhangi bir bakış ve öneri olabilir.

Sınama vakası, sqlcipher kitaplığı işlevlerini çağıran bir işlevi çağırmaya yetkili olamaz. Gerekli tüm izinler veya Bu tür test durumları için herhangi bir özel prosedür var mı?

komple Hata günlüğü:

  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 ----- 

Kodu:

test durumu aşağıda hat dolaylı çağırıyor sqlcipher kütüphane işlevi.

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

+0

Eğer db zaten okunabilir/yazılabilir kopyanın okunabilir/yazılabilir almaya çalışıyoruz olabilir. –

+3

Bir çözüm buldunuz mu? Aşağıdaki cevabı "problemi çözer" şeklinde kontrol ettiniz, ancak gerçekten ne yapacağını söylemiyor. – kmalmur

cevap

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

Kodunuz, çalıştırdığınız sürümle uyumsuz gibi görünüyor. Uyumlu olduklarından emin olun.

0

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

Bu "unsatisfy bağlantı" hatası sınıf yüklenmiş olmasından kaynaklanabilir, ancak çalışma zamanı classloaders hiyerarşisinde yanlış classloader tarafından edebilir.

Sqllite paketinin orada ve Classpath içinde olduğu, ancak sınamalarınızı yürütmekte olan senaryoda, yanlış yükleyici örneğinin DB paketlerini yüklediği, tahmin edilen vahşi tahmintir.

14

Android için SQLCipher'ı entegre ederken aynı hatayı gördüm. Benim için çözüm, önerildiği gibi veritabanının kendisi ile çalışmadan önce

'u aramaktı. Bunu çağırmak için iyi bir yer, uygulamanın türetilmiş sınıfındadır.

Please see the instructions here

+2

Bu neden doğru cevap olarak işaretlenmiyor? –

+0

Evet, aynısını kullanıyoruz ama java.lang.UnsatisfiedLinkError olmasına rağmen: java.library.path'de sqlcipher yok. Not: Bu hata sadece Robolectric birim test durumları için geliyor. – sandeepmaaram

İlgili konular