4

所以,看起来有很多像我这样的问题,但不确定它们中的任何一个都与我的问题有关。好的。我有一个使用 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。以下是内容:

安卓.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

应用程序.mk

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

环境变量

环境变量

路径和符号 - 包括

路径和符号 - 包括

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

Android 项目和首选项

Android 项目和首选项

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

新图片

伊姆古尔

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

4

1 回答 1

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

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

于 2013-09-25T20:09:19.883 回答