Android用のuSTLまたはSTLPortですか?
-
22-07-2019 - |
質問
Android NDKを使用していますが、現在STLをサポートしていないため、これで成功した優秀な人がいるか、Androidプラットフォームに適しているかを知りたいと思いました。 :uSTLまたはSTLPort。
編集: 別のオプションは CrystaX .NET のように見えます。
ウェブサイトから:
... Androidのカスタマイズされた配布 再構築したNDK r3 公式ソース。 C ++のサポート 例外、RTTIおよび標準C ++ ライブラリが追加されました。
解決
STLportは現在Android2.3以降でサポートされています!!!
他のヒント
STLのポートは、正式にバージョンr5以降のAndroid NDKで使用可能です。 静的ライブラリまたは共有ライブラリとして使用できます。次の実装は、NDKで事前に構築されています。
- STLport 、v5.2.0に基づいて:
- static
stlport_static
:プロジェクトに動的ライブラリが1つしかない場合に使用します。 - dynamic
stlport_shared
:プロジェクトに複数の動的ライブラリがある場合に使用します。
- static
- GNU libstdc ++
system
(静的ライブラリ)
ビルド時に推奨される簡単な使用方法は、次のようにApplication.mkでAPP_STLを定義することです:
APP_STL := stlport_static
そして再構築したい場合(これは不要必要です)、Application.mkでSTLPORT_FORCE_REBUILDを定義します:
STLPORT_FORCE_REBUILD := true
STLportの単体テストフレームワークも利用できます。
STLportの現在の制限:
- C ++例外はサポートされていません
- RTTIはサポートされていません
- "考えられるバグ"
wchar_t
およびロケール のサポート
さまざまなリンク:
ドキュメントは、次の場所にあるNDKパッケージで入手できます(他にもある場合があります):
- docsCPLUSPLUS-SUPPORT.html
- sources / cxx-stl / stlport
- sources / cxx-stl / gnu-libstdc ++
NDK +ドキュメントのダウンロードこちら;ファイルバグこちら
以下はdocs / CPLUSPLUS-SUPPORT.html(NDK docs、r5)からの抜粋です
III。 C ++標準ライブラリの実装の選択:
デフォルトでは、最小限のC ++ランタイムシステムのヘッダーとライブラリ ライブラリ(/system/lib/libstdc++.so)は、C ++ソースをビルドするときに使用されます。
ただし、変数を設定することで別の実装を選択できます APP.STLをApplication.mk内の他の何かに、たとえば:
APP_STL:= stlport_static
このNDKで提供される静的STLport実装を選択します。 値APP_STLの値は次のとおりです。
システム->デフォルトの最小限の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.
警告:重要な警告の終わり
" stlport_shared"に複数の共有ライブラリがある場合に推奨されます 関数の重複を避けるため、C ++ STLを使用するプロジェクト さらに重要なのは、各変数のグローバル変数(std :: coutなど) それらは驚くべき結果をもたらします。
一方、起動時には明示的にロードする必要があります 次の例のようなアプリケーション:
static {
System.loadLibrary("stlport_shared");
System.loadLibrary("foo");
System.loadLibrary("bar");
}
両方の" libfoo.so"および「libbar.so」 " libstlport_shared.so"に依存します。
" libstlport_shared.so"の場合、共有ライブラリの名前に注意してください。避けるために を含む特定のAndroidシステムイメージと名前の競合 システムレベルのlibstlport.so(たまたまABIで安定していない NDKで生成されたマシンコードからは使用できません)。
" stlport_static"共有ライブラリが1つしかない場合に推奨されます プロジェクト:実際に必要なSTL関数と変数のみが マシンコードにリンクされ、コードサイズが削減され、必要ありません 起動時に動的stlport_sharedをロードします。
IV。 STLport固有の問題:
このNDKは、STLport用のビルド済みの静的および共有ライブラリを提供します。 ただし、以下を定義することにより、ソースから強制的に再構築できます。 ビルドする前に、環境またはApplication.mkで:
<*>STLportは、
uSTLは標準からかなり逸脱していることに注意してください。たとえば、std :: stringのUTF-8エンコーディングを想定しています。それでも面白いように見えます...
最近、ジョン・リプリーによる Android向けのヘルパースクリプトとSTLportのポートに出会いました。
関連するブログ投稿もあります設定方法の手順。
それにより、STLportを使いやすくすることができると思います。
これは、Android Froyoで動作するようにSTLPortを構成した方法です。
// The code
// The set of definitions and includes for STLPort
// They used defined() instead of #ifdef.
#define _STLP_HAS_INCLUDE_NEXT 1
#define _STLP_USE_MALLOC 1
#define _STLP_USE_NO_IOSTREAMS 1
#include <stl/config/_android.h>
#include <map>
#include <string>
// Android.mk
# For Android STL support
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_SHARED_LIBRARIES += libstlport
アンドリュー
Stjepan Rajkoの回答からのリンクにあるgitリポジトリの言及はもはや存在しないことに注意してください。代替ソースは anddev にあり、git経由ではgit:// stlportにあります。 .git.sourceforge.net / gitroot / stlport / stlport。後者は Androidでのstlportとboostの両方の使用に関する長い議論。
この質問に最初に答えてから、anddev STLPortを、問題のあるshared_ptrを含め、boostを呼び出すライブラリと連携するようになりました。私のソリューションの詳細については、この質問。