![]()
Android NDKには標準でStandard Template Library「STL」が用意されている(ただし2010年末現在β実装)。今回はそれを使ってSTLプログラミングをしみる。
まずネイティブのソースコードをC++にするため拡張子をcppに変更する。
#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());
}
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Test114jni LOCAL_SRC_FILES := Test114jni.cpp LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
![]()
このままではAndroid NDKはSTLを認識しない。STLを使えるようにするためにはApplication.mkファイルを用意する。jniフォルダを選択して右クリックして現れるメニューの「New」にある「File」を選択する。
APP_STL := stlport_static
![]()
これでビルド/実行すると、STLによってソートされた結果が表示された。
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 続行するには何かキーを押してください . . .
APP_STL := stlport_static STLPORT_FORCE_REBUILD := true
プロジェクトファイルをダウンロード
