У меня есть несколько приложений Android NDK, и люди жалуются, что мое приложение не работает на их телефонах. Что я хотел бы знать, так это то, какие параметры компиляции будут поддерживать большинство, если не все устройства ARM на рынке?
Моя проблема заключается в том, что устройства armeabi-v7a имеют различную поддержку VFP, NEON и т. д. Я ищу решение для создания приложений, которые работают на большинстве платформ, даже если это будет стоить оптимизации.
Я использовал сценарии сборки NDK по умолчанию для armeabi и armeabi-v7a, в которых указано: -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3
Это не работает на некоторых устройствах, например на Acer A500 (процессор Nvidia Tegra2 (Dual Cortex A9)). Этот ЦП не реализует 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}
Итак, каков ответ? вфпв2? вфп? вфпв3? вфпв3-д16?
Прямо сейчас, если я использую 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: компиляция с параметрами '-mfpu=vfpv2' или '-mfpu=vfp2' не поддерживается в NDK 7, оба возвращают сообщение об ошибке.