java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

Есть ли у кого-то опыт с этой ошибкой?

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liborg.swig.simple.example.so" 

Ошибка при загрузке библиотеки таким образом.

 static { System.loadLibrary("example"); } 

Я уверен, что ‘example’ class существует в текущей папке.

Обратите внимание, что существует соглашение об именах. Ваш lib нужно называть libexample.so.

LoadLibrary («пример») будет искать libexample.so.

Библиотека .so должна находиться внутри apk под папкой lib (так как вы разрабатываете для Android, она должна находиться под папками lib / armeabi и lib / armeabi-v7a – почему обе папки: некоторые версии Android выглядят под lib / armeabi, а некоторые смотрят под lib / armeabi-v7a … se, что работает для вас).

Другие вещи, которые нужно искать:

  • убедитесь, что вы скомпилируете для правильной архитектуры (если вы компилируете для armeabi v5, это не будет работать на armeabiv7 или armeabiv7).

  • убедитесь, что экспортированные прототипы используются в правильном classе (проверьте пример hello jni. Ваши открытые функции должны выглядеть примерно как Java_mypackagename_myjavabridgeclass_myfunction).

Например, функция Java_com_example_sample_hello будет транслировать в java-classе com.example.sample, функцию hello.

Это помогло мне. Разделите его для кого-то, у кого может возникнуть такая же проблема.

 android { .... defaultConfig { .... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } } } 

Для меня работала папка jniLibs в «основной» папке, помимо папок «java» и «res», например project -> app -> src -> main -> jniLibs

У меня были все библиотеки с правильными именами, и каждый из них помещался в их подпапку соответствующей архитектуры, но у меня все же было то же исключение; даже попробовал много других ответов SO, таких как принятый ответ здесь, компиляция JAR с .so libs, другое размещение папки jniLibs и т. д.

Для этого проекта мне пришлось использовать Gradle 2.2 и Android Plugin 1.1.0 на Android Studio 1.5.1

Я использую Android Studio 3.0 и сталкиваюсь с этой проблемой. И я уверен, что приложение build.gradle в порядке.

Перейдите в Run -> Edit Configurations -> Profiling и отключите «Enable advanced profiling».

Это работает для меня. Справочный ответ

В настоящее время я работаю над Android-приложением, которое транслирует радио. Я использую встроенную библиотеку декодера, которая называется aacdecoder. Все было нормально, пока приложение не получило ошибку при сбое на некоторых устройствах Android. Это было очень неприятно. Потому что приложение прекрасно воспроизводит радиоstreamи практически на всех устройствах, кроме Samsung S6 и S6 Edge.

В отчете о сбоях говорится, что

 Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find “libaacdecoder.so” at java.lang.Runtime.loadLibrary(Runtime.java:366) at java.lang.System.loadLibrary(System.java:988) at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187) 

Как вы видите, крах говорит, что он не может загрузить собственную библиотеку. Но почему? Прежде всего, я проверил свою структуру, если файлы исходной библиотеки .so правильно расположены.

Кажется, все было в порядке, кроме этой сумасшедшей ошибки. Затем, после некоторых исследований, я узнал, что некоторые устройства Android имеют 64-разрядные процессоры. Эти устройства генерируют и проверяют папку arm64 для загрузки собственной библиотеки. Это была проблема. Потому что у моего проекта нет папки arm64. Вот решение;

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

Вам необходимо добавить эти фильтры (abiFilters) в файлы build.gradle вашего модуля приложения. Поэтому, когда ваше устройство попытается запустить ваше приложение, оно проверит файл gradle и поймет, что он не должен генерировать какую-либо папку и использовать существующие ресурсы родной библиотеки. Бум, почти решил. Но все же есть еще одна вещь.

 android.useDeprecatedNdk=true 

Добавьте эту строку в свой файл gradle.properties, чтобы использовать устаревший Ndk.

Наконец, мое приложение работает на S6 и S6 Edge. Я имею в виду, что он работает на всех устройствах с новыми 64-разрядными процессорами.

