我有一个为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"...
答案 0 :(得分:1)
似乎 libmath.so 不是使用--no-undefined链接器标志构建的,它禁止链接器检查未定义的符号;并没有正确链接到定义 memset()的lib。
您可以尝试使用ndk-depends工具检查库具有哪些依赖项,并在加载libmath.so之前手动加载该库。
如果仍然无效,请参阅 Android NDK Cannot load library: reloc_library[1306] 这可能对你有所帮助。