Android JNA UnsatisfiedLinkError: собственная библиотека (com/sun/jna/xxx/libjnidispatch.so) не найдена

Эй, я пытаюсь настроить проект студии Android с привязками JNA и libvirt java.

Вот так выглядит структура проекта на данный момент.

введите описание изображения здесь однако решение не сработало для меня

Это пока тестируется, а не эмулятор, и двоичные файлы руки еще не были импортированы.

При попытке использовать метод Connect в привязках Java libvirt я получаю эту ошибку.

Существует очень похожий пост здесь

11-18 23:54:37.584 4182-4182/com.local.test E/AndroidRuntime: FATAL EXCEPTION: main
                                                           Process: com.local.test, PID: 4182
                                                           java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-x86/libjnidispatch.so) not found in resource path (.)
                                                               at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:1039)
                                                               at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:999)
                                                               at com.sun.jna.Native.<clinit>(Native.java:191)
                                                               at com.sun.jna.Native.loadLibrary(Native.java:625)
                                                               at org.libvirt.jna.Libvirt.<clinit>(Unknown Source)
                                                               at org.libvirt.Library.<clinit>(Unknown Source)
                                                               at org.libvirt.Connect.<init>(Unknown Source)
                                                               at com.local.haris.MainActivity.onCreate(MainActivity.java:34)
                                                               at android.app.Activity.performCreate(Activity.java:6662)
                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
                                                               at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                               at android.os.Looper.loop(Looper.java:154)
                                                               at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

Примечания: Android studio 3.0 Не имеет установленного c++ SDK (не думал, что мне это нужно, так как я не компилирую двоичные файлы). Если я не уверен, работает ли libvirt java jar на Android. Я пытался найти информацию об этом, но не смог. Если бы кто-то мог прокомментировать это, он был бы признателен.


person Maclaren    schedule 19.11.2018    source источник
comment
Вы ориентируетесь на устройство Android с платформой x86 или платформой на базе ARM?   -  person ecle    schedule 11.12.2018


Ответы (3)


Включите общую библиотеку libjnidispatch.so для всех ABI Android, которые поддерживает ваш проект.

  • Перейдите к библиотекам JNA.
  • Для версии 4.5.0 скачайте zip-архив
  • Разархивируйте пакет, перейдите в каталог jna-4.5.0/dist/. libjnidispatch.so для разных ABI можно извлечь из соответствующего jar-файла. Отображение показано ниже в таблице ниже.

    | JNA ABI             | Android ABI   |
    | ------------------- | ------------- |
    | android-aarch64.jar | arm64-v8a     |
    | android-armv7.jar   | armeabi-v7a   |
    | android-x86-64.jar  | x86_64        |
    | android-x86.jar     | x86           |
    
  • Поместите libjnidispatch.so в сопоставленную папку Android ABI, например, arm64-v8a, armeabi-v7a, x86 и x86_64.
person shizhen    schedule 13.02.2019

хотя с момента возникновения вопроса прошло много дней, я обнаружил, что добавление следующего решит проблему (конечно, используйте версию по вашему выбору):

implementation 'net.java.dev.jna:jna:5.8.0@aar'
person koby hershkovitz    schedule 15.06.2021

Ответ Коби Хершковица о простом добавлении @aar приводит к дублированию классов:

Duplicate class com.sun.jna.AltCallingConvention found in modules jetified-jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jetified-jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
Duplicate class com.sun.jna.Callback found in modules jetified-jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jetified-jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
Duplicate class com.sun.jna.Callback$UncaughtExceptionHandler found in modules jetified-jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jetified-jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
Duplicate class com.sun.jna.CallbackParameterContext found in modules jetified-jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jetified-jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
Duplicate class com.sun.jna.CallbackProxy found in modules jetified-jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jetified-jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
...

Чтобы исправить это, используйте @aar для любой библиотеки, которая также нуждается в jna, в противном случае gradle дважды подтянет библиотеку JNA.

person Dan Merillat    schedule 22.06.2021