在Android上加载带依赖关系的共享库

4

我正在移植一个具有多个相互依赖的库的大块本地代码。加载代码失败,因为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以这种方式似乎可以正常加载,但即使如此,依赖库似乎仍然找不到它所需的符号。我错过了什么步骤吗? - ephemer
1个回答

0
Mozilla Fennec 从一个自定义缓存目录下的共享对象中加载一堆东西,该目录位于它们的 /data/data/package/ 目录下,你可以查看它们的源代码。

谢谢你的回答!我看到他们在加载方面已经付出了很多努力。他们甚至实现了自己修改过的链接器!他们本可以在其中修复路径问题,但对我来说,他们似乎仍然在硬编码加载依赖项 - tsaarni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接