Подтвердить что ты не робот

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 существует в текущей папке.

4b9b3361

Ответ 1

Обратите внимание, что существует соглашение об именах. Ваш 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).

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

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

Ответ 2

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

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

Ответ 3

Что сработало для меня, так это разместить папку 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

Ответ 4

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

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

build config: beta/production/sit/uat

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

Ответ 5

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

android.useDeprecatedNdk=true

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

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

Ответ 6

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

Перейдите в Run → Edit Configurations → Profiling и отключите "Enable advanced profiling".

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

Ответ 7

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

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

Ответ 8

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

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

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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