Студия Android: UnsatisfiedLinkError: findLibrary возвращается null - загрузка исходной библиотеки

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

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, но ни одна из них не предоставляет решения для моей проблемы. У меня нет проблем с загрузкой собственной библиотеки, если это единственная библиотека, которую я использую...

Ответ 1

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

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

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

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

Ответ 2

defaultConfig {
    ...

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

}