gpt4 book ai didi

java - Android native 库: Runtime error when trying to load JNI native library

转载 作者:行者123 更新时间:2023-12-02 12:11:44 25 4
gpt4 key购买 nike

我遇到的问题似乎与其他“无法加载 native 库”问题类似。但从我的情况来看,我的问题是由于无法在 API >= 24 中打开私有(private)库引起的。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 库是否是私有(private)的,从而给我带来运行时错误,或者是否还有其他原因导致错误。

在我的 .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)

最佳答案

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

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

最后您必须在 Java 代码中指定这一点:

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

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

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

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

关于java - Android native 库: Runtime error when trying to load JNI native library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com