由以下原因导致的AndroidRuntime:java.lang.UnsatifiedLinkError:Canned';无法加载tfp_jni:findLibrary返回null

由以下原因导致的AndroidRuntime:java.lang.UnsatifiedLinkError:Canned';无法加载tfp_jni:findLibrary返回null,java,android,c++,eclipse,android-ndk,Java,Android,C++,Eclipse,Android Ndk,所以,看起来有很多类似我的问题,但不确定是否有任何问题与我的问题有关。好啊我有一个Android项目,它使用SDK作为参考库。SDK包含C++,所以我使用的是ANDROID-NDK-R9库。我在Android项目中引用的SDK是一个JNI库(OOOO-Thank stuff)。哦,是的,别让我忘记提到armeabi-v7a(这似乎是另一个可怕的话题)。执行此行时发生我的错误: System.loadLibrary("tfp_jni"); tfp_jni实际上是SDK库项目libs文件夹中ar

所以,看起来有很多类似我的问题,但不确定是否有任何问题与我的问题有关。好啊我有一个Android项目,它使用SDK作为参考库。SDK包含C++,所以我使用的是ANDROID-NDK-R9库。我在Android项目中引用的SDK是一个JNI库(OOOO-Thank stuff)。哦,是的,别让我忘记提到armeabi-v7a(这似乎是另一个可怕的话题)。执行此行时发生我的错误:

 System.loadLibrary("tfp_jni");
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)
然后在我的Android项目中,我有一个jni文件夹,其中包含一个Android.mk和一个Application.mk。内容如下:

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
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-14
应用程序.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
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-14
环境变量

路径和符号-包括

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

Android项目和首选项

我尝试过Stackoverflow上类似问题的各种其他答案,但都没有成功。如果您还有什么需要看的,请告诉我,我会尽快提供更多信息

新图像


更正!apk位于验证演示nolic项目/bin文件夹中。引用的库tfp_java.jar是SDK库项目。您可以从Finder中看到.so文件位于libs中。这有帮助吗?

要使链接正常工作,必须做很多事情

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

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

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

  • jni函数的运行时链接名称(任何编译器名称混乱的下游)必须与VM正在查找的名称匹配。通常,这里的问题是由于没有在本机函数名中正确编码java完全限定类名。
    javah
    工具旨在帮助避免此类错误,尽管可以小心地手动完成


  • 这些步骤中的每一步都可能出现故障,因此调试不满意的链接时,可以尝试找到.so文件丢失的第一个阶段。

    .apk文件只是漂亮的zip文件,所以用zip文件工具打开.apk文件,看看.so文件是否进入了apk。@ChrisStratton-抱歉!apk在哪里?来自内存,可能在项目树下的bin/文件夹中,如果您最近完成了要安装的构建。@ChrisStratton-不,它不在那里。好的,现在我们必须找出原因。你运行ndk构建了吗?或者您正在使用一些花哨的前端工具来编译库并将其复制到项目树中?my.so文件在libs中,我该怎么做。我不明白,请帮忙。