Ява.ленг.UnsatisfiedLinkError: дальвик.система.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" существует в текущей папке.

15 ответов


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

LoadLibrary ("пример") будет искать libexample.Итак.

The .таким образом, библиотека должна быть внутри apk под папкой lib (поскольку вы разрабатываете для Android, она должна быть под папками lib/armeabi и lib/armeabi-v7a - почему обе папки ? некоторые версии Android выглядят под lib/armeabi, а некоторые-под lib / armeabi-v7a ... SE, что работает для вас ).

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

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

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

например, функция Java_com_example_sample_hello переведет в класс java com.образец.образец, функция Здравствуйте.


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

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

Что сработало для меня, так это разместить папку jniLibs под папка "main", помимо папок" java "и" res", например project -> app -> src -> main -> jniLibs

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

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


В настоящее время я работаю над 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)

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

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

defaultConfig {
    ...

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

}

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

android.useDeprecatedNdk=true

добавьте эту строку в свой gradle.свойства для использования устаревшего Ndk.

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


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

перейдите в Run - > Edit Configuration - > Profiling и отключите "включить расширенное профилирование".

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


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

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

конфигурация сборки: beta/production/sit / uat

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


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

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

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

`


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

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


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

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

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

Build -> Refresh Linked C++ Projects

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

Build -> Make module "YourNativeLibModuleName"


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

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

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

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


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

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

NDK_ROOT = нет [!] NDK_ROOT не определен. Пожалуйста, определите NDK_ROOT в вашей среде или в локальной.свойства

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

  • 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

кратко:
в строй.Gradle в

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

код

static {
    try {
        System.loadLibrary("<your_libs_name>");
    } catch (UnsatisfiedLinkError e) {
        ReLinker.loadLibrary(context, "<your_libs_name>");
    }
}