Intereting Posts
Пользовательская сборка Android с использованием Ant Android – Невозможно создать экземпляр активности – ClassNotFound – Сбой на одном затмении, но не другой Виджет поиска на панели действий не запускает мою активность поиска Будет ли локальный обработчик с postDelayed получать мусор, собранный до вызова runnable Проект Ripple Emulator + android с помощью PhoneGap Android – Как показать диалог после завершения деятельности Не удалось загрузить изображения при публикации моего приложения для Android Просто запустил Java, должен ли я продолжить с 7 или 6, чтобы код для Android? Как найти нетранслированные строки? (андроид) Как добавить файлы на SD-карту в эмулятор Android? Закрыть полноэкранный режим Youtube Player на задней кнопке внутри фрагмента Как получить события за последние 24 часа с помощью SQLite? Изменение цвета метки метки предпочтений Когда запрашивать разрешения с помощью Android Android SDK 3.0? Простая структура XML для android, атрибут класса

Не найдена зависимость исходной библиотеки Android

В моем проекте Android Studio я использую стороннюю библиотеку (которую я не могу редактировать), которая требует нескольких родных библиотек. Когда я обращаюсь к этой сторонней библиотеке в своем приложении, я получаю следующую ошибку:

java.lang.UnsatisfiedLinkError: Couldn't load avutil-52 from loader dalvik.system.PathClassLoader [dexPath=/data/app/com.myApp.debug.apk, libraryPath=/data/app-lib/com.myApp.debug]: findLibrary returned null 

Я использую Android Studio 1.2.2, поэтому Gradle поддерживает использование jniLibs-папки. Файл сборки Gradle указывает папку jniLibs для безопасности:

 android { sourceSets { main { java { srcDir 'src/main/src' } jniLibs { srcDirs 'src/main/jniLibs' } } } 

}

И здесь у меня есть мои библиотеки:

 src/main/jniLibs/armeabi/*.so 

В эту папку входят некоторые другие библиотеки, которые работают в приложении, поэтому я знаю, что папка включена.

Когда я проверяю сгенерированный APK, все файлы * .so включены в папку libs. Однако, когда я проверяю установленное приложение, я нахожу только три из ожидаемых шести библиотек:

 adb shell ls /data/app-lib/com.myApp first.so second.so third.so 

Я также проверил папку /data/data/com/myApp.debug/app_lib/ , и ни одна из трех других зависимостей не существует.

Не являясь родным разработчиком Android, я нахожу это очень загадочным. Что может быть причиной включения некоторых зависимостей, а другие – исключения? Есть ли способ заставить Android распознать три недостающих файла и убедиться, что они установлены? Разумеется, без необходимости редактировать библиотеку сторонних разработчиков, которая их использует.

EDIT 1:

Может ли этот код из сторонней библиотеки вызвать проблему?

 public StartFunction() { String arch = System.getProperty("os.arch"); this.ARM = arch.toUpperCase().contains("ARM") || arch.toUpperCase().contains("AARCH64"); if(this.ARM) { this.LoadLibraries(); } } private void LoadLibraries() { System.loadLibrary("first"); System.loadLibrary("second"); System.loadLibrary("third"); System.loadLibrary("fourth"); System.loadLibrary("fifth"); System.loadLibrary("sixth"); } 

EDIT 2:

Это полное исключение из logcat. Названия пакетов слегка изменены для защиты виновных.

  06-30 09:19:08.505 15069-15069/com.myApp.debug E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.myApp.debug, PID: 15069 java.lang.UnsatisfiedLinkError: Couldn't load avutil-52 from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.myApp.debug-1.apk,libraryPath=/data/app-lib/com.myApp.debug-1]: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:358) at java.lang.System.loadLibrary(System.java:526) at com.thirdPartyApp.embedded.Call.LoadLibraries(Call.java:289) at com.thirdPartyApp.embedded.Call.<init>(Call.java:214) at com.thirdPartyApp.embedded.thirdPartyCall$29.run(thirdParty.java:963) at com.thirdPartyApp.embedded.DownloadFile.onPostExecute(DownloadFile.java:56) at com.thirdPartyApp.embedded.DownloadFile.onPostExecute(DownloadFile.java:16) at android.os.AsyncTask.finish(AsyncTask.java:632) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5487) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) 

ИЗМЕНИТЬ 3:

Мне удалось заставить это работать, но каким-то грязным способом. Я точно не знаю, почему это произошло, но я знаю, что произошло:

У меня было все шесть скомпилированных библиотек, необходимых стороннему SDK, который я использую, размещенный в src/main/jniLibs/armeabi . Обычная мудрость диктует, что это должно работать на всех устройствах ARM. Однако при установке приложения на устройстве ARM были установлены только три из шести библиотек.

Грязное решение: поместите все шесть библиотек в папку src/main/jniLibs/armeabi-v7a . Этот подход, основанный на рассеянии, означает, что все шесть библиотек установлены и доступны.

Я обновлю это, когда мы выясним, почему это произошло.