【发布时间】: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 构建库。
但是,一些依赖项是预先构建的。
即使需要的 .so 没有完全限定的 SONAME,是否可以将完全限定的 NEEDED 标记编译到我自己的库中?
或者是否可以修改现有的 .so 并将其 SONAME 或 NEEDED 替换为完全限定的,而无需重新编译?
【问题讨论】:
-
@tasaarni 你有想过这个吗?我几乎在这个确切的问题上陷入 DLL 地狱。我的共享库依赖依赖于 libicu,它包含在许多 Android 设备上,但通常是不包含我需要的符号的旧版本。所以我尝试以正确的依赖顺序专门加载所需的库(根据
ndk-depends) - 新的 libicu 似乎以这种方式加载正常,但即使这样,依赖库似乎也找不到它需要的符号.有没有我遗漏的步骤?
标签: android linker android-ndk shared-libraries