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