Android NDKが標準で備えるSTLを利用する

test114_01.png
Android NDKには標準でStandard Template Library「STL」が用意されている(ただし2010年末現在β実装)。今回はそれを使ってSTLプログラミングをしみる。
まずネイティブのソースコードをC++にするため拡張子をcppに変更する。

test114_02.png そしてSTLを利用したネイティブコードを実装する。
#include <string.h>
#include <jni.h>

#include <vector>
#include <string>
#include <iterator>
#include <algorithm>


extern "C" jstring
Java_com_Test114_Test114Act_stringFromJNI(JNIEnv* env,jobject thiz)
{
	std::vector<std::string>  vstrTest;

	//ランダムに追加
	vstrTest.push_back("A");
	vstrTest.push_back("D");
	vstrTest.push_back("C");
	vstrTest.push_back("B");

	//ソート
	std::sort(vstrTest.begin(),vstrTest.end());

	//結果の結合
	std::string		strOut;
	{
		std::vector<std::string>::iterator	ivnPos;

		for(ivnPos = vstrTest.begin(); ivnPos != vstrTest.end(); ivnPos++ )
			strOut += *ivnPos;
	}

	//出力
	return env->NewStringUTF(strOut.c_str());
}

test114_03.png 次にAndroid.mkを編集する。STL向けの設定項目はなく、単にソースファイルをcppに変えるだけだ。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Test114jni
LOCAL_SRC_FILES := Test114jni.cpp
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

test114_04.png
このままではAndroid NDKはSTLを認識しない。STLを使えるようにするためにはApplication.mkファイルを用意する。jniフォルダを選択して右クリックして現れるメニューの「New」にある「File」を選択する。

test114_05.png
そしてApplication.mkファイルを作成する。

test114_06.png 「APP_STL := stlport_static」の1行を追加する。これがAndroid NDKでSTLを使うための設定だ。今回はstaticライブラリとした。
APP_STL := stlport_static

test114_07.png
これでビルド/実行すると、STLによってソートされた結果が表示された。






test114_08.png メイン環境では上のApplication.mkで正常にビルドが終わったのだが、Virtual PC上の開発環境では下のようなエラーが出て失敗しました。どこかAndroid NDKのパス設定がうまくいっていないようで、ビルド済みのlibstlport_static.aが見つかっていないようです。
C:\Users\assist\Desktop\EasyProjectGenerator\Test114>bash -i -c "ndk-build"
Compile++ thumb  : Test114jni <= Test114jni.cpp
StaticLibrary  : libstdc++.a
Prebuilt       : libstlport_static.a <= <NDK>/sources/cxx-stl/stlport/libs/armea
bi/
SharedLibrary  : libTest114jni.so
C:/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld.exe:
C:/Users/assist/Desktop/EasyProjectGenerator/Test114/obj/local/armeabi/libstlport_static.a: No such file: Permission denied
collect2: ld returned 1 exit status
make: *** [/cygdrive/c/Users/assist/Desktop/EasyProjectGenerator/Test114/obj/local/armeabi/libTest114jni.so] Error 1

C:\Users\assist\Desktop\EasyProjectGenerator\Test114>pause
続行するには何かキーを押してください . . .

test114_09.png そんなときは、Application.mkに「STLPORT_FORCE_REBUILD := true」を追加すると、Android NDKに含まれるSTLのソースファイル一式が強制ビルドされてプロジェクトフォルダ内にlibstlport_static.aが生成、利用されるようになります。
APP_STL := stlport_static
STLPORT_FORCE_REBUILD := true

プロジェクトファイルをダウンロード

カテゴリー「android」 のエントリー