当前位置: 首页 > 知识库问答 >
问题:

unsatisfiedLinkError:从JNI_OnLoad返回JNI_ERR

辛承志
2023-03-14

我正在开发一个包含本机代码的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)

当我使用ndk-build脚本编译jni文件夹时,所有操作都很正常,但在调用时会出现以下错误:

  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文件夹和每个libaries: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在我的情况?

事先谢谢你的帮助

共有1个答案

程智明
2023-03-14

我终于解决了我的问题。这是因为libqt5core.so文件

实际上,这个库实现了JNI_OnLoad()函数,它尝试在该函数中加载外部jar文件中包含的一些java类。

为了解决我的问题,我在/libs中包含了正确的jar文件

 类似资料:
  • 问题内容: 如何从作为Tkinter回调执行的函数中获取返回的对象? 显然,这是一个简化的示例。实际上,按钮调用的函数将返回对象,我希望将这些对象附加到将保留在主Python名称空间中的对象列表中,以进行进一步的操作。 无论如何,在这里用户可以使用GUI选择该函数的自变量,然后按下将执行该函数的按钮。但是,该函数的返回值似乎注定会丢失给以太,因为回调函数将不接受返回值。在不使用丑陋的定义的情况下可

  • 问题内容: 这是一个非常基本的请求-响应测试。浏览器使用jQuery $ .ajax API将“来自浏览器的hello”发送到servlet,然后servlet接收此消息,然后使用org.json.simple库创建一个JSON对象,并将带有消息“ hello from server”的JSON响应发送回浏览器。 我在本地主机上运行它,只是假设我的IP地址是123.123.12.123,平台是Ub

  • 问题内容: 我试图做这样的事情: 我认为味精将被设置为my_script.php返回的文本,即jqXHR对象的responseText。由于msg始终设置为“ [object XMLHttpRequest]”,因此显然无法正常工作 有一种快速的1行方法可以做我想要的吗? 谢谢。 问题答案: 经过一些测试,我最终找到了解决方案。 我需要同步调用,$ .get速记函数始终是异步的,因此我将需要使用$

  • 问题内容: 我想使用这样的Promise来调用Google Maps Geocoding API: 当我调用函数请求时,我发现我得到了一个Promise而不是一个值: 为什么不答应。然后在返回值之前执行?我如何从这个承诺而不是另一个承诺中获得价值? 问题答案: 如果您依赖承诺来返回数据,则必须从函数中返回承诺。 一旦调用堆栈中的1个函数异步,那么要继续线性执行,所有要调用它的函数也必须异步。(异步

  • 问题内容: 问题答案: 有很多原因不回来。 但这通常归结为以下事实:执行的命令不会退出。 同样,这可能有很多原因。 一个普遍的原因是该过程产生了一些输出,而你没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待你的进程继续读取。你的进程依次等待另一个进程完成(之所以不会,是因为它等待你的进程,…)。这是一个典型的僵局情况。 你需要不断从流程输入流中读取内容,以确保它不会被阻塞。

  • 问题内容: 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 问题答案: 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它将结果作为参数接收到的队列中。父母可以或愿意。 队列通常是在Python中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!