Android NDK:无法加载库:reloc_library [1306]:131找不到'memset'

时间:2014-01-08 14:56:47

标签: android android-ndk

我有一个为armv7a架构libmath.so编译的动态库。我需要在我的应用程序中使用这个lib,所以我从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或更高版本(也使用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"...

1 个答案:

答案 0 :(得分:1)

似乎 libmath.so 不是使用--no-undefined链接器标志构建的,它禁止链接器检查未定义的符号;并没有正确链接到定义 memset()的lib。

您可以尝试使用ndk-depends工具检查库具有哪些依赖项,并在加载libmath.so之前手动加载该库。

如果仍然无效,请参阅 Android NDK Cannot load library: reloc_library[1306] 这可能对你有所帮助。