我正在NDK的帮助下制作一个Android应用程序。我正在使用的共享库之一取决于ICU,而我也正试图明确地包含它。
问题是我的设备(显然还有许多其他设备)已预装了旧版本的ICU。这意味着每当我尝试加载共享库时,系统都会尝试加载系统版本,而不是我自己的最新版本。
Android似乎忽略了任何RPATH,否则,RPATH将使库可以在特定位置查找依赖项。据我了解,RPATH本质上是在Android 上/vendor/lib
或/system/lib
在Android 上硬编码的。
我已经看到了一些解决此问题的方法,但是似乎都没有用:
以依赖性顺序显式加载所有库(包括依赖性)。
尽管ICU库似乎可以正常加载(通过它们的绝对路径),但是cannot locate symbol
在尝试加载共享库时仍然出现错误。我已经四次检查(通过nm
和readelf
),我的(新编译的)ICU .so
文件中确实存在缺失的符号。
SONAME
将ICU动态库的更改为特定于项目的内容,而是依赖于它们。
这可能会起作用,但这是最后的结果,因为这将涉及重新编译大量具有非平凡依赖关系的库代码。感觉也更像是黑客。与1相同的原因,库的简单名称更改无法正常工作。–尽管ICU符号已加载,但在从属库尝试访问它们时无法识别它们。
我的问题是向任何曾经尝试过这种方法或比我更了解链接的人:您是如何使其工作的?有没有一种方法可以强迫Android将其广为人知的hotsauce放在一起并实际加载正确的库,或者使用我已经成功加载的符号?