我有一个为 armv6 和 armv7a 加载库的 Android 应用程序。当我在三星 SII 中运行应用程序时,它会加载 armv6 的库。三星 SII 有一个 armv7 霓虹处理器,它应该加载 armv7a 库。我在三星 SIII 中测试了相同的应用程序,它加载了 armv7a 库。
任何想法?
谢谢你。
我有一个为 armv6 和 armv7a 加载库的 Android 应用程序。当我在三星 SII 中运行应用程序时,它会加载 armv6 的库。三星 SII 有一个 armv7 霓虹处理器,它应该加载 armv7a 库。我在三星 SIII 中测试了相同的应用程序,它加载了 armv7a 库。
任何想法?
谢谢你。
我怀疑这来自此处描述的 System.loadLibrary() 错误。
综上所述,在 Ice Cream Sandwich 的某些版本的 Android SDK 上,这个功能(它应该找到所有具有正确名称的库并选择为正确架构编译的库)搞砸了,可以选择错误的架构。我怀疑这就是你在这里发生的事情。
我们找到的解决方案是根据它们的体系结构为库赋予不同的名称,然后自己选择要选择的库。这样,系统就不必在几个同名的库之间消除歧义。
为此,您首先必须检测您在哪个架构上运行:这可以使用cpu-features.h
NDK 中包含的本机代码来完成,也可以使用/proc/cpuinfo
Java 进行解析。找到设备的架构后,加载正确的库。在伪代码中,这将变为:
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");
...
}
希望这可以帮助!