私は Android NDK を使用していますが、現在 STL をサポートしていないため、これを成功させたり、Android プラットフォームには uSTL と STLPort のどちらが適しているかを知っている優秀な人がいないか知りたいです。
編集:別の選択肢があるようですクリスタックス.NET。
彼らのウェブサイトから:
...公式ソースから再構築した Android NDK r3 のカスタマイズされたディストリビューション。C++ 例外、RTTI、標準 C++ ライブラリのサポートが追加されました。
ベストアンサー1
STLの港は正式にAndroid NDKバージョンr5以降で利用可能オン。静的ライブラリとしても共有ライブラリとしても使用できます。次の実装は NDK で事前にビルドされて利用可能です:
- STLポート、v5.2.0 に基づく:
- static
stlport_static
: プロジェクト内に動的ライブラリが 1 つしかない場合に使用します。 - dynamic
stlport_shared
: プロジェクト内に複数の動的ライブラリがある場合に使用します。
- static
- GNU libstdc++
system
(静的ライブラリ)
推奨される簡単な使用方法ビルド時に APP_STL を定義する方法は、次のように Application.mk で定義します。
APP_STL := stlport_static
そして、もしそれを再構築したいなら(これはない必要に応じて、Application.mk で STLPORT_FORCE_REBUILD を定義します。
STLPORT_FORCE_REBUILD := true
STLport 用のユニット テスト フレームワークも利用できます。
STLport の現在の制限:
- C++ 例外はサポートされていません
- RTTIはサポートされていません
wchar_t
およびロケールのサポートにおける「可能性のあるバグ」
各種リンク:
ドキュメントは、NDK パッケージ内の次の場所 (他にもある可能性があります) で入手できます。
- ドキュメントCPLUSPLUS-SUPPORT.html
- ソース/cxx-stl/stlport
- ソース/cxx-stl/gnu-libstdc++
NDK + ドキュメントをダウンロードここ; ファイルのバグここ
以下は、docs/CPLUSPLUS-SUPPORT.html (NDK ドキュメント、r5 より) からの抜粋です。
III. C++ 標準ライブラリ実装の選択:
デフォルトでは、C++ ソースをビルドするときに、最小限の C++ ランタイム システム ライブラリ (/system/lib/libstdc++.so) のヘッダーとライブラリが使用されます。
ただし、Application.mk で変数 APP_STL を別の値に設定することで、別の実装を選択することもできます。次に例を示します。
APP_STL := stlport_static
この NDK で提供される静的 STLport 実装を選択します。APP_STL の値は次のとおりです。
system -> デフォルトの最小限の C++ ランタイム ライブラリを使用します。stlport_static -> 静的ライブラリとしてビルドされた STLport を使用します。stlport_shared -> 共有ライブラリとしてビルドされた STLport を使用します。
警告: 重要な注意事項
AT THE MOMENT, OUR STLPORT IMPLEMENTATION DOES NOT SUPPORT EXCEPTIONS
AND RTTI. PLEASE BE SURE TO NOT USE -fexceptions OR -frtti IN ALL
MODULES THAT USE IT.
警告: 重要な注意事項の終了
プロジェクト内に C++ STL を使用する共有ライブラリが複数ある場合は、「stlport_shared」が推奨されます。これは、各ライブラリ内の関数の重複、さらに重要なグローバル変数 (std::cout など) の重複を回避できるため、予期しない結果が生じる可能性があるからです。
一方、次の例のように、アプリケーションの起動時に明示的にロードする必要があります。
static {
System.loadLibrary("stlport_shared");
System.loadLibrary("foo");
System.loadLibrary("bar");
}
ここで、「libfoo.so」と「libbar.so」は両方とも「libstlport_shared.so」に依存します。
共有ライブラリの名前が「libstlport_shared.so」になっていることに注意してください。これは、システムレベルの libstlport.so (ABI が安定しておらず、NDK で生成されたマシンコードから使用できない) を含む特定の Android システム イメージとの名前の競合を避けるためです。
プロジェクトに共有ライブラリが 1 つしかない場合は、「stlport_static」が推奨されます。実際に必要な STL 関数と変数のみがマシン コードにリンクされるため、コード サイズが削減され、起動時に動的 stlport_shared をロードする必要がなくなります。
IV. STLport固有の問題:
この NDK は STLport 用にビルド済みの静的ライブラリと共有ライブラリを提供しますが、ビルド前に環境または Application.mk で以下を定義することで、ソースから強制的に再構築できます。
STLPORT_FORCE_REBUILD := true
STLport は BSD スタイルのオープンソース ライセンスに基づいてライセンスされています。ライブラリの詳細については、sources/cxx-stl/stlport/README を参照してください。
V. 今後の計画:
- STLport を C++ 例外および RTTI と互換性のあるものにする
- 完全なGNU libstdc++サポート
- uSTL サポート?