我有一个为 armv7a 架构 libmath.so 编译的动态库。我需要在我的应用程序中使用这个库,所以我为来自 libmath - math-jni.c 的 JNI 包装函数编写了 C 文件。
Android.mk 文件如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := math
LOCAL_SRC_FILES := libmath.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := math-jni
LOCAL_SRC_FILES := math-jni.c
LOCAL_SHARED_LIBRARIES := math
include $(BUILD_SHARED_LIBRARY)
当我使用 ndk-build 构建这个项目时,我得到了 libmath-jni.so 库。
在 Java 代码中我调用了两个库:
static {
System.loadLibrary("math");
System.loadLibrary("math-jni");
}
当我在 Android 4.1.2 设备(使用 armv7a 架构)上运行应用程序时,我得到了
java.lang.ExceptionInInitializerError... Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1306]: 131 cannot locate 'memset'...
当我在 Android 4.2.2 或 higner(也有 armv7a 架构)的设备上运行这个应用程序时,我得到
dlopen("/data/app-lib/com.example.math-1/libmath.so") failed: Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "memset" referenced by "libmath.so"...
... Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_relocate(linker.cpp:976): cannot locate symbol "memset" referenced by "libmath.so"...
最佳答案
libmath.so 似乎不是使用 --no-undefined 链接器标志构建的,它禁止链接器检查 undefined symbol ;并且没有正确链接到定义 memset() 的库。
您可以尝试使用 ndk-depends 工具来检查库有哪些依赖项,并在加载 libmath.so 之前手动加载该库。
如果还是不行,请看 Android NDK Cannot load library: reloc_library[1306] 这可能会对您有所帮助。
关于安卓NDK : Cannot load library: reloc_library[1306]: 131 cannot locate 'memset' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20999033/