2017-02-23 43 views
11

嗨我使用realm数据库为我的应用程序和使用roboelectric单元测试框架执行单元测试。我看到realm是用原生c代码编写的,它有librealm-jni.so文件的功能。Error:java.lang.UnsatisfiedLinkError with roboelectric and realm

我得到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(还)是一个悬而未决的问题。