安卓NDK : Cannot load library: reloc_library[1306]: 131 cannot locate 'memset'

标签 android android-ndk

我有一个为 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/

相关文章:

android - Linphone SDK 不构建 android

java - 其他网站地址与 url 不匹配

android - Google Play 商店上的智能应用更新 : how does it work?

java - 使用 Android 在 Eclipse 中查找堆栈跟踪

android - 从沉浸式( Activity )切换到活卡(服务)

javascript - cordova 2.0.0 给出未捕获的类型错误 : Object 0 has no method 'func'

android-ndk - 使用Gradle在Windows上编译NDK源代码时的"No rule to make target"

android - RUBYMOTION_ANDROID_SDK 不正确

android - 运行程序时出现 SIGILL 错误

android - wcstombs() 在 Android 上有无效的输出