【问题标题】:Loading shared libraries with dependencies on Android在 Android 上加载具有依赖项的共享库
【发布时间】:2011-11-07 01:18:23
【问题描述】:

我正在移植大量具有多个相互依赖的库的本机代码。加载代码失败,因为 Android 链接器仅在 /system/lib/ 中查找依赖项,而不是在 /data/data/com.packagename.nnn/lib 的应用程序安装目录中查找依赖项。

作为第一个解决方法,我使用 System.load()以正确的依赖顺序从 Java 加载所有 .so。这个解决方案对我来说并不令人满意,主要是因为插件架构导致库集在构建之间发生变化。此外,UI 不需要对原生库了解太多。

我发现 Android 不支持 RPATH 或为应用设置 LD_LIBRARY_PATH。我发现的唯一解决方法是使用完全限定的 SONAME 构建库。

但是,一些依赖项是预先构建的。

  1. 即使需要的 .so 没有完全限定的 SONAME,是否可以将完全限定的 NEEDED 标记编译到我自己的库中?

  2. 或者是否可以修改现有的 .so 并将其 SONAME 或 NEEDED 替换为完全限定的,而无需重新编译?

【问题讨论】:

  • @tasaarni 你有想过这个吗?我几乎在这个确切的问题上陷入 DLL 地狱。我的共享库依赖依赖于 libicu,它包含在许多 Android 设备上,但通常是不包含我需要的符号的旧版本。所以我尝试以正确的依赖顺序专门加载所需的库(根据ndk-depends) - 新的 libicu 似乎以这种方式加载正常,但即使这样,依赖库似乎也找不到它需要的符号.有没有我遗漏的步骤?

标签: android linker android-ndk shared-libraries


【解决方案1】:

Mozilla Fennec 从其 /data/data/package/ 目录下的自定义缓存目录中加载一堆共享对象,您可以查看它们的源代码。

【讨论】:

  • 感谢您的回答!我看到他们为加载付出了很多的努力。他们甚至实现了自己的修改版linker!他们本可以解决路径问题,但对我来说,他们似乎仍然在做hard-coded loading of dependencies
猜你喜欢
  • 2011-07-22
  • 2011-01-20
  • 2012-06-19
  • 2012-02-24
  • 1970-01-01
  • 2011-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多