58

少なくともライブラリをきれいにコンパイルする限り、私はそれを理解したので、これは質問というよりも答えです。私にとっての主な問題は、shared_ptrを機能させることでした。

材料:

ブーストv。1.45.0

http://www.anddev.org/viewtopic.php?p=29939にあるSTLportのバージョン。

NDKのバージョンr4b。

方向:

Android.mkファイルに次を追加します。

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

stlport / stl/_string.hの行613にある__stl_throw_length_errorへの呼び出しを削除します。必要に応じて、_STLP_NO_EXCEPTIONSを使用できます。

261行目以降のboost/boost / smart_ptr / shared_ptr.hppを編集して、shared_ptrコンストラクターのboost::throw_exceptionの呼び出しを削除します。メソッドの本体全体で#ifndefBOOST_EXCEPTION_DISABLEを使用しました。(ただし、以下の回答を参照してください。)

次に、不足している部品をいくつか提供する必要があります。次のヘッダーファイルを作成します。

#ifdef OS_ANDROID

#include <exception>

namespace std
{
    struct bad_alloc : public exception { bad_alloc operator()(){}};
}

#endif

そして、bad_allocをサポートするために削除された例外クラスを持つソースファイル:

#ifdef OS_ANDROID

#include <exception>

namespace std
{
    exception::exception() {}
    exception::~exception() {}
    const char* exception::what() const {}
}

#endif

boost / shared_ptr.hppを含める場合は常に、ヘッダーを含めます。ソースをコンパイルしてライブラリに追加します。

4

4 に答える 4

39

デバッグ可能なライブラリをコンパイルする場合、このアプローチは完全には機能しないことが判明しました。リリース ライブラリは -O2 でコンパイルされているため、いくつかの問題が最適化されていますが、デバッグ ライブラリは -O0 でコンパイルされており、追加の問題がいくつか明らかになります。さらに、ブーストファイルを編集しなければならないことにあまり満足していませんでした. そのため、いくつかの追加の調査により、次の解決策を思いつきました。

まず、ブースト ファイルを編集しないでください。代わりに、std 名前空間内のヘッダーに次を追加します。

struct bad_cast : public exception {bad_cast operator()(){}};

次に、ソース ファイルに次を追加します。

namespace boost
{
    void throw_exception(std::exception const&) {}
}

これにより、AndroidManifest.xml で android:debuggable="true" が指定されていても、アプリケーションにコンパイルおよびリンクされるようになりました。エミュレーターでは実行されませんが、このライブラリを含める前は実行していませんでした。

于 2010-12-06T16:41:16.737 に答える
3

特に、NDK r5 には STLport と GNU STL が付属しているため、a) STL のサポート b) NDK C++ コンパイラでの例外のサポートがあるため、ここでのハックは不要になります。

于 2010-12-08T19:47:41.757 に答える
1

特に shared_ptr の別の回避策は、代わりに boost::intrusive_ptr を使用することです。これは常に可能というわけではありませんが、私の状況ではうまくいきました。

于 2011-02-14T12:46:35.193 に答える
1

Android NDK (r9) の現在のバージョンでは、例外がサポートされるようになりました。

さまざまなランタイムの機能は異なります。次の表を参照してください。

          C++       C++   Standard
          Exceptions  RTTI  Library
system    no           no        no
gabi++   yes          yes        no
stlport  yes          yes       yes
gnustl   yes          yes       yes

stlport は非 GPL バイナリで使用できます。まだ実験的であるというフラグが立てられていますが、clang と gcc で使用できます。

http://developer.android.com/tools/sdk/ndk/を参照してください

于 2013-10-23T14:33:28.190 に答える