java.lang.UnsatisfiedLinkError: JNI_ERR возвращен из JNI_OnLoad

Я разрабатываю приложение для Android, включая собственный код

Сначала я компилирую готовую библиотеку. Файл Android.mk — это project_path/jni/qt-library/Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := qt5Core-prebuilt
LOCAL_SRC_FILES := libQt5Core.so
LOCAL_EXPORT_C_INCLUDES += qtbase/include

include $(PREBUILT_SHARED_LIBRARY)

Затем я компилирую свою библиотеку, файл Android.mk которой находится в project_path/jni/my-library/Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := myLibrary
LOCAL_SRC_FILES := com_example_qtsignaux_Library.cpp
LOCAL_SRC_FILES += Receiver.cpp
LOCAL_SRC_FILES += Emitter.cpp
LOCAL_SRC_FILES += moc_Receiver.cpp
LOCAL_SRC_FILES += moc_Emitter.cpp

LOCAL_SHARED_LIBRARIES := qt5Core-prebuilt

LOCAL_C_INCLUDES += ../qt-library/qtbase/include

LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

Когда я компилирую папку jni с помощью скрипта ndk-build, все работает хорошо, но при вызове возникает следующая ошибка:

  static {
    System.loadLibrary("myLibrary");
  }

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.example.qtsignaux-1/lib/arm/libmyLibrary.so"

Обратите внимание, что я разархивировал папку apk и все библиотеки: libQt5Core.so, libmyLibrary.so и libgnustl_shared.so находятся в папках lib/armeabi/ и lib/armeabi-v7a/.

Мой файл Application.mk выглядит так:

APP_ABI += armeabi armeabi-v7a
APP_STL := gnustl_shared
APP_CPPFLAGS := -frtti -fexceptions 

Я не очень понимаю, что означает ошибка и почему система пытается загрузить библиотеку в папку application_package_name/lib/arm. Эта папка действительно существует или это просто armeabi и armeabi-v7a в моей ситуации?

Заранее спасибо за вашу помощь


person suns9    schedule 04.04.2016    source источник
comment
Ошибка означает, что ваша библиотека определила функцию JNI_OnLoad и вернула из нее JNI_ERR. Если вы не определили функцию JNI_OnLoad, вам нужно выяснить, откуда она извлекается и почему она может дать сбой.   -  person fadden    schedule 05.04.2016
comment
Привет, Фадден, спасибо за ответ. Я до сих пор не понимаю, потому что у меня есть только одна функция в моей библиотеке с именем startTest()   -  person suns9    schedule 05.04.2016


Ответы (1)


Наконец-то я исправил свою проблему. Это было из-за файла libQt5Core.so

Действительно, эта библиотека реализует функцию JNI_OnLoad(), в которой она пытается загрузить некоторые классы Java, содержащиеся во внешнем файле jar.

Чтобы решить мою проблему, я включил правильный файл jar в /libs

person suns9    schedule 06.04.2016
comment
Какая это баночка? - person Matferib; 06.04.2018
comment
Привет, Матфериб, это была одна из этих библиотек: QtAndroid-bundled.jar cessibility-bundled.jar QtAndroidBearer-bundled.jar QtAndroidBluetooth-bundled.jar QtAndroidWebView-bundled.jar QtMultimedia-bundled.jar QtPositioning-bundled.jar QtSensors-bundled.jar Я получил их из исходников Qt - person suns9; 09.04.2018
comment
Круто, мое приложение все еще падает после того, как я вызываю QApplication. Используете ли вы android_ndk_glue (например, чистый код C++) или создаете активность в java? - person Matferib; 10.04.2018
comment
Я создаю активность в java и инициализирую часть С++, загружая файлы .so. - person suns9; 13.04.2018