gpt4 book ai didi

安卓 NDK/JNI : loadLibrary failure with dependant shared libarires

转载 作者:行者123 更新时间:2023-11-30 02:46:10 26 4
gpt4 key购买 nike

在我的项目中,我需要加载三个不同的共享库,其中第三个(主要的)依赖于前两个。为简单起见,前两个命名为 A 和 B,第三个命名为 C。

库 A 和 B 是大型库,它们根本不通过 JNI 交互,只是现有库到 android 的简单端口。

我通过这样设置我的第三个库的 android.mk 来建立这样一个系统没有问题:

include $(CLEAR_VARS)

LOCAL_PATH := $(MY_LOCAL_PATH)

LOCAL_MODULE := C
LOCAL_SRC_FILES := <source files>

LOCAL_C_INCLUDES := $(MY_LOCAL_PATH)/libA/
LOCAL_C_INCLUDES += $(MY_LOCAL_PATH)/libB/
LOCAL_SHARED_LIBRARIES := A
LOCAL_SHARED_LIBRARIES += B
LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

当通过 java 加载这个库时,我使用了:

static{
System.loadLibrary("C");
}

非常成功。

这个系统可以在我的设备上运行,也可以在所有设备上运行,除了我的一位 Beta 测试人员在他们的堆栈跟踪中收到 UnsatisfiedLinkError:

java.lang.ExceptionInitializerError
at <source>:<line>
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1892]: 1909 could not load needed library 'libA.so' for 'libC.so' (load_library[1094]: Library 'libA.so' not found)
at java.lang.Runtime.loadLibrary(Runtime.java:370)
at java.lang.System.loadLibrary(System.java:535)
at <source>:<line>
...

将我的代码更改为:

static{
System.loadLibrary("A");
System.loadLibrary("B");
System.loadLibrary("C");
}

似乎解决了那个测试人员的问题。

出现此问题的测试人员使用的是运行 armeabi-v7a(与我的设备相同)的 Android 4.1.2(由我的 native 代码支持)的三星 Galaxy SIII。

鉴于单个“加载 C”适用于除了那个测试人员之外的所有人,这是测试人员设备的问题还是显式加载所有三个库的“正确”方式?为什么它只对那一台设备失败。

单个“加载 C”的 LogCat 与显式加载所有:

07-26 23:23:29.333: D/App(13753): Loading core...
07-26 23:23:29.333: D/dalvikvm(13753): Trying to load lib /data/app-lib/com.foo.bar.app-2/libC.so 0x41bfd598
07-26 23:23:29.333: D/dalvikvm(13753): Added shared lib /data/app-lib/com.foo.bar.app-2/libC.so 0x41bfd598
07-26 23:23:29.338: D/App(13753): Core loaded.

与全部加载:

07-26 23:17:50.193: D/App(12714): Loading core...
07-26 23:17:50.198: D/dalvikvm(12714): Trying to load lib /data/app-lib/com.foo.bar.app-1/libA.so 0x41bfaf20
07-26 23:17:50.198: D/dalvikvm(12714): Added shared lib /data/app-lib/com.foo.bar.app-1/libA.so 0x41bfaf20
07-26 23:17:50.203: D/dalvikvm(12714): No JNI_OnLoad found in /data/app-lib/com.foo.bar.app-1/libA.so 0x41bfaf20, skipping init
07-26 23:17:50.208: D/dalvikvm(12714): Trying to load lib /data/app-lib/com.foo.bar.app-1/libB.so 0x41bfaf20
07-26 23:17:50.208: D/dalvikvm(12714): Added shared lib /data/app-lib/com.foo.bar.app-1/libB.so 0x41bfaf20
07-26 23:17:50.208: D/dalvikvm(12714): No JNI_OnLoad found in /data/app-lib/com.foo.bar.app-1/libB.so 0x41bfaf20, skipping init
07-26 23:17:50.208: D/dalvikvm(12714): Trying to load lib /data/app-lib/com.foo.bar.app-1/libC.so 0x41bfaf20
07-26 23:17:50.208: D/dalvikvm(12714): Added shared lib /data/app-lib/com.foo.bar.app-1/libC.so 0x41bfaf20
07-26 23:17:50.208: D/App(12714): Core loaded.

最佳答案

是的,显式加载 A、B 和 C 是在 Android 中工作的正确方式。另一种方法是使用 crazy linker ,从 NDK r9 开始支持。

无论如何,为您在项目中使用的库选择特殊名称很重要,这样就不会偶然使用任何系统库。例如。 Android 设备在 /system/lib 中有 libcrypto.solibssl.so,但许多应用程序需要这些的更新版本.

更新:疯狂链接器是 removed来自 NDK,但可以找到 in chromium project (latest change: June 2017)。

关于安卓 NDK/JNI : loadLibrary failure with dependant shared libarires,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24980028/

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