2017-02-23 8 views
11

こんにちは私はアプリケーションのためにrealmデータベースを使用しており、ユニットテストを実行するためのユニットテストフレームワークroboelectricを使用しています。私はrealmがネイティブCコードで書かれているのを参照してください、それはその機能のためにlibrealm-jni.soファイルを持っています。エラー:roboelectricとrealmを持つjava.lang.UnsatisfiedLinkError

私はUnsatisfiedLinkErrorエラーが発生していますが、robolectricはネイティブライブラリをサポートしていません。それを解決するには何らかの方法が必要だと私は信じています。私はこのHow to load .so when using Robolectric?の回答を受け入れようとしましたが運はありませんでした。

java.lang.UnsatisfiedLinkError: Can't load library: C:\Users\XS~1\AppData\Local\Temp\android-tmp-robolectric7796034244909642596\app_lib\realm-jni.dll.2.3.1 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) 
    at java.lang.Runtime.load0(Runtime.java:809) 
    at java.lang.System.load(System.java:1086) 
    at com.getkeepsafe.relinker.SystemLibraryLoader.loadPath(SystemLibraryLoader.java:29) 
    at com.getkeepsafe.relinker.ReLinkerInstance.loadLibraryInternal(ReLinkerInstance.java:198) 
    at com.getkeepsafe.relinker.ReLinkerInstance.loadLibrary(ReLinkerInstance.java:136) 
    at com.getkeepsafe.relinker.ReLinker.loadLibrary(ReLinker.java:70) 
    at com.getkeepsafe.relinker.ReLinker.loadLibrary(ReLinker.java:57) 
    at io.realm.internal.RealmCore.loadLibrary(RealmCore.java:59) 
    at io.realm.Realm.init(Realm.java:187) 
    at com.xyz.helloworld.HelloWorldApplication.onCreate(HelloWorldApplication.java:17) 
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:147) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:329) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:259) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:41) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:199) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:114) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:57) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:66) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:377) 
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) 
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

HelloWorldApplication.java

public class HelloWorldApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Realm.init(this); 

     RealmConfiguration config = new RealmConfiguration.Builder() 
       .name("book.realm") 
       .schemaVersion(1) 
       .build(); 

     Realm.setDefaultConfiguration(config); 
    } 

    protected void loadNativeLibraries() { 
     try { 
      System.loadLibrary("librealm-jni"); 
     } catch (UnsatisfiedLinkError e) { 
     } 
    } 
} 

TestHelloWorldApplication.java

public class TestHelloWorldApplication extends HelloWorldApplication { 

    @Override 
    protected void loadNativeLibraries() { 
     //do nothing 
    } 
} 
+0

Realm自体がネイティブライブラリを読み込むため、動作しないと思います。したがって、Realmの初期化を呼び出されない方法で移動する必要があります。 https://github.com/Glucosio/glucosio-android/blob/develop/app/src/main/java/org/glucosio/android/GlucosioApplication.java –

+0

@EugenMartynovへのアプローチを探してください。それは私としては機能しません私の活動を 'oncreate'メソッド' realm'を呼び出すのは概念的に 'realm'を起動する前に呼び出すことができませんDB –

+2

私のメッセージは - プレゼンテーション層から記憶層を抽象化すると良いです –

答えて

1

チェックこのout

RealmがRobolectric(まだ)をサポートしていないことは未解決の問題です。