Kishima's Hateda log

はてなダイアリー記事の保管庫

Mac上で、Android向けにmrubyをビルドする

まずNDKをダウンロードしてくる。
http://developer.android.com/sdk/ndk/index.html
こちらを参考に、ndk-buildでビルドしてみようとしたのですが、見に行くパスが変な感じになってしまい、追うのがちょっと面倒そうなので、直にビルドした。
たぶんやり方はあるのだと思う。

make: *** No rule to make target `/Users/kishima/Develop/android-ndk-r8/sources/cxx-stl/stlport/../../tools/mruby/mruby.c', needed by `/Users/kishima/Develop/mruby/ndk_mruby2/jni/mruby/android/obj/local/armeabi/objs/mruby/__/__/tools/mruby/mruby.o'. Stop.

android-ndk-rX/toolchains 以下のコンパイラを使ったり、android-ndk-rX/platforms 以下のヘッダとライブラリをパスに加えれば、特に難しいことはないのだけど、いくつか個別にオブジェクト(crtbegin_dynamic.o, crtend_android.o)が必要なのと、ビルドの途中でmrbcが必要になるのでそこは注意しないといけなかった。

mrbcが必要な理由は、下記の説明が詳しい。
http://www.oki-osk.jp/esc/mruby-oa/02.html

mrblib/ の下には Ruby 言語で書かれたクラス定義とモジュール定義が array.rb 等のファイルとして置かれている。 まず,これらをすべて連結して1本のファイル mrblib/mrblib.rbtmp を作成する。

Ruby 言語で書かれた mrblib/mrblib.rbtmp を -B オプション付きの bin/mrbc で中間言語コンパイルし,C 言語配列として表現された中間言語コードへと変換する。 -B オプションの引数は C 言語配列名,-o オプションの引数は出力ファイル名である。 そうして得られた出力ファイル mrblib/mrblib.ctmp を mrblib/init_mrblib.c と連結して1本の mrblib/mrblib.c を作成する。 mrblib/init_mrblib.c には C 言語配列で表現された中間言語仮想マシンに読み込ませて実行する C 言語関数が書かれている。

エミュレータ上で動かしてみると

# ./mirb
mirb - Embeddable Interactive Ruby Shell

This is a very early version, please test and report errors.
Thanks :)

> puts "Hello World"
Hello World
=> nil

単にRuby動かしたいだけなら、(リソースに余裕があれば)Android上で普通のCRubyでも動かせられる*1ので、libmruby.a をどんな風に使うかがmrubyのポイントかと思う。
リソースが無い環境も一つのポイントだけど、そういう環境でどこまでmrubyが使えるものなのかは、追ってもう少し調べてみたいところ。最近は組み込みと言っても広いので人によって思うところがずれがちなので、必要リソースをきちんと定義できればいいなと思う。