【问题标题】:Android NDK ARM build settings to run on most devices?Android NDK ARM 构建设置可在大多数设备上运行?
【发布时间】: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


【解决方案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 优化代码(假设没有设备对它们支持的内容撒谎)。

【讨论】:

  • 感谢您的信息 - 但我不是在编写 VFPv3 / NEON 相关代码。它是在编译期间为我选择的(即 tanf 是根据 vfpv3 生成的)
  • 在这种情况下,如果您真的想支持基于 Tegra 2 的设备并且不想拥有 Tegra 2-,那么您最好的选择可能是使用 -mfpu=vfpv3 编译 armeabi-v7a 库-您应用的特定版本。
  • 其实 Tegra2 只支持 vfpv3-d16。我已将我的应用程序副本发送给抱怨崩溃的人,希望它能解决问题,我可以重新开始高效编码。
  • 是的,对不起,vfpv3-d16 就是我的意思(复制粘贴错误)。另一种可能性是构建您的库的多个 armeabi-v7a 版本 - 例如一个带有霓虹灯优化,一个带有 vfpv3-d16 优化 - 并根据 getCpuFeatures 返回的内容决定在运行时加载哪个(我自己没有尝试过这种方法,所以我不能说它有多实用)。
【解决方案2】:

原来我的问题是我使用的是 NDK r7b,它存在一些错误,其中 VFPv3 代码包含在某些核心库中。

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

它已在 r7c 中修复,通过升级到 r8b 看起来我解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多