4

ブーストシリアル化を利用するAndroidアプリを構築しようとしています。arm4.7のg++を使用して、NDKr8dに対してライブラリを構築しました。ただし、ndk-buildを使用してネイティブコードをライブラリにコンパイルしようとすると、コンパイラがブーストでアーカイブヘッダーから一部のコードをリンクしようとすると、「'mbtowc'への未定義の参照」と「'wctomb'への未定義の参照」が表示されます。 。

NDKがこれらの機能をサポートしているかどうかについて明確な答えが得られないようです。

Boostメーリングリストによると、CrystaX NDKは機能を実装していますが、Boostで使用するとクラッシュすることがわかっているため、オプションではありません。

では、NDKがこれらの関数を何らかの方法で実装している場合、NDK-buildがそれらに対してリンクできないのはなぜですか?NDK内のcstdlibでそれらへの参照を見つけることができ、設定する必要のあるフラグがあると思いますが、その方法と場所がわかりません。

それらの実装がない場合、私がそれらを自分で書く方法について誰かアドバイスがありますか?mbtowcとその補完機能が何をするのかは大まかにわかっていますが、低レベルのCを作成した経験がなく、Android / ARMアーキテクチャの知識があまりないので、そうするためのアドバイスを実際に使用できます。

4

3 に答える 3

9
#ifdef ANDROID
int wctomb(char *s, wchar_t wc) { return wcrtomb(s,wc,NULL); }
int mbtowc(wchar_t *pwc, const char *s, size_t n) { return mbrtowc(pwc, s, n, NULL); }
#endif
于 2013-11-03T10:41:17.593 に答える
1

調査結果!はい、boostには、ブーストビルドスクリプトにプリプロセッサ定義を追加することにより、wcharサポートを必要とせずにビルドするオプションがあります。オブジェクトをファイルにシリアル化しようとするコード行でBoostを使用してビルドすると、Boostがクラッシュします。(クラッシュは0x00000000での一般的なセグメンテーション違反であり、有用な情報を取得できませんでした)。

だから、私はwctombやその逆を書くことを気にしませんでした。結局のところ、質問への答えは重要ではありませんが、私はそうする必要はありません、私の質問への答えです。

さらに明確にするために:私がやろうとしていたことをわざわざやらないでください。Boostのシリアル化ライブラリを使用していて、コードをandroid ndk r8d以前で実行したい場合は、あきらめてください。シリアル化を機能させる方法に関する有用な情報が見つからないため、自分でシリアライザーを作成してください。うまくいけば、ndkの将来のリリースでこの問題が修正されますが、今のところ、すべてを書き直す以外に選択肢はありません。

于 2013-04-10T14:27:09.817 に答える
0

私も同じ問題を抱えていました。boost::serializationを使用するコード用のAndroidポートを作成していました。

mbtowc/ wctomb(mb:multi-byte(char)、wc:(wide-char)'の実装が欠落しているため、コードをコンパイルできませんでした。

これらの関数の実装は、Androidのワイド文字が真のワイド文字ではなく1バイト文字であることがわかっている限り、おそらく注意が必要です。

しかし、私がブーストをコンパイルすると-DBOOST_NO_STD_WSTRING、リンクエラーが消え、Androidでboost::archive::text_iarchive&を使用できました。boost::archive::text_oarchive

現在、数値とstd::stringsのSTLコンテナを問題なくシリアル化しています。

このリンクのアドバイスに従って、Android用のブーストをコンパイルしました:http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

boost-1.55_0とNDKr9cを使用しています。

<compileflags>-DBOOST_NO_STD_WSTRINGワイド文字をサポートせずにシリアル化ライブラリをビルドできるように、ビルドコマンドに以下を追加しました 。

于 2014-05-12T17:26:38.063 に答える