5分でmrubyをswiftから呼ぶ方法

 

f:id:yamshing:20160926213928p:plain

まずはmrubyをios用にビルドします。 こちら を参考にbuild_config.rbを編集します。

build_config.rb

MRuby::CrossBuild.new('ios_sim') do |conf|
	toolchain :clang

	SDK_PATH_SIM = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk"
	ARCH_SIM = "-arch x86_64"

	conf.cc.flags << "#{ARCH_SIM} -mios-simulator-version-min=9.0"
	conf.cc.include_paths << "#{SDK_PATH_SIM}/usr/include"
	conf.linker.flags << "#{ARCH_SIM}"
	conf.linker.library_paths << "#{SDK_PATH_SIM}/usr/lib"

	conf.bins = []

	conf.gem :core => "mruby-print"
	conf.gem :core => "mruby-math"
	conf.gem :core => "mruby-enum-ext"
end

これをbuild_config.rbの最後に追加してrakeします。

次にxcodeでFile → New して"Single View Application"を作ります。

Build Setteings → Search PathsのHeader Search Paths とLibrary Search Pathsに mrubyのincludeフォルダとbuild/ios_sim/libのフォルダをセットします。

Build Phases → Link Binary With Librariesに追加で(+ボタン)libmruby.aを追加します。

mrubyのC関数をswiftから呼べるようにするためにbridging-headerを作ります。
File → Newから.h ファイルを選んで"ProjectName-Bridging-Header.h"
という名前(ProjectNameはそれぞれのプロジェクト名が入ります)で作りましょう。
このヘッダーファイルをbridgeとして使うための設定をしなければなりません。
Build Settings → Swift Compiler -Code Generation の中のObjective-C Bridging Headerにこのファイルのパスを
入れましょう。おそらく"ProjectName/ProjectName-Bridging-Header.h"となります。

いよいよmrubyを呼び出すswiftコードを書きます。

ViewController.swift

override func viewDidLoad() {
	super.viewDidLoad()
	let rubycode = "puts 'mruby Hello, world!!'";
	var mrb:UnsafeMutablePointer = nil
	mrb = mrb_open()
	mrb_load_string(mrb, rubycode)
}

ViewController.swiftのviewDidLoadをこのように書いてみましょう。
Run すればシミュレーターが起動してoutputに"mruby Hello, world!!"が出力されるはずです。