请不要对安全问题发表评论,这是一个非常具体的用例。
我正在构建一个具有两个本机库的 Android 应用程序。我们会打电话给他们libFooA.so
和libFooB.so
。现在,libFooA.so
被捆绑在 APK 中。但是,它取决于libFooB.so
APK,它没有捆绑在 APK 中。相反,它是在运行时使用System.load()
.
现在,因为libFooA.so
取决于libFooB.so
,我必须先加载libFooB.so
(使用System.load()
),然后才能libFooA.so
加载System.loadLibrary()
. 否则,我会收到此错误:
dlopen failed: cannot locate symbol "SOMESYMBOL" referenced by "libFooA.so"...
无论如何,这在我测试过的每台运行 Android 6.0/7.0/8.0 的设备上都能完美运行。但是,它在我测试过的每一个 KitKat 设备上都失败了。这让我怀疑问题出在 Dalvik 与 ART 之间。于是我通过开发者选项将KitKat设备切换到ART,又试了一次,还是失败了。libFooA.so
令人困惑的是,抛出的错误与我之前尝试libFooB.so
在 6.0/7.0/8.0 设备上加载时抛出的错误完全相同。
此外,问题不在于KitKatSystem.load()
本身,因为我之前已经能够在 KitKat 上成功地动态加载和使用本机库。这里的问题是当尝试System.loadLibrary()
一个依赖于另一个库的库时,该库加载了System.load()
.
我还不能在基于 Lollipop 的设备上进行测试,但我怀疑它会正常工作。有人知道为什么 KitKat 在这里有问题吗?这是 KitKat 的已知错误吗?
更新:在 4.4/5.0 ARM Android 模拟器上失败。适用于 6.0 ARM Android 模拟器。
更新2:我认为答案就在这个页面上,有人能指出哪个确切的项目导致行为改变,让这个工作在> = API 23上工作吗?