Некоторые старые инструменты gradleации не могут скопировать файлы .so в папку сборки каким-то образом, вручную скопировав эти файлы в папку сборки, как показано ниже, можно решить проблему:

 build/intermediates/rs/{build config}/{support architecture}/ 

build config: beta / production / sit / uat

архитектура поддержки: armeabi / armeabi-v7a / mips / x86

Это сработало для меня

Если у вас есть файл .so в armeabi, тогда укажите внутри ndk эту папку.

 defaultConfig { applicationId "com.xxx.yyy" minSdkVersion 17 targetSdkVersion 26 versionCode 1 versionName "1.0" renderscriptTargetApi 26 renderscriptSupportModeEnabled true ndk { abiFilters "armeabi" } } 

и затем используйте это

 android.useDeprecatedNdk=true; 

в файле gradle.properties

-if невозможно использовать gradle.properties, тогда сначала добавьте этот файл и добавьте android.useDeprecatedNdk=true

Использовать этот код в build.gradle

 defaultConfig { applicationId 'com.example.application' minSdkVersion 16 targetSdkVersion 21 versionCode 11 versionName "1.1" ndk { abiFilters "armeabi" } } 

`

Если вы используете модуль с кодом c ++ и имеете такую ​​же проблему, вы можете попробовать

Build -> Refresh Linked C++ Projects

Кроме того, вы должны открыть какой-либо файл из этого модуля и сделать

Build -> Make module "YourNativeLibModuleName"

Что мне помогло – зарегистрировать исходный каталог для jni-файлов в файле build.gradle. Добавьте это в свой файл gradle:

 android { sourceSets { main { jniLibs.srcDir '[YOUR_JNI_DIR]' // ie 'libs' } } } 

Если вы используете студию Android, просто отредактируйте gradle.properties в корневой папке и добавьте android.useDeprecatedNdk = true. Затем отредактируйте файл build.gradle в папке вашего приложения, установите abiFilters, как показано ниже:

 android { .... defaultConfig { .... ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } } } 

System.loadLibrary загружает общую библиотеку из папки lib .

Что вы имеете в виду, говоря: «Я уверен, что« пример »существует в текущей папке? Вы должны поместить свою библиотеку .so в папку lib .

Для меня проблема заключалась в том, что NDK_ROOT не был установлен.

Проверьте консоль, если:

NDK_ROOT = None [!] NDK_ROOT не определен. Укажите NDK_ROOT в своей среде или в local.properties

Проверьте, установлены ли вы:

  • NDK_ROOT и SDK_ROOT в C / C ++ -> Build-> Environment
  • Android-> NDK
  • Android-> SDK

Это может быть связано с устройством.
Я получал эту ошибку только на устройствах MI , код работал со всеми другими устройствами.

Это может помочь:

  defaultConfig{ ... externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" } } } 

Еще одна причина аварии и возможное решение описаны в этой статье: https://medium.com/keepsafe-engineering/the-perils-of-loading-native-libraries-on-android-befa49dce2db

Кратко:
в build.gradle

 dependencies { implementation 'com.getkeepsafe.relinker:relinker:1.2.3' } 

в коде

 static { try { System.loadLibrary(""); } catch (UnsatisfiedLinkError e) { ReLinker.loadLibrary(context, ""); } } 
  • Android Studio: адаптируемая папка: как разместить изображения для нескольких точек на дюйм?
  • setEmptyView в ListView не показывает его вид в приложении для Android?
  • Как написать изогнутый текст?
  • Как периодически проверять подключение к Интернету в целом приложении?
  • Как добавить переключатель в панель действий Android?
  • значок в меню не отображается в android
  • Как установить пользовательский шрифт в заголовке ActionBar?
  • Вызов собственного метода дважды из сторонней библиотеки в Activity приводит к закрытию приложения Android
  • Как использовать asynctask для отображения индикатора выполнения, который учитывается?
  • Android: Как отслеживать происхождение InflateException?
  • «Требуется Gradle Version 2.10». Ошибка
  • Давайте будем гением компьютера.