Android NDKでSTLを使う

Androidでなんかやりたいなーと思いながら,土日でAndroid再入門 - Twitterクライアントを作ってみようを読みながらtwitterクライアントのようなものを作りました.

そのままだとUIがちょっとさみしいのでActionBarShaerlockという素敵なライブラリを使ってもっと頑張ろうというのはまた別の話.

Why NDK

この間つくったBackPropagationのプログラムをAndroid上で動かせないかなというのが事の始まりでした.
完全にJavaに移植しても良かったのですが,書きなおすのめんどくさいこれを機にNDKに触ってみようと思い試してました.

Download SDK


まず,Androidの開発環境の構築ですが,AndroidSDKでぐぐってトップに出てくるページにアクセスして,
Download the SDKをぽちっと押し,適当なフォルダに展開すればそれで8割終わりです.

Eclipseが入ってるのでそれを使って開発します.

次にNDK

Android NDKを使った開発環境の構築 - Yahoo!知恵袋が詳しいので,これにそってやってれば概ね問題ないです.

NDKのダウンロードはここから.

  • NDKをダウンロードして,適当なフォルダに展開
  • Window > Android > NDKでパスを設定
Androidプロジェクトの作成 > プロジェクトエクスプローラでプロジェクトを右クリック > AndroidTools > Add Native Support

jniディレクトリとかができます.

関数名は指定された形式である必要があるので,javahとかいうやつを使ってヘッダファイルを作成するんですが,
微妙にエラーが出たりします.

ここでちょこっと設定

jniディレクトリに,Application.mkファイルを追加.

APP_PLATFORM := android-10 #Android2.2でも動かしたいなら8

これで,テキストエディタにフォーカスした状態でcreate header file for NDKを動作させればヘッダファイルができるはず.

ヘッダができたら,宣言部分を.cppファイルの方にコピーして実装していく.

そしてSTL

STLを使う場合は,Application.mkに追記

APP_STL := stlport_static

ただ,ビルドが通ってもYour project contains error(s)とか言いやがってAndroidアプリケーションとして実行できない事案が発生していて辛い.

追記
ググったら解決できた.
Project->Properties->C/C++ General->Includesで以下3つを追加して,Application.mkを変更

PATH_TO_NDK/sources/cxx-stl/gnu-libstdc++/include
PATH_TO_NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include
PATH_TO_NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include

APP_STL := gnustl_static

に変更

2013/06/09追記

APP_STL := gnustl_staticさえApplication.mkを作成して記述しておけばSTLが使えた感じある.

C++11の機能を使う場合は,Android.mkに LOCAL_CFLAGS := -std=c++11 を追加.

参考