2017-02-23 25 views
11

Xin chào Tôi đang sử dụng cơ sở dữ liệu realm cho ứng dụng của mình và sử dụng khung kiểm tra đơn vị roboelectric để thực hiện kiểm tra đơn vị. Tôi thấy realm được viết bằng mã c gốc, nó có librealm-jni.so tệp cho chức năng của chúng.Lỗi: java.lang.UnsatisfiedLinkError với roboelectric và realm

Tôi nhận được lỗi UnsatisfiedLinkError, đọc ở đâu đó mà robolectric không hỗ trợ thư viện gốc. Tôi tin rằng phải có một số cách để giải quyết nó. Tôi đã thử câu trả lời được chấp nhận của số này How to load .so when using Robolectric? nhưng không may mắn.

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

Tôi nghĩ rằng nó không hoạt động vì bản thân Realm tải thư viện gốc. Vì vậy, bạn cần phải di chuyển khởi tạo Realm trong một phương pháp mà sẽ không được gọi hoặc tốt hơn thử nó. Tìm cách tiếp cận https://github.com/Glucosio/glucosio-android/blob/develop/app/src/main/java/org/glucosio/android/GlucosioApplication.java –

+0

@EugenMartynov Nó sẽ không hoạt động như tôi đang gọi các phương thức 'realm' trong' oncreate' hoạt động của tôi, khái niệm nó sẽ không cho phép tôi gọi trước khi bắt đầu'realm' DB –

+2

Thông điệp của tôi là - Tốt để trừu tượng lớp lưu trữ của bạn từ lớp trình bày –

Trả lời

1

Kiểm tra out này

Đây là vấn đề mở mà Realm không hỗ trợ Robolectric (chưa).

Các vấn đề liên quan