android — 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");
}

Я уверен, что «пример» класса существует в текущей папке.

43

Решение

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

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

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

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

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

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

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

43

Другие решения

Это помогло мне. Поделиться этим для тех, кто может придумать ту же проблему.

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

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

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

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

10

В настоящее время я работаю над приложением для Android, которое транслирует радио. Я использую нативную библиотеку декодера, которая называется aacdecoder. Все было хорошо, пока приложение не получило ошибку сбоя на некоторых устройствах Android. Это было действительно раздражающим. Потому что приложение прекрасно воспроизводит радиопотоки практически на всех устройствах, кроме 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-битные процессоры.

9

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

Перейдите в Run -> Edit Configurations -> Profiling и отключите «Включить расширенное профилирование».

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

7

-если gradle.properties недоступно, то сначала добавьте этот файл и
добавлять
android.useDeprecatedNdk=true

-используйте этот код в build.gradle

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

`

6

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

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

Конфигурация сборки: бета / производство / сит / уат

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

5

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

Если у вас есть .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

4