在Android上依赖加载共享库
我正在用一些相互依赖的库移植一大块本机代码。加载代码失败,因为Android链接器只在/system/lib/
中查找依赖关系,而不在/data/data/com.packagename.nnn/lib
的应用程序安装目录中查找依赖项。在Android上依赖加载共享库
作为第一种解决方法,我使用System.load()以正确的从属顺序从Java加载了所有.so文件。这个解决方案对我来说并不令人满意,主要是因为由于插件架构的缘故,一组库由构建变为构建。此外,用户界面不需要太多了解本地库。
我发现Android不支持RPATH或为应用程序设置LD_LIBRARY_PATH。我发现唯一的解决方法是用完全合格的SONAME构建库。
但是有些依赖关系是预先构建的。
是否可以编译完全合格的标签需要到我自己的图书馆,即使需要的。所以不具有完全合格的SONAME?
或者是否有可能修改现有的.so并用完全合格的替换它的SONAME或NEEDED而无需重新编译?
Mozilla的Fennec的加载从自定义缓存目录一堆的共享对象的/数据/数据/包/目录下,你可以看看他们的来源。
感谢您的回答!我发现他们已经付出很多努力来加载。他们甚至实施了自己的[链接器]的修改版本(http://hg.mozilla.org/mozilla-central/file/0664108eb19d/other-licenses/android/linker.c)!他们可能已经解决了路径问题,但对我来说,他们似乎仍然在执行[硬编码的依赖关系加载](http://hg.mozilla.org/mozilla-central/file/0664108eb19d/other-licenses/android/ APKOpen.cpp#L651)。 – tsaarni
@tasaarni你有没有想过这个?几乎在这个确切的问题,我在DLL地狱。我的共享库依赖依赖于libicu,它包含在许多Android设备上,但通常是旧版本,不包含我需要的符号。所以我试图以正确的依赖顺序(按照'ndk-depends')加载所需的库 - 新的libicu似乎以这种方式加载好,但即使如此,依赖库也无法找到符号它需要。我错过了一个步骤吗? – ephemer