我有一个 Android 应用程序可以加载 armv6 和 armv7a 的库。当我在 Samsung SII 中运行应用程序时,它会加载 armv6 的库。 Samsung SII 有一个 armv7 neon 处理器,它应该加载 armv7a 库。 我在三星 SIII 中测试了相同的应用程序,它加载了 armv7a 库。
有什么想法吗?
谢谢。
最佳答案
我怀疑这来自于描述的 System.loadLibrary() 错误 here .
总而言之,在 Ice Cream Sandwich 的某些版本的 Android SDK 上,这个函数(它应该找到所有具有正确名称的库并选择为正确的体系结构编译的库)被搞砸了,并且可以选择错误的架构。我怀疑这就是你这里发生的事情。
我们找到的解决方案是根据架构给库起不同的名字,你自己选你想选的。这样,系统就不必在多个具有相同名称的库之间消除歧义。
为此,您首先必须检测您正在运行的架构:这可以使用 NDK 中包含的 cpu-features.h
在 native 代码中完成,或者您可以解析Java 中的 /proc/cpuinfo
。找到设备的架构后,加载正确的库。在伪代码中,这将变成:
arch = findArchitecture() // native function
// or Java function parsing /cpu/info
switch (arch) {
case armv7-neon: System.loadLibrary("lib-neon");
case armv6: System.loadLibrary("lib-armv6");
...
}
希望这对您有所帮助!
关于Android 三星 SII 不加载 armv7a 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14727572/