【问题标题】:Android Native library: Runtime error when trying to load JNI native libraryAndroid 本机库:尝试加载 JNI 本机库时出现运行时错误
【发布时间】:2017-09-29 17:56:20
【问题描述】:

我遇到的问题似乎与其他“无法加载本机库”问题类似。但是从我的想法来看,我的问题是由于无法在 API >= 24 中打开私有库。source。我正在运行 Android O。我的 JNI 库应该是本地的,因为它是生成的。

我收到运行时错误:

E linker  : library "/system/lib64/libnative_lib_jni.so" 
("/system/lib64/libnative_lib_jni.so") needed or dlopened by
"/system/lib64/libnativeloader.so" is not accessible for the namespace:  
[name="classloader-namespace"]

我确信我的 Java 代码、JNI 桥接器和 C++ 代码已正确实现。该库也被找到,但无法访问它,如错误所示。

消息来源只是说需要更新应用程序以避免这些错误,但没有任何解决办法。根据来源,可能是我生成的 JNI 库是私有的,因此给了我运行时错误,还是有其他原因导致错误。

在我的 .mk 文件中:

LOCAL_JNI_SHARED_LIBRARIES := libnative_lib_jni
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_MODULE := libnative_lib_jni
LOCAL_SRC_FILES:= \
$(call all-cpp-files-under, app/src/main/cpp)
include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

  • 尝试解压 .apk 以查看库是否可以到达那里,以及在 .apk 中找到的库文件的名称是否实际上是 libnative_lib_jni.so 。
  • .apk 中没有生成.so。它尝试从另一个目录打开 .so 文件。它是否必须在.apk 中,如果是,我如何让它在.apk 中生成?
  • 你能分享一下你用来加载Java库的代码吗?也许“lib”前缀会弄乱你的链接..
  • @RisKakaN .so 文件不必在 .apk 中,但如果不存在,您需要提供一种可靠的方式将 .so 传送到设备。将其包含在 .apk 中会使过程变得更加容易(尤其是如果您的应用程序使用 .so 时)。在您的 .mk 文件中尝试将 LOCAL_MODULE 值更改为“native_lib_jni”,并将 LOCAL_SRC_FILES 更改为 .so 的完整路径
  • @Markus java 代码应该没有问题。它只是一个包含 System.loadLibrary("native_lib_jni") 的静态块

标签: java android android-ndk java-native-interface


【解决方案1】:

经过数小时的调查、反复试验,我找到了解决方案。 因此,在 Android 24 及更高版本上,您无法从目标上的 /system 打开私有库,这在尝试让 JNI 在 Android O (API 26) 上工作时影响了我。

解决方案是将生成的 jni lib 移出 /system。我把它放在/data/...中,这不是系统。尽管您可能需要 root 访问权限才能访问此目录。但是,仅移动您的 jni lib 并不能解决问题,您还必须将 libc++.so 推送到同一位置。这个 libc++.so 应该在您的系统/lib64 中,无论是在目标上还是在 PC 上。我做了 adb push 从 pc 到目标。

最后你必须在 Java 代码中指定这个:

static {
    System.load("/data/.../libc++.so");
    System.load("/data/.../libnative_lib_jni.so");
}

重要提示:必须首先加载 libc++.so。

因此,通过使用 System.load(),您不再从共享库加载,而是现在它指向您放置库的位置。

注意:此文件夹结构位于目标上。所以我是从目标访问库,而不是从电脑访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多