2011-01-11 12 views
13

のサポート私はNDK 5フルC++ gnustlを使用しようとしています:のAndroid NDK R5およびC++の例外

CPLUSPLUS-SUPPORT.html状態:

NDKツールチェーンは、しかし、すべて、NDK r5にあるため、C++の例外をサポートしていますC++ ソースは、以前のリリースとの互換性の理由で、 のデフォルトの-fno-exceptionsサポートでコンパイルされます。

有効にするには、 '-fexceptions' C++コンパイラフラグを使用します。これはあなたのAndroid.mk内のすべてのモジュール定義に以下を追加することで を行うことができます。

LOCAL_CPPFLAGS += -fexceptions 

もっと単純に、設定はすべてのプロジェクトのNDKに適用され、自動的 う、あなたのApplication.mkに単一の行を追加します。モジュール:

APP_CPPFLAGS += -fexceptions 

sources/cxx-stl/gnu-libstdc++/README状態:

このディレクトリの共同 GNU libstdC++ - v3 C++標準テンプレートライブラリの実装用のヘッダーとあらかじめ作成されたバイナリが含まれています。

これらはビルド/ツールの下のrebuild-all-prebuilt.sh スクリプトによってツールチェーンソースから生成されます。

これを使用するには、Application.mkでAPP_STLを 'gnustl_static'に定義します。 詳細については、docs/CPLUSPLUS-SUPPORT.htmlを参照してください。

この実装は、C++の例外とRTTIを完全にサポートしています。

ただし、例外を使用する試みはすべて失敗します。別のNDKがhttp://www.crystax.net/android/ndk-r4.phpに存在します。そのNDKのhello-jniの例を使用しても動作しません。 gnustl_staticにAPP_STLを設定

APP_STL := gnustl_static 

Application.xmlを作成した後NDK 5作品とのコンパイルにも自動的に-frtti-fexceptionsを可能にします。しかし、それは自分の実験と同じ恐ろしい死を迎えます。

私は私のためにクラッシュされたコードの最小限の例を得るために管理している:

try { 
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","trhown!"); 
    throw "Wrong object type."; 
} catch (char* b) { 
    __android_log_write(ANDROID_LOG_DEBUG,"foobar","catched!"); 
} 

が、私は何かが足りないか、READMECPLUSPLUS-SUPPORT.html単純に間違っ内のステートメントであるアム?

+0

おそらくそれは、今後のNDKリリースで修正される可能性が

...ので、その手助けするのは難しいです。例外、RTTI、およびstatic_gnustlは私のためにNDK-r5で動作します。 – grrussel

+0

クラッシュする例を追加しました。 – plaisthos

+0

引数V = 1を指定してndk_buildコマンドを実行すると、ビルドとリンクのコマンドが表示されます。クラッシュは例外によるものなのですか? – grrussel

答えて

8

例外はstd :: exceptionから継承されている場合にのみ発生します。私の場合、例外階層には常にcatch/throwを破るstd :: exceptionが含まれているとは限りません。不思議なことに、例外としての投げつけ文字列は、x86/Mac OS用にコンパイルされたときに機能します。私は使用している例外を修正して問題を解決しました。

+2

C++でstd :: exceptionから派生していない型を使用することはかなり合理的なので、OSXではうまく動作しません。私が扱っているコードベースは、例外として整数をスローし、Androidで動作します。 – grrussel

+1

ndkには、stdC++の個別のバージョンが付属しています.1つはgnuの実装を提供しています:/android-ndk-r5b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/libstdc++.aと明示的にリンクすると、問題はなくなった。しかし、私は簡単な方法があると確信しています。 – paniq

1

私の知る限り、Android NDKは例外をサポートしていません。 libstdC++自体は例外をサポートしていますが、アンドロイド用にコンパイルすると、例外サポートが無効になります( "-fno-exceptions"の場合はgrep)。

android ndkメーリングリストのthis threadを参照してください。

+2

バージョンr5の例外/ rtti ist newをサポートしています。変更とgnustlのREADMEによると、それはサポートされるべきです。 – plaisthos

+0

http://developer.android.com/sdk/ndk/index.htmlまだ "C++の例外があり、RTTIはデフォルトのSTL実装ではサポートされていません。"一般的な注意事項のセクションを参照してください。 r5で例外のサポートが有効になっていた場所はどこですか?そして、はい、彼らが使用する標準的なライブラリの実装は例外をサポートしていますが、アンドロイドのためにコンパイルするときに例外を明示的に無効にします。 (または少なくともr4まで持っています) –

+0

クリスタルndkを試したときに私がこれを読んでいたので、あなたのパッチでlibstdC++の完全なコンパイルを行い、hello-jniをそのlibstdC++に対してリンクさせましたかあなたはhello-jniでコードを使用し、それをデフォルトのlibstdC++とリンクさせるだけですか?前者は完全な例外サポートを提供する必要があります。後者はひどく死ぬでしょう。 –

7

NDK-r5ツールは、C++コードでの例外とRTTIの使用をサポートしています。ただし、静的ライブラリとしてのGNU STL以外のSTLの使用は、RTTIまたは例外の存在下ではサポートされません。

提供されたSTLportは、例外またはRTTIと共に使用できません。

STL実装間でスワップするときは、ビルドオブジェクトをクリーンアップする必要があることに注意してください。

+0

あなたは質問を正しく読まなかった。 – paniq

+1

例外のサポートについてのNDKの文書が間違っているかどうか質問されます。そうではない。 – grrussel

+3

この場合、私はあなたの答えを正しく読まなかった。 – paniq

1

私はJNIを使​​用して同様の問題があります。 JNIメソッドからスローされたすべての例外は、Android 1.6および2.1でSIGILLエラーを引き起こしています。

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

ので、現在、アンドロイド1.6と2.1にはない:それは(それに投票やコメントを投稿することを躊躇しないでください)私の問題を参照してくださいアンドロイド2.2以降の下で罰金

を働いています最後のNDKを持つJNIメソッドの例外をサポートします。あなたの失敗は、何であるか言っていない

関連する問題