UnsatisfiedLinkError для sqlcipher с робототехникой
Привет я использую активный андроид с sqlcipher intigrated для шифрования базы данных. Работает нормально. Я могу создать приложение с зашифрованной базой данных. Сейчас я использую робототехнику для тестовых случаев. И это дает мне ошибку при ошибке связывания. Я обновил свою версию Gradle. Так что я не включаю любые.so файлы. Вместо этого я использую
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)
В связи с https://groups.google.com/forum/ robolectic использует JVM для моделирования дел. и он не будет поддерживать.so файлы. Для этих случаев необходимо сделать либо на устройстве или эмуляторе. Как решить эту проблему? Нужна помощь.
2 ответа
Несколько вещей:
- Если вы хотите проверить класс, который опирается на библиотеку.so (давайте назовем ее
NativeClass
) - это не сработает. - Если вы хотите проверить класс, который полагается
NativeClass
- использоватьinterface
Вместо того, чтобы использоватьNativeClass
непосредственно, а затем издеваться над этим интерфейсом.
Вы должны правильно импортировать sqlcipher в ваш проект Android.
1) Создайте папку jniLibs в Project\app\src\main... Она должна выглядеть так 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
}
}
Скомпилируйте ваш проект. Может быть, проект тоже чистый. Надеюсь, это поможет! Пожалуйста, скажите мне, если вам нужна дополнительная помощь!
РЕДАКТИРОВАТЬ: Может быть, попробуйте добавить файл.so в libs \ armeabi \ sqlcipher.so