DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

android-ndk-r6でstlportを動かす

これは以外とあっさりできました。

他のサイトをみると、gitでstlportをDLしてコンパイルしなきゃいけない等あると思いますが、android-ndk-r6だと必要無いようです。
単純にApplication.mkとAndroid.mkで実行できました。


ディレクトリ構成は以下のようにしました。

[\\D:\Develop\Eclipse]
└ MyProject(+)
  └ jni(+)
    ├ Application.mk
    ├ Android.mk
    └ stl_test.cpp
  └ res(+)
  └ src(+)
  └ AndroidManifest.xml
(など。他のDir/Fileは省略)


# 環境変数の設定
$ vi ~/.bashrc

export ANDROID_NDK_ROOT=/cygdrive/c/bin/android-ndk-r6
export STLPORT_DIR=$ANDROID_NDK_ROOT/sources/cxx-stl/stlport


# Application.mk

APP_PROJECT_PATH := $(call my-dir)
APP_STL := stlport_static

#APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk
APP_BUILD_SCRIPT := Android.mk
STLPORT_FORCE_REBUILD := true

APP_OPTIM:=debug
# APP_OPTIM:=release

どうやら「APP_BUILD_SCRIPT」を変更すればApplication.mkは他のフォルダでも動作しました。
ここのポイントは単純に「APP_STL := stlport_static」です。
とりあえず、「STLPORT_FORCE_REBUILD := true」も入れておきました。


# Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := DecryptNative
LOCAL_SRC_FILES := stl_test.cpp
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

LOCAL_SRC_FILESが変わったぐらいです。(当然*.cppに)


# stl_test.cpp
代表的なSTLが幾つか使えれば問題ないでしょうという事で


#include
#include


#include
#include
#include
#include


jstring
Java_stl_test (JNIEnv* env, jobject thiz)
{
std::vector v;
v.push_back ("A");
v.push_back ("D");
v.push_back ("C");
v.push_back ("B");

std::sort (v.begin (),v.end ());

std::string s;
for (std::vector::iterator ite = v.begin (); ite != v.end (); ite++)
s += *ite;

return env->NewStringUTF (s.c_str ());
}

んでCygwin上にてコンパイルすると

$ cd /cygdrive/d/Develop/Eclipse//jni
$ ndk-build clean && ndk-build


こんなログになるよ

Clean: DecryptNative [armeabi]
Clean: stdc++ [armeabi]
Clean: stlport_shared [armeabi]
Clean: stlport_static [armeabi]
Compile++ thumb : DecryptNative <= stl_test.cpp
Compile++ thumb : stlport_static <= dll_main.cpp
Compile++ thumb : stlport_static <= fstream.cpp
Compile++ thumb : stlport_static <= strstream.cpp
Compile++ thumb : stlport_static <= sstream.cpp
Compile++ thumb : stlport_static <= ios.cpp
Compile++ thumb : stlport_static <= stdio_streambuf.cpp
Compile++ thumb : stlport_static <= istream.cpp
Compile++ thumb : stlport_static <= ostream.cpp
Compile++ thumb : stlport_static <= iostream.cpp
Compile++ thumb : stlport_static <= codecvt.cpp
Compile++ thumb : stlport_static <= collate.cpp
Compile++ thumb : stlport_static <= ctype.cpp
Compile++ thumb : stlport_static <= monetary.cpp
Compile++ thumb : stlport_static <= num_get.cpp
Compile++ thumb : stlport_static <= num_put.cpp
Compile++ thumb : stlport_static <= num_get_float.cpp
Compile++ thumb : stlport_static <= num_put_float.cpp
Compile++ thumb : stlport_static <= numpunct.cpp
Compile++ thumb : stlport_static <= time_facets.cpp
Compile++ thumb : stlport_static <= messages.cpp
Compile++ thumb : stlport_static <= locale.cpp
Compile++ thumb : stlport_static <= locale_impl.cpp
Compile++ thumb : stlport_static <= locale_catalog.cpp
Compile++ thumb : stlport_static <= facets_byname.cpp
Compile++ thumb : stlport_static <= complex.cpp
Compile++ thumb : stlport_static <= complex_io.cpp
Compile++ thumb : stlport_static <= complex_trig.cpp
Compile++ thumb : stlport_static <= string.cpp
Compile++ thumb : stlport_static <= bitset.cpp
Compile++ thumb : stlport_static <= allocators.cpp
Compile thumb : stlport_static <= c_locale.c
Compile thumb : stlport_static <= cxa.c
StaticLibrary : libstdc++.a
make: Circular /cygdrive/d/Develop/Eclipse//obj/local/armeabi/libstlport_s
tatic.a <- /cygdrive/d/Develop/Eclipse//obj/local/armeabi/libstlport_stati
c.a dependency dropped.
StaticLibrary : libstlport_static.a
SharedLibrary : libDecryptNative.so
Install : libDecryptNative.so => jni/libs/armeabi/libstl_test.so