3

私はいくつかのAndroidNDKアプリを出しましたが、人々は私のアプリが自分の携帯電話で動作しないと不満を言っています。私が知りたいのは、市場に出回っているすべてではないにしてもほとんどのARMデバイスをサポートするコンパイル設定は何ですか?

私の問題は、VFP、NEONなどをさまざまな量でサポートしているarmeabi-v7aデバイスのようです。最適化を犠牲にしても、ほとんどのプラットフォームで実行されるアプリを構築するためのソリューションを探しています。

私は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:「-mfpu=vfpv2」または「-mfpu=vfp2」を使用したコンパイルはNDK7ではサポートされていません。どちらもエラーメッセージを返します。

4

2 に答える 2

3

私の問題は、VFPv3コードが一部のコアライブラリに含まれているバグがあったNDKr7bを使用していたことでした。

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

これはr7cで修正され、r8bにアップグレードすることで、問題が修正されたように見えます。

于 2012-08-22T00:51:16.657 に答える
1

バニラとarmv7に最適化されたライブラリ(armeabiとarmeabi-v7a)の両方を構築することで、ユーザーがアプリをインストールするときにパッケージマネージャーが適切なライブラリを選択するため、armv7と非armv7の状況をカバーします。

armv7に最適化されたライブラリ内で、android_getCpuFeatures ()を使用してVFPv3-D16とNEONのサポートを検出し、それに基づいて適切なコードパスを選択できます。つまり、設定されている場合はVFPv3-D16に最適化されたコードを実行でき、ANDROID_CPU_ARM_FEATURE_VFPv3設定されている場合はNEON / VFPv3-D32に最適化されたコードを実行できANDROID_CPU_ARM_FEATURE_NEONます(サポート対象にデバイスがないことを前提としています)。

于 2012-08-06T16:09:26.010 に答える