Android NDK ARM构建设置可在大多数设备上运行吗?

时间:2012-08-06 15:50:04

标签: android android-ndk arm neon

我有一些Android NDK应用程序,人们抱怨我的应用程序无法在他们的手机上运行。我想知道的是,如果不是所有市场上的ARM设备都支持大多数编译设置?

我的问题似乎是armeabi-v7a设备对VFP,NEON等有不同程度的支持。我正在寻找一种解决方案来构建在大多数平台上运行的应用程序,即使这是以牺牲优化

我使用的是armeabi和armeabi-v7a的默认NDK构建脚本,它指定: -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3

这在某些设备上不起作用,例如在Acer A500(CPU Nvidia Tegra2(Dual 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'进行编译,都会返回错误消息。

2 个答案:

答案 0 :(得分:3)

事实证明我的问题是我使用的是NDK r7b,它有一些错误,其中VFPv3代码包含在某些核心库中。

http://code.google.com/p/android/issues/detail?id=26199

它已在r7c中修复,升级到r8b后,我似乎解决了这个问题。

答案 1 :(得分:1)

通过构建vanilla和armv7优化库(armeabi和armeabi-v7a),您可以了解armv7和非armv7的情况,因为包管理器将在用户安装您的应用程序时选择适当的库。

在armv7优化库中,您可以使用android_getCpuFeatures()检测对VFPv3-D16和NEON的支持,并根据该路径选择适当的代码路径。即,如果设置了ANDROID_CPU_ARM_FEATURE_VFPv3,您可以执行任何VFPv3-D16优化代码,如果设置了ANDROID_CPU_ARM_FEATURE_NEON,则可以执行任何NEON / VFPv3-D32优化代码(假设没有设备谎言他们支持)。