mrubyをAndroid用にビルドする
mrubyをAndroidに実装するために、先ず、Android-NDKでmrubyをビルドする方法を調べました。既に、偉大な先人方がいろいろやられていたので悩むこと無くビルドすることができました。
防備録として、現在のmruby(2013.3.20版)をAndroidでビルドするためのAndroid-mkを書いておきます。Android用にmrubyをビルドされる方は、参考にしてください。
mrubyビルド用Android-mk
mrubyのソース一式は、jni/mruby/以下にすべて置いてあるものとします。
実は、mrubyはビルドにRubyを使います。よって、mrubyのMakefileの中身は下記にあるだけです。
Ruby ./minirake
具体的なビルドの流れは以下のような感じです。
- 各ソースをコンパイル
- YACCでparse.yからy.tab.cを生成
- y.tab.cをコンパイル
- mrbc.cをコンパイル
- mrbc.exeを作る (.exeになっているのはCygwinなので)
- mrbc.exeを使って array.rb, class.rbなど、rubyで書かれたスクリプトをコンパイル
- コンパイルしたrbバイナリをcソースに埋め込んだ、mrblib.cを作成
- Gemsがあれば、コンパイル
- mrubyを生成する
このようなビルドになっているので、Android-mkに単純にソース名を書いただけではndk-buildが通りません。そこで、OKIソフトウェアさんの「NDK 入門 〜MRuby を Android で動かそう〜」(http://www.oki-osk.jp/esc/mruby-oa/index.html)を参考にさせていただいて、Android-mkを作成しました。
jni直下には、mruby用の自作のプログラムが置いています。jni/mruby/にあるいろいろなソースを順次コンパイルしていく形になっています。出来上がりはSHARED_LIBRARYとなり、自作のjavaプログラムから呼び出して使うことができます。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := vm_module LOCAL_CFLAGS := -Wall LOCAL_C_INCLUDES := jni/mruby/include jni/mruby/src LOCAL_SRC_FILES := $(shell cd jni; echo *.c) LOCAL_SRC_FILES += mruby/build/host/mrblib/mrblib.c LOCAL_SRC_FILES += $(sort $(shell cd jni; echo mruby/src/*.c) mruby/build/host/src/y.tab.c) LOCAL_SRC_FILES += mruby/build/host/mrbgems/gem_init.c LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-math/src/*.c) LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-time/src/*.c) LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-struct/src/*.c) LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-sprintf/src/*.c) #LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-enum-ext/src/*.c) LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-string-ext/src/*.c) LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-numeric-ext/src/*.c) LOCAL_SRC_FILES += $(shell cd jni; echo mruby/mrbgems/mruby-array-ext/src/*.c) LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-math/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-time/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-struct/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-sprintf/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-string-ext/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c LOCAL_SRC_FILES += mruby/build/host/mrbgems/mruby-array-ext/gem_init.c LOCAL_LDLIBS := -llog MY_SRC_FILES := $(addprefix jni/, $(LOCAL_SRC_FILES)) $(MY_SRC_FILES): cd jni/mruby;make clobber: clean cd jni/mruby;make clean include $(BUILD_SHARED_LIBRARY) #include $(BUILD_EXECUTABLE)
ちなみに、Application.mkは下記のようです。allですべてのCPUについてビルドは通ります。
APP_PLATFORM := android-8 APP_ABI := all