31

私はAndroidNDKを使用していますが、現在STLをサポートしていないため、これで成功した優秀な人がいるのか、Androidプラットフォームに適しているのかを知っている人がいるのではないかと考えていました。uSTLまたはSTLPort。

編集:別のオプションがCrystaX.NETである可能性があるように見えます。

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

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

4

6 に答える 6

33

STLのポートは、バージョンr5以降のAndroidNDKで正式に利用可能です。静的ライブラリまたは共有ライブラリとして使用できます。次の実装は、NDKで事前に構築されたものを利用できます。

  • STLport、v5.2.0に基づく:
    • static stlport_static:プロジェクトにダイナミックライブラリが1つしかない場合に使用します。
    • ダイナミック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(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と互換性を持たせる
  • GNUlibstdc++の完全サポート
  • uSTLサポート?
于 2010-12-17T07:50:40.003 に答える
9

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

于 2009-10-30T17:41:19.360 に答える
9

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

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

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

于 2009-10-30T20:00:06.570 に答える
9

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

于 2010-12-13T14:08:50.747 に答える
3

これが、AndroidFroyoで動作するように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

アンドリュー

于 2010-11-05T16:44:13.277 に答える
0

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

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

于 2010-12-02T22:26:53.323 に答える