1

我有一个为 armv6 和 armv7a 加载库的 Android 应用程序。当我在三星 SII 中运行应用程序时,它会加载 armv6 的库。三星 SII 有一个 armv7 霓虹处理器,它应该加载 armv7a 库。我在三星 SIII 中测试了相同的应用程序,它加载了 armv7a 库。

任何想法?

谢谢你。

4

1 回答 1

1

我怀疑这来自此处描述的 System.loadLibrary() 错误。

综上所述,在 Ice Cream Sandwich 的某些版本的 Android SDK 上,这个功能(它应该找到所有具有正确名称的库并选择为正确架构编译的库)搞砸了,可以选择错误的架构。我怀疑这就是你在这里发生的事情。

我们找到的解决方案是根据它们的体系结构为库赋予不同的名称,然后自己选择要选择的库。这样,系统就不必在几个同名的库之间消除歧义。

为此,您首先必须检测您在哪个架构上运行:这可以使用cpu-features.hNDK 中包含的本机代码来完成,也可以使用/proc/cpuinfoJava 进行解析。找到设备的架构后,加载正确的库。在伪代码中,这将变为:

    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");
        ...
    }

希望这可以帮助!

于 2013-02-06T12:52:44.060 回答