【问题标题】:could not load library "libdl.so.2"无法加载库“libdl.so.2”
【发布时间】:2014-04-16 13:51:53
【问题描述】:

我一直在尝试将 linux 编译的预构建共享库与我的 android jni 应用程序一起使用,但是当我尝试运行该应用程序时出现以下错误:

04-16 19:09:13.633: E/dalvikvm(11810): dlopen("/data/app-lib/com.lXXXX.XXXX.connect-2/libXXX_embedded_shared.so") 失败:无法加载库: soinfo_link_image(linker.cpp:1636):无法加载“libXXX_embedded_shared.so”所需的库“libdl.so.2”; load_library(linker.cpp:746): library "libdl.so.2" not found

我在 android/system/lib 中找不到 libdl.so.2 但有一个库 libdl.so 我尝试加载但它仍然没有解决依赖关系。

你能指出我在这里缺少什么吗?

【问题讨论】:

  • 尝试将 libdl.so.2 符号链接到 libdl.so 并查看是否可以解决问题。我假设您正在谈论的预构建的 linux 库实际上是一个预构建的 android 库,它已针对您正在使用的正确 arm 架构进行编译。
  • 谢谢亚历克斯。我已经尝试将 libdl.so 符号链接到 libdl.so.2 并没有解决问题。你能想到什么我可以尝试的吗?

标签: android java-native-interface native


【解决方案1】:

你不能这样做。

Android 和普通 linux 的用户空间大不相同,特别是它们使用完全不同的 C 库和相关的不兼容动态链接器。

对版本库名称的渴望(.so.2 - Android 目前不这样做)表明这个库不是为 Android 构建的。

您需要使用 android ndk 重建所有库,方法是创建 Android.mk 和类似文件来驱动正常的 ndk 构建系统,或者使用 ndk 实用程序生成“支架”单独的工具链”并将您的项目的构建系统指向生成的 android-targeted gcc、ld 等。

有些人已经设法在有根设备上使用普通的 linux 用户空间组件,方法是在 chroot 中安装完整的 debian-arm 或类似设备,但这需要 root 进行设置,并且无法通过 jni 从应用程序进程链接反正。您的应用程序进程已经与 Android 的 C 库紧密相关,因此您无法真正替代另一个。

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2017-09-12
    • 2017-03-15
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多