2016-12-08 8 views
1

안녕하세요 저는 데이터베이스 암호화를 위해 sqlcipher가 활성화 된 활성 안드로이드를 사용하고 있습니다. 잘 작동합니다. 암호화 된 데이터베이스로 응용 프로그램을 만들 수 있습니다. 이제 나는 테스트 케이스를 위해 robolectic을 사용하고있다. 그리고 그것은 오류 연결에 오류를 제공하고 있습니다. 내 grad 버전을 업데이트했습니다. 그래서 나는 .so 파일을 포함하고 있지 않다. 그 대신의 나는 오류 다음 얻고있다robolectric와 sqlcipher에 대한 UnsatisfiedLinkError

ndk { 
     abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
    } 

을 사용하고 있습니다 :

java.lang.UnsatisfiedLinkError: no sqlcipher in java.library.path 

    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:870) 
    at java.lang.System.loadLibrary(System.java:1122) 
    at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:196) 
    at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:189) 
    at com.example.android.testing.unittesting.BasicSample.SampleApplication.onCreate(SampleApplication.java:20) 
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:141) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:171) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:47) 
    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:137) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 


java.util.ServiceConfigurationError: org.robolectric.internal.ShadowProvider: Provider org.robolectric.shadows.multidex.Shadows not a subtype 

    at java.util.ServiceLoader.fail(ServiceLoader.java:239) 
    at java.util.ServiceLoader.access$300(ServiceLoader.java:185) 
    at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376) 
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) 
    at java.util.ServiceLoader$1.next(ServiceLoader.java:480) 
    at org.robolectric.internal.bytecode.InstrumentationConfiguration$Builder.build(InstrumentationConfiguration.java:151) 
    at org.robolectric.RobolectricTestRunner.createClassLoaderConfig(RobolectricTestRunner.java:115) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:169) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:47) 
    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:137) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Accounding https://groups.google.com/forum/#!topic/sqlcipher/i_Gw-7d8DpU에 robolectic하는 경우를 시뮬레이션하기위한 JVM을 사용합니다. .so 파일은 지원하지 않습니다. 장치 또는 에뮬레이터 중 하나를 수행해야하는 경우를 방지하려면 이 문제를 해결하는 방법은 무엇입니까? 도움이 필요해.

답변

1

몇 가지 : 당신이 .so를 라이브러리에 의존 클래스를 테스트하려면

  1. (의이 NativeClass를 부르 자) - 문제가 해결되지 않습니다.
  2. NativeClass에 의존하는 클래스를 테스트하려면 NativeClass을 직접 사용하는 대신 interface을 사용하고 해당 인터페이스를 모의 해보십시오.
0

올바르게 sqlcipher를 Android 프로젝트로 가져와야합니다.

1) 폴더를 만듭니다 jniLibs 프로젝트에서 \ 응용 프로그램 \ SRC \ 주 ... 이들의 Project\app\src\main\jniLibs\

2) 이제 올바른 폴더 아래에있는 sqlcipher.so 파일을 넣어 (하나처럼 보이게한다) :

Project\app\src\main\jniLibs\armeabi\sqlcipher.so 
Project\app\src\main\jniLibs\armeabi-v7a\sqlcipher.so 
Project\app\src\main\jniLibs\mips\sqlcipher.so 
Project\app\src\main\jniLibs\x86\sqlcipher.so 

3) 이제 정적 가져 오기를 사용하려는 클래스의 모든 위치에이 라이브러리에 추가하십시오.

static { 
     try { 
      //Libraryname without .so!! 
      System.loadLibrary("sqlcipher"); 
     } 
     catch(UnsatisfiedLinkError ex) 
     { 
      //Not found 
     } 
    } 

프로젝트를 컴파일하십시오. 어쩌면 프로젝트도 깨끗합니다. 도움이 되었기를 바랍니다. 더 많은 도움이 필요하면 알려주세요!

편집 : 아마 \ armeabi \

sqlcipher.so libs와 아래에있는 .so는 파일을 추가하려고