AndroidRuntime引起:java.lang.unsatisfiedLinkError:无法加载tfp_jni:findLibrary返回null

Pat*_*cia 4 c++ java eclipse android android-ndk

所以,看起来有很多像我这样的问题,但不确定它们是否与我的问题有关.好.我有一个Android项目,它使用SDK作为引用库.SDK包含C++,所以我使用的是android-ndk-r9库.我在Android项目中引用的SDK是一个JNI库(Oooooo - 可怕的东西).哦是的,不要让我忘记提及armeabi-v7a(这似乎是另一个可怕的主题).执行此行时发生错误:

 System.loadLibrary("tfp_jni");
Run Code Online (Sandbox Code Playgroud)

tfp_jni实际上是我的SDK库项目的libs文件夹中的armeabi-v7a文件夹下的libtfp_jni.so文件.该SDK库项目包含Android.mk文件.我认为代码不会进入那里.但这是.mk文件的内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tfp-prebuilt
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libtfp_jni.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

然后在我的Android项目中,我有一个包含Android.mk和Application.mk的jni文件夹.以下是内容:

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_INSTALL_MODULES:=on
OPENCV_INSTALL_CAMERA:=off

include $(INNERID_ANDROID_ROOT)/Android.mk
include $(OPENCV_ANDROID_ROOT)/sdk/native/jni/OpenCV.mk
Run Code Online (Sandbox Code Playgroud)

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-14
Run Code Online (Sandbox Code Playgroud)

环境变量

环境变量

路径和符号 - 包括

路径和符号 - 包括

除源位置和输出位置(显示项目文件夹)外,所有其他选项卡均为空.

Android项目和偏好设置

Android项目和偏好设置

我已经尝试了Stackoverflow上类似问题的各种其他答案但没有成功.如果您还需要查看其他内容,请告知我们,我会尽快提供其他信息.

新图片

Imgur

更正!apk位于verify-demo-nolic项目/ bin文件夹中.Referenced Library tfp_java.jar是SDK库项目.您可以从Finder中看到.so文件位于库中.这有帮助吗?

Chr*_*ton 9

链接工作必须要做很多事情

  1. 必须将本机库编译为适合ABI的.so文件 - 这通常通过ndk-build脚本/批处理文件完成,但也可以使用生成的独立工具链完成.IDE项目可能希望将其作为自定义构建步骤进行配置.

  2. 本机库必须打包在应用程序.apk中.如果它是从应用程序项目目录下的jni /文件夹构建的,则ndk-build可能将其复制到项目的libs /文件夹的ABI适当子目录中. 但是,如果本机库属于不同的Android库,则可能需要执行额外的步骤.特别是,构建系统无法从库.jar获取 .so ,因此与库代码关联的一个必须通过在客户端项目的libs /文件夹下显式复制,或者通过引用库项目目录树找到(不是一个孤独的.jar)包括它.

  3. 设备上的安装程序必须确定.apk中包含的.so文件之一适用于设备的ABI(体系结构),并将其从.apk中复制到安装目录中以供使用.

  4. jni函数的运行时链接名称(任何编译器名称 - mangling的下游)必须与VM正在查找的名称相匹配.通常,这里的问题来自于未正确编码本机函数名中的java完全限定类名.该javah工具旨在帮助避免此类错误,但要小心,可以手动完成.

这些步骤中的每一步都存在潜在的故障,因此可以通过尝试找到.so文件丢失的第一阶段来调试未满足的链接.