【问题标题】:AndroidRuntime Caused by: java.lang.unsatisfiedLinkError: Couldn't load tfp_jni: findLibrary returned nullAndroidRuntime 引起:java.lang.unsatisfiedLinkError:无法加载 tfp_jni:findLibrary 返回 null
【发布时间】:2013-09-24 21:24:03
【问题描述】:

所以,看起来有很多像我这样的问题,但不确定它们中的任何一个都与我的问题有关。好的。我有一个使用 SDK 作为引用库的 Android 项目。 SDK 包含 C++,所以我使用的是 android-ndk-r9 库。我在我的 Android 项目中引用的 SDK 是一个 JNI 库(Oooooo - 可怕的东西)。哦,是的,别让我忘记提到 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

Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-14

环境变量

路径和符号 - 包括

除了显示项目文件夹的源位置和输出位置之外,所有其他选项卡都是空的。

Android 项目和首选项

我尝试了 Stackoverflow 上类似问题的各种其他答案,但均未成功。如果您还有其他需要查看的内容,请告诉我,我会尽快提供更多信息。

新图片

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

【问题讨论】:

  • .apk 文件只是花哨的 zip 文件,因此请使用 zip 文件工具打开 .apk 文件并查看 .so 文件是否正在进入 apk。
  • @ChrisStratton - 对不起! apk 在哪里?
  • 从内存中,也许在项目树下的 bin/ 文件夹中,如果您最近完成了构建安装。
  • @ChrisStratton - 不,它不存在。
  • 好的,现在我们必须找出原因。你运行 ndk-build 了吗?或者您是否正在使用一些花哨的前端工具来编译库并将其复制到项目树中?

标签: java android c++ eclipse android-ndk


【解决方案1】:

要使链接起作用,必须发生许多事情

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

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

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

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

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

【讨论】:

  • 我的 .so 文件在库中,我该怎么办。没看懂,求帮助。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 2012-12-02
  • 1970-01-01
  • 2014-10-26
  • 2015-05-02
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多