【发布时间】: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