2014-11-28 4 views
31

Есть ли у кого-то опыт с этой ошибкой?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"); 
} 

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

ответ

31

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

LoadLibrary ("example") будет искать libexample.so.

Библиотека .so должна находиться внутри 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.example.sample, функция привет.

+0

Я загрузил этот пример http://www.swig.org/Doc2.0/Android.html#Android_examples_intro Мой CBU/ABI - armeabi-v7a Есть ли какое-нибудь решение? – developergg

+0

Если вы новичок в jni, используйте пример google: https://code.google.com/p/awesomeguy/wiki/JNITutorial. Мне лично не нравится свинг, я не использую его. Swig добавит дополнительный уровень сложности в ваш код, и, поскольку вы не полностью понимаете концепцию jni, лучше сначала избегать его (swig генерирует для вас вещи ... вам нужно знать, что это за вещи и как они используются, прежде чем вы сможете в полной мере воспользоваться преимуществами того, что предлагает swig;)) – MichaelCMS

+0

У меня нет выбора. Поскольку мой клиент предоставляет мне C++-функцию, которую я должен вызывать из своего java-кода. – developergg

0

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

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

+0

Я имею в виду 'пример' класс существует в текущей папке. Так должен ли я копировать класс класса в папку lib? – developergg

+0

@developergg System.loadLibrary загружает библиотеку C++ .so, вы не можете использовать ее для загрузки классов Jaca ... – Suvitruf

+0

Есть способ. Я использую swig так, чтобы это возможно – developergg

0

Для меня проблема была в NDK_ROOT не установлена.

Проверьте вашу консоль, если: [!]

NDK_ROOT = None NDK_ROOT не определен. Уточнитните NDK_ROOT в среде или в local.properties

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

  • NDK_ROOT и SDK_ROOT в C/C++ -> Build-> Окружающая среда
  • Android-> NDK
  • Android-> SDK
4

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

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

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

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

+1

Странно, может быть, это ошибка Android Studio? То же самое с ** jniLibs ** папкой. –

9

То, что сработало для меня было поместить папку jniLibs под «главной» папке, только кроме «Явы» и «рес» папкам, например, проект -> приложения -> src -> main -> jniLibs

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

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

14

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

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

Это не объясняет, почему это вам помогло. Я столкнулся с указанной проблемой и уже установил ** abiFilters **. –

+0

Спасибо, у меня был только «armeabi», и мне было интересно, почему libC++ _ shared.so в моей библиотеке armeabi-v7a не может быть найден !! Ничего себе, без указателя Идк, как я мог видеть это сам. – TastyCatFood

+0

Это помогло мне, я до сих пор не знаю, почему это работает. но спасибо! –

1

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

Перейти к работе -> Изменить конфигурации -> Профилирование и отключить «Включить расширенное профилирование».

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

0

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

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

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

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

+1

Спасибо, решает мою проблему –

+1

спасибо! это было единственное решение, которое сработало для меня –

2

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

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

1

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

Build -> Refresh Linked C++ Projects

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

Build -> Make module "YourNativeLibModuleName"

0

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

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

-Если gradle.properties не доступна, то первым добавить файл и добавить android.useDeprecatedNdk=true

-use это код в build.gradle

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

`