1

Android OS 3.1 を実行している Lenovo Thinkpad タブレットでのみ発生するように見える問題があります。NDK を使用してネイティブ アプリを実行しています。アプリケーションは、エミュレーターおよび他のデバイスで正常に動作します。

int64_t (long long として定義) を割り当てるたびに、シグナル (4) で SIGILL クラッシュが発生します。例として、これらの行はデバイスでクラッシュします。

int64_t i = 0; 
long long j = 0;

アプリケーションは正常に動作し、メニューが正しくレンダリングされ、アニメーション化され、入力を待っていることを確認できます。タッチすると、タイムスタンプに int64 変数が割り当てられます。これがクラッシュの発生時です。このアプリで int64 をどこに割り当てても、クラッシュします。

奇妙なことに、NDK に付属のネイティブ アクティビティ サンプルを読み込んで、上記のデータ型を割り当てようとしたところ、問題なく動作しました。両方のアプリケーションには、同じ Application.mk ファイルと非常によく似た Android.mk ファイルがあります。プロジェクトのクリーニングも試みました。

私は次に何を見るべきか本当に確信が持てません。

4

2 に答える 2

2

私は問題を解決しました。このプロジェクトは、いくつかの NEON 数学クラスを含む iOS プロジェクトからの移植です。NEON のサポートには、次のフラグを使用します。

 -mfpu=neon -mfloat-abi=softfp

Android プロジェクトでは、最初は機能していたのと同じフラグを使用しました。新しいテスト デバイス (Lenovo Thinkpad Tablet) を入手するとすぐに、上記のようなクラッシュが発生し始めました。armeabi-v5 のビルドが機能し、NEON を使用していないため、関連していることはわかっていました。上記のフラグを使用するよりも、NEON for Android 用にコンパイルするためのより良い方法があることがわかりました。Android.mk が次のようになるように、上記のフラグを削除しました。

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
     LOCAL_CFLAGS   += -DHAS_NEON=1
     MY_SRC_FILES   += myfile.cpp.neon
else
     LOCAL_CFLAGS   += -DHAS_NEON=0
     MY_SRC_FILES   += myfile.cpp
endif

これは、NEON 用に実際にビルドする必要があるファイルのみが存在することを意味します。Lenovo Thinkpad Tablet (Nvidia Tegra 2) 内のプロセッサは NEON をサポートしていないため、明らかに NEON サポートを使用してすべてのファイルをビルドすると、プロセッサが好まない方法で命令を生成していました。

キースが他のアーキテクチャを試してみることを提案してくれてありがとう。

于 2012-06-13T00:26:21.050 に答える
1

コンパイラが、マシンのプロセッサによって実装されていない 64 ビット命令を生成しているようです。クロスコンパイルしていますか?その場合は、タブレットの正しいバージョンの ARM (x86?) チップをターゲットにしていることを確認してください。

于 2012-06-09T05:48:28.100 に答える