コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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

具体的なビルドの流れは以下のような感じです。

  1. 各ソースをコンパイル
  2. YACCでparse.yからy.tab.cを生成
  3. y.tab.cをコンパイル
  4. mrbc.cをコンパイル
  5. mrbc.exeを作る (.exeになっているのはCygwinなので)
  6. mrbc.exeを使って array.rb, class.rbなど、rubyで書かれたスクリプトコンパイル
  7. コンパイルしたrbバイナリをcソースに埋め込んだ、mrblib.cを作成
  8. Gemsがあれば、コンパイル
  9. 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