mrubyをAndroid用にNDKでビルドする

Rubyを勉強するか!と思い立ったので、とりあえずmrubyをbuildしてみます。

<追記>
ここにbuildに必要なものとか手順を公開しています。
</追記>

gccのcross-compileで普通にbuildしても良いのですが、それは先人がすでにやっているようなので、
NDKに付属しているndk-buildでbuildできるようにしてみたいと思います。

ビルドに必要なものでgccとか以外だと、

  1. Android NDK
  2. bison

くらいでしょうか。


やることはこんな感じ。

  1. mrubyのソースコード取得
  2. android用のディレクトリ作成
  3. ホスト用のbuild
  4. NDK用のAndroid.mk作成
  5. NDKでbuild


ということでやりましょう。

$ git clone https://github.com/mruby/mruby.git
$ cd mruby
$ mkdir -p android/jni
$ make

ここまでで、ホスト用のbuildが終わります。
次にAndroid.mkをandroid/jniに作ります。
こんな感じです。

LOCAL_PATH  := $(call my-dir)
BASE_CFLAGS := -Wall -Werror-implicit-function-declaration -O3
RUBY_ROOT   := ../..
YACC        := bison
YC          := $(RUBY_ROOT)/src/y.tab.c
YSRC        := $(RUBY_ROOT)/src/parse.y
DLIB        := $(RUBY_ROOT)/mrblib/mrblib.ctmp
RLIB        := $(RUBY_ROOT)/mrblib/mrblib.rbtmp
MRBS        := $(RUBY_ROOT)/mrblib/*.rb

include $(CLEAR_VARS)

$(shell $(YACC) -o $(YC) $(YSRC))

LOCAL_MODULE    := mruby
LOCAL_CFLAGS    := $(BASE_CFLAGS)
LOCAL_C_INCLUDES:= $(RUBY_ROOT)/include $(RUBY_ROOT)/src
LOCAL_SRC_FILES := $(RUBY_ROOT)/tools/mruby/mruby.c
LOCAL_LDLIBS    := -lm
LOCAL_STATIC_LIBRARIES := mruby_lib mrblib

include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)

LOCAL_MODULE           := mruby_lib
LOCAL_CFLAGS           := $(BASE_CFLAGS)
LOCAL_C_INCLUDES       := $(RUBY_ROOT)/include $(RUBY_ROOT)/src
LOCAL_SRC_FILES        := $(wildcard $(RUBY_ROOT)/src/*.c)
LOCAL_LDLIBS           :=
LOCAL_SHARED_LIBRARIES :=

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

$(shell cat $(MRBS) > $(RLIB))
$(shell $(RUBY_ROOT)/bin/mrbc -Bmrblib_irep -o$(DLIB) $(RLIB))
$(shell cat $(RUBY_ROOT)/mrblib/init_mrblib.c $(DLIB) > $(RUBY_ROOT)/mrblib/mrblib.c)

LOCAL_MODULE           := mrblib
LOCAL_CFLAGS           := $(BASE_CFLAGS)
LOCAL_C_INCLUDES       := $(RUBY_ROOT)/include $(RUBY_ROOT)/src
LOCAL_SRC_FILES        := $(RUBY_ROOT)/mrblib/mrblib.c
LOCAL_LDLIBS           :=
LOCAL_SHARED_LIBRARIES :=

include $(BUILD_STATIC_LIBRARY)

もともと入っているMakefileを元に適当に作ってみました。

あとは適当にApplicaiton.mkとかを用意して、ndk-buildするだけですね。