web-dev-qa-db-ja.com

uSTLまたはSTLPortfor Android?

私はAndroid NDKを使用していますが、現在STLをサポートしていないため、これで成功した優秀な人がいるかどうか、またはどちらがAndroidプラットフォーム:uSTLまたはSTLPortに適しています。

編集:別のオプションは CrystaX .NET のようです。

彼らのウェブサイトから:

...公式ソースから再構築したAndroid NDK r3のカスタマイズされたディストリビューション。C++例外、RTTI、および標準C++ライブラリのサポートが追加されました。

31
Andrew Garrison

STLportはAndroid2.3以降サポートされています!!!

9
jsding

STLのポートは公式にAndroid NDKバージョンr5からオンで利用可能です。静的ライブラリまたは共有ライブラリとして使用できます。次の実装は、事前に構築された状態で利用できます。 NDK:

  • STLport 、v5.2.0に基づく:
    • static stlport_static:プロジェクトにダイナミックライブラリが1つしかない場合に使用します。
    • dynamic stlport_shared:プロジェクトに複数のダイナミックライブラリがある場合に使用します。
  • 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」の場合の共有ライブラリの名前は、システムレベルのlibstlport.soを含む特定のAndroidシステムイメージ(たまたまABIに安定しておらず、 NDKで生成されたマシンコードから使用されます)。

プロジェクトに共有ライブラリが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サポート?
33
Stéphane

私は最近、John Ripleyによるいくつかの ヘルパースクリプトとAndroid用STLportのポート に出くわしました。

関連する 設定方法の説明が記載されたブログ投稿 もあります。

そうすれば、STLportを使いやすくなると思います。

9
Stjepan Rajko

USTLが標準からかなり逸脱していることに注意してください。たとえば、std :: stringのUTF-8エンコーディングを想定しています。それでも面白そうですが...

9

これは、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

アンドリュー

3
Andrew

StjepanRajkoの回答からのリンクに記載されているgitリポジトリはもう存在しないことに注意してください。代替ソースは anddev にあり、gitを介してgit://stlport.git.sourceforge.net/gitroot/stlport/stlportにあります。私は後者をAndroidでstlportとboostの両方を使用する より長い議論 で見つけました。

この質問に最初に答えて以来、問題のあるshared_ptrを含め、ブーストも呼び出すライブラリでanddevSTLPortを使用できるようになりました。私の解決策の詳細については、 この質問 を参照してください。

0
Gamma Draconis