【发布时间】:2012-08-03 14:56:53
【问题描述】:
我推出了一些 Android NDK 应用程序,但人们抱怨我的应用程序无法在他们的手机上运行。我想知道的是,哪些编译设置将支持市场上大多数(如果不是所有)ARM 设备?
我的问题似乎是 armeabi-v7a 设备对 VFP、NEON 等具有不同程度的支持。我正在寻找一种解决方案来构建在大多数平台上运行的应用程序,即使这是以优化。
我使用的是 armeabi 和 armeabi-v7a 的默认 NDK 构建脚本,它指定:
-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3
这不适用于某些设备,例如 Acer A500(CPU Nvidia Tegra2(双 Cortex A9))。这个 CPU 没有实现 NEON,从我在这里学到的 http://wiki.debian.org/ArmHardFloatPort/VfpComparison.
具体来说,崩溃是这样的:
F/libc (15549): Fatal signal 4 (SIGILL) at 0x5bfd9260 (code=1)
...(snip)...
I/DEBUG ( 81): #00 pc 0005b260 /data/data/com.burnsmod.oscpad/lib/libapplication.so (tanf)
查看 libapplication.so,我看到 tanf 生成为:
0005b25c <tanf>:
5b25c: ee070a90 fmsr s15, r0
5b260: eef70ae7 fcvtds d16, s15
5b264: e92d4010 push {r4, lr}
5b268: ec510b30 vmov r0, r1, d16
5b26c: ebff4b6c bl 2e024 <_ZN15ButtonUIHandler10FreeImagesEv-0x6ac>
5b270: ec410b30 vmov d16, r0, r1
5b274: eef77be0 fcvtsd s15, d16
5b278: ee170a90 fmrs r0, s15
5b27c: e8bd8010 pop {r4, pc}
那么,答案是什么? vfpv2? vfp? vfpv3? vfpv3-d16?
现在,如果我使用 readelf,我发现我的应用程序库的依赖项是:
MacBook:armeabi-v7a tom$ arm-linux-androideabi-readelf -A libapplication.so
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_VFP_arch: VFPv3
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
VFP2:NDK 7 不支持使用“-mfpu=vfpv2”或“-mfpu=vfp2”进行编译,两者都会返回错误消息。
【问题讨论】:
-
通常,当兼容性比优化更重要时,您的目标是最小公分母。
-
@Seva 绝对。那是什么? VFP 被称为“过时”,那么它是 VFPv2 吗?
标签: android android-ndk arm neon