2015-01-26 5 views
9

Я делаю приложение в Android Studio, которое использует две библиотеки. Собственная библиотека с оберткой для Android и jar-library. По какой-то причине родная библиотека не загружается, если другая библиотека jar скомпилирована в проект. Поэтому, если я запускаю приложение только с родной библиотекой, все работает нормально. Добавить другую банку-библиотека для моего Gradle-файла и бум ... в UnsatisfiedLinkError:Студия Android: UnsatisfiedLinkError: findLibrary возвращается null - загрузка родной библиотеки

java.lang.UnsatisfiedLinkError: Couldn't load MobileOcrEngine from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.app-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.app-1, /vendor/lib, /system/lib]]]: findLibrary returned null 

Мое приложение работает нормально, когда я использую это:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
} 

Ошибка возникает при попытке:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
    compile files('libs/realm-0.78.0.jar') 
} 

или когда я пытаюсь использовать ту же библиотеку, но с помощью репозитория Maven:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
    compile 'io.realm:realm-android:0.78.0' 
} 

или если я пытаюсь поставить банку в папку jniLibs:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs') 
    compile 'com.android.support:support-v13:21.0.2' 
    compile project(':wheel') 
} 

Я понятия не имею, где корень проблемы лежит. С одной из двух библиотек, Android Studio или я делаю что-то неправильно?

Примечание: Я знаю, что было много вопросов по StackOverflow относительно UnsatisfiedLinkErrors, но ни один из них не обеспечивают решения моей проблемы. У меня нет проблем с загрузкой родной библиотеки, если это единственная библиотека, которую я использую ...

ответ

15

Я нашел проблему. В другой банке я хотел добавить внутренне используемую библиотеку C++ с поддержкой armeabi, armeabi-v7a, x86 и mips. В корневой библиотеке, которую я использовал все это время, поддерживается только armeabi.

Устройство, которое я использую для тестирования, является устройством armeabi-v7a. Все это время, когда я использовал собственную библиотеку, устройство проверило библиотеку в armeabi-v7a моего каталога libs. Если он не может найти его там, он попытается найти каталог armeabi.

Когда я загружаю другую банку с поддержкой 4 различных архитектур, устройство загружает библиотеку armeabi-v7a. Поскольку он нашел библиотеку armeabi-v7a для фляги, она попытается загрузить собственную библиотеку для той же архитектуры. Если библиотека не была найдена, она не будет проверять каталог armeabi как резервную копию, поэтому findLibrary возвращает null, следовательно UnsatisfiedLinkError.

Я решил это, создав каталог для архитектуры armeabi и скопировав в нее .so-библиотеку каталога armeabi-v7a.

+0

Не мог бы вы объяснить, как сделать ваше решение –

+4

В каталоге jniLibs, есть подкаталог для обоих armeabi и armeabi-v7a. Скопируйте свою библиотеку так, чтобы она отображалась в обеих архивах (armeabi и armeabi-v7a). – Skywalker10

+0

Отличный ..! Работал для меня .. Большое спасибо .. –

0
defaultConfig { 
    ... 

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

} 
+3

Не могли бы вы дать хоть малейшее объяснение, почему кто-то должен скопировать этот код в свое приложение? –

Смежные вопросы