【问题标题】:Android: dynamic loading shared librariesAndroid:动态加载共享库
【发布时间】:2013-01-09 15:38:02
【问题描述】:

我有 2 个共享库:lib1.solib2.so

lib1.so 包含一些在 lib2.so 中定义的函数。从 C 程序中,我使用以下调用加载 lib1.so

dlopen( "lib1.so", RTLD_NOW );

这两个库都显示在当前目录中。我的程序可以在桌面 Linux(Ubuntu、Debian)下运行,但不能在 Android 下运行。在 Android 下 dlopen 返回一个错误并退出。我尝试设置:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

但没用。

我很困惑,为什么这段代码在 Android 下不起作用。我在 Android 的动态链接器上找不到任何好的文档。所以,我无法解释为什么它不起作用。

详情:

  1. 带有 Linux 内核 2.6.35 armv7l 的 Android
  2. objdump 显示 lib1.so 需要 libc.so 和 lib2.so
  3. objdump 显示 lib2.so 只需要 libc.so

【问题讨论】:

    标签: android c linux android-ndk shared-libraries


    【解决方案1】:

    好的。我刚刚找到了解决方案。将 -lgcc 添加到 lib1.so 的链接器选项已解决该问题。看起来编译器已经自动生成了一些对来自 libgcc 的特殊内置函数的调用。它还需要 -lc,因为编译器还会自动生成对 memcpy 的特殊调用。

    【讨论】:

      【解决方案2】:

      如果dlopen 因某种原因无法正常工作,您是否尝试致电dlerror 找出真正的问题?

      【讨论】:

      • dlerror(): 无法加载库: reloc_library[1311]: 23061 找不到'__aeabi_fcmpgt'...
      【解决方案3】:

      我不太确定您的项目。 但我认为,最好使用 System.loadLibrary 从服务中加载库)。

      System.loadLibrary(lib.so); 在您的情况下,首先加载 lib2.so,然后仅加载 lib1.so

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 2014-03-04
        • 1970-01-01
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多