我遇到的问题似乎与其他“未能加载本机库”问题类似。但是从我提出的问题来看,我的问题是由于无法在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)
答案 0 :(得分:1)
经过数小时的调查,试验和错误,我找到了解决方案。 因此,在Android 24及更高版本上,您无法在目标上打开来自/ system的私有库,这在尝试让JNI在Android O(API 26)上运行时影响了我。
解决方案是将生成的jni lib移出/ system。我把它放在/ data / ...中,这不是系统。虽然您可能需要root访问权才能访问此目录。但是,通过仅移动你的jni lib不能解决问题,你还必须推送libc ++。所以到同一个位置。这个libc ++。应该在你的system / lib64中,无论是在目标上还是在pc上。我做了adb从pc推送到目标。
最后,您必须在Java代码中指定它:
static {
System.load("/data/.../libc++.so");
System.load("/data/.../libnative_lib_jni.so");
}
重要提示:加载libc ++。首先是必须的。
因此,通过使用System.load(),您不再从共享库中加载,但现在它指向您放置库的位置。
注意:此文件夹结构位于目标上。所以我从目标访问libs,而不是从pc。