我有一个Android应用程序,可以为armv6和armv7a加载库。当我在Samsung SII中运行应用程序时,它会为armv6加载库。 三星SII有一个armv7霓虹灯处理器,它应该加载armv7a库。 我在三星SIII中测试了相同的应用程序,它加载了armv7a库。
任何想法?
谢谢。
答案 0 :(得分:1)
我怀疑这来自于here所描述的System.loadLibrary()错误。
总而言之,在Ice Cream Sandwich的某些Android SDK版本中,这个函数(应该找到所有具有正确名称的库并选择为正确架构编译的库)都搞砸了,并且可以选择错误的架构。我怀疑这就是你在这里发生的事情。
我们找到的解决方案是根据他们的架构为库提供不同的名称,并选择自己选择哪一个。这样,系统就不必消除具有相同名称的多个库之间的歧义。
为此,您首先必须检测您正在运行的体系结构:这可以使用NDK中包含的cpu-features.h
在本机代码中完成,也可以在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");
...
}
希望这有帮助!