1

请不要对安全问题发表评论,这是一个非常具体的用例。

我正在构建一个具有两个本机库的 Android 应用程序。我们会打电话给他们libFooA.solibFooB.so。现在,libFooA.so被捆绑在 APK 中。但是,它取决于libFooB.soAPK,它没有捆绑在 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上工作吗?

4

0 回答 0