mrubyをAndroid用にNDKでビルドする
Rubyを勉強するか!と思い立ったので、とりあえずmrubyをbuildしてみます。
<追記>
ここにbuildに必要なものとか手順を公開しています。
</追記>
gccのcross-compileで普通にbuildしても良いのですが、それは先人がすでにやっているようなので、
NDKに付属しているndk-buildでbuildできるようにしてみたいと思います。
ビルドに必要なものでgccとか以外だと、
- Android NDK
- bison
くらいでしょうか。
やることはこんな感じ。
ということでやりましょう。
$ 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するだけですね。