Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NDK ARM构建设置在大多数设备上运行?_Android_Android Ndk_Arm_Neon - Fatal编程技术网

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

Android NDK ARM构建设置在大多数设备上运行?,android,android-ndk,arm,neon,Android,Android Ndk,Arm,Neon,我已经推出了一些Android NDK应用程序,人们抱怨我的应用程序在他们的手机上无法工作。我想知道的是,如果不是市场上所有的ARM设备,那么哪些编译设置将支持大多数ARM设备 我的问题似乎是armeabi-v7a设备对VFP、NEON等有不同程度的支持。我正在寻找一种解决方案来构建在大多数平台上运行的应用程序,即使这是以优化为代价的 我正在为armeabi和armeabi-v7a使用默认NDK构建脚本,该脚本指定: -march=armv7-a-mfloat abi=softfp-mfpu=v

我已经推出了一些Android NDK应用程序,人们抱怨我的应用程序在他们的手机上无法工作。我想知道的是,如果不是市场上所有的ARM设备,那么哪些编译设置将支持大多数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没有实现霓虹灯

具体来说,这次事故是:

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}

VFP2:NDK 7不支持使用'-mfpu=vfpv2'或'-mfpu=VFP2'进行编译,两者都会返回错误消息。

通过构建普通和armv7优化库(armeabi和armeabi-v7a),可以涵盖armv7和非armv7的情况,因为当用户安装应用程序时,软件包管理器将选择适当的库


在armv7优化库中,您可以使用它来检测对VFPv3-D16和NEON的支持,并在此基础上选择适当的代码路径。也就是说,如果设置了
ANDROID\u-CPU\u-ARM\u-FEATURE\u-VFPv3
,您可以执行任何VFPv3-D16-optimized代码,如果设置了
ANDROID\u-CPU\u-ARM\u-NEON
(假设没有设备对其支持的内容撒谎)。

我的问题是我使用的是NDK r7b,在一些核心库中包含VFPv3代码的地方存在bug


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

通常,当兼容性比优化更重要时,您的目标是最低公分母。@Seva。那是什么呢?VFP被称为“过时”,那么它是VFPv2吗?谢谢你提供的信息-但我不是在写VFPv3/NEON相关代码。在编译过程中为我选择了它(即tanf是根据vfpv3生成的),在这种情况下,您最好的选择可能是使用
-mfpu=vfpv3
编译armeabi-v7a库,如果您真的想支持基于Tegra 2的设备,并且不想拥有特定于Tegra 2的应用程序版本。实际上,Tegra 2只支持vfpv3-d16。我已经向那些抱怨崩溃的人发送了一份用它构建的应用程序的副本,希望它能解决这个问题,我可以回到高效编码。是的,对不起,我的意思是vfpv3-d16(复制粘贴错误)。另一种可能是构建多个armeabi-v7a版本的库(例如,一个使用neon优化,另一个使用vfpv3-d16优化),并根据getCpuFeatures返回的内容决定在运行时加载哪一个(我自己还没有尝试过这种方法,所以我不能说它有多实用)。
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