NDK のドキュメントは、少なくとも現時点では完全に正確ではありません。実際、ビルド済みのツールチェーンを使用すると、「C++ STL (STLport または GNU libstdc++) を使用することはできません。」と記載されていますが、これは古くなっています。インクルードを使用して小さな hello world プログラムを作成しましたが、同じエラーが発生しました。ただし、独自のツールチェーンを作成しなくても解決できます。これは、構成プロセスにもう 1 つの手順を追加する必要がなく、毎回新しいツールチェーンを作成することなく常に最新の SDK プラットフォームを使用できる場合に便利です。
NDK には、標準 C++ ライブラリのいくつかのバージョン (GAbi++、STLport、および GNU STL) のソース コードが付属しています。各フレーバーには、ビルド済みの共有ライブラリと静的ライブラリも付属しています。以下の例では、stlport を使用します。
インストールされた場所でスタンドアロン ツールチェーンを使用するには、次のようにします。 g++ --sysroot="$NDK_ROOT/platforms/android-19/arch-arm"'
たとえば、これにより、SDK プラットフォーム レベル 19 を使用して OS X システムで ARM をコンパイルするように CXX コンパイラが設定されます。また、使用する場合は、CC、CPP、LD、AR、および RANLIB をエクスポートする必要があります。また、READELF の環境変数も個人的に作成しています。
C++ ライブラリのサポートを追加するには、次のようにします。 lstlport_shared
これにより、実行時に必要になる libstlport_shared.so がリンクされることに注意してください。そのため、APK 構造によっては、上記のコマンドに相対パスを追加してサポートする必要がある場合があります。この単純なケースをテストするだけの場合は、次のようにエミュレーターで実行できます。
adb push a.out /data
adb push $NDK_ROOT/sources/cxx-stl/stlport/libs/armeabi/libstlport_shared.so /data
adb shell
# su
# cd /data
# chmod 777 a.out
# ./a.out
共有ライブラリ パスを処理するという頭痛の種を取り除くために、「-lstlport_shared」を「-lstlport_static」に変更して、C++ ライブラリを静的にリンクすることもできます。NDK Dev Guide で説明されているように、これを行うといくつかの結果が生じます。最大の問題は、スタティック ライブラリが複数の場所でリンクされていることによるものです。これにより、次のことが発生します。- libfoo.so で発生した例外は、libbar.so でキャッチできません (そして、単にプログラムをクラッシュさせる可能性があります)。- std::cout のバッファリングが正しく機能しない
プログラムの依存関係を確認するための便利なツールである readelf ツールも含まれています。
プログラムに必要なその他の共有ライブラリを確認するには、次を実行します。grep が必要
その他の優れた標準ツール: addr2line - スタック トレース アドレスをコード行に変換 nm - シンボル テーブルを表示 objdump - オブジェクトに関する情報を表示