Androidのadbシェルネイティブプログラムでstlを使用する

私はAndroid ADBシェルから実行したいC ++ユーティリティー・プログラムを移植しようとしています。 そのために、私はAndroid NDKのmake-standalone-toolchain.shスクリプトを使用していて、それを使って自分のプログラムをコンパイルしています。 残念ながら、私はそれを実行しようとすると、私はこのエラーが表示されます:

reloc_library[1315]: 16304 cannot locate '_ZNKSs5c_strEv'...
CANNOT LINK EXECUTABLE

いくつかの研究の後で、私は、これは、libstdc ++にc_str関数が存在しないことを意味しています。私もstlport.soでシンボルを見つけることができず、実際には./sources/cxx-stl/gnu-libstdc++/libs/バージョンのC ++ライブラリでしか見つかりませんでした。これらのライブラリは、私が作ったスタンドアローンのツールチェーンには含まれておらず、デバイス上でも見つかりませんでした(デバイスはHoneycombを実行しています)。

NDKのテキストには、stlportを使用するとSTL全体のサポートが明確に記載されています。これはアイスクリームサンドイッチでのみ正しいことですか? libstlport.soまたはlibsupc ++。soのデバイスとNDKには、見つからなかったような署名はありませんでした。

だから私の質問は2つの部分を持っています:

  1. ビルドプロセスやAndroidの設定に欠けているものはありますか?プログラムをgnu-libstc ++を使わなくてもコンパイルできるように、あるいは少なくともデバイスにロードするのではなくコンパイル/リンクエラーで失敗するように、設定を変更することはできますか?
  2. gnu-libstc ++とのリンクが唯一の方法であれば、どうすればよいのですか?私は静的にそれにリンクを管理することができると思うが、私はむしろそうしたくない。

どうすればgnu-libstdc ++のバージョンを私のマシンに追加できますか?

1
別のSTL実装(静的stlportまたは静的gnustlなど)を選択するには、Application.mkファイルのAPP_STL変数を使用します(docs/CPLUSPLUS-SUPPORT.htmlファイルを参照)。
追加された 著者 Mārtiņš Možeiko,
次に、ndk-buildがSTL実装を選択する方法を調べます(特定のCFLAGSとLDFLAGSを選択します)。スタンドアロンのツールチェーンに同じコンパイラとリンカーのフラグを選択すれば、静的なSTLライブラリを選択することができます。
追加された 著者 Mārtiņš Možeiko,
残念ながら、私はスタンドアロンのツールチェーンを使用しているので、私はそれを行うことはできません。一般に私はアクティビティをコンパイルしていませんが、adbシェル(psやcpに似ています)
追加された 著者 nitzanms,

1 答え

他の誰かが解決策を探していると、libgnustl_shared.soの-lスイッチを使って依存関係を追加しました。あなたはNDK内でそれを見つけることができます

sources/cxx-stl/gnu-libstdc++/libs/<architecture>/

次に、この.soをプログラムと一緒にデバイスにプッシュし、現在のディレクトリをLD_LIBRARY_PATHに追加するスクリプトを作成しました。 makeスクリプトを使ってgnustlに依存するプログラムを作成したときのNDKの動作と似ています。

0
追加された