JavaでiOSアプリケーションをつくるためのRoboVMを試す。
RoboVMはJVM言語をiOSにブリッジするためのプロジェクトで、コンパイラやランタイム機構、UIKitが用意されている。 コンパイラはJavaバイトコードをARMやx86のネイティブマシンコードに変換する。 ランタイムはAndroidがベースとなっている。これに加えてJavaからObjective-CへブリッジするライブラリやCocoa Touch APIをJavaから使うためのライブラリが含まれている。
XCodeがインストールされていること前提。
$ curl -O http://llvm.org/releases/3.2/clang+llvm-3.2-x86_64-apple-darwin11.tar.gz
$ sudo tar xzvf clang+llvm-3.2-x86_64-apple-darwin11.tar.gz -C /opt/
$ sudo ln -s /opt/clang+llvm-3.2-x86_64-apple-darwin11 /opt/llvm
$ wget http://download.robovm.org/robovm-0.0.2.tar.gz
$ tar xzvf robovm-0.0.2.tar.tar.gz -C /opt/
$ sudo tar xzvf robovm-0.0.2.tar.tar.gz -C /opt/
$ sudo ln -s /opt/robovm-0.0.2 /opt/robovm
$ emacs -nw HelloWorld.java
$ mkdir classes
$ javac -d classes HelloWorld.java
$ java -cp classes HelloWorld
Hello world!
$ /opt/robovm/bin/robovm -verbose -cp classes/ HelloWorld
$ ll HelloWorld
$ ./HelloWorld/HelloWorld
Hello world!
HelloWorld.javaは本当にHelloWorld
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
java.util.*系も普通に使えた。
robovm -verbose
は初回めっちゃ時間がかかる。ログが10000行近く出る。標準ライブラリをターゲットのアーキテクチャ向けに変換している模様。
何も指定していなかったら実行している環境(MacOSX)向けのバイナリが吐かれる模様。
リンクはこんな感じ
$ otool -L ./HelloWorld/HelloWorld
./HelloWorld/HelloWorld:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 9.6.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.18.0)
次にiOS向けアプリをコンパイルする。プログラムはドキュメントに載っているものそのまま
import org.robovm.cocoatouch.coregraphics.*;
import org.robovm.cocoatouch.foundation.*;
import org.robovm.cocoatouch.uikit.*;
public class IOSDemo extends UIApplicationDelegate.Adapter {
private UIWindow window = null;
private int clickCount = 0;
@Override
public boolean didFinishLaunching(UIApplication application,
NSDictionary launchOptions) {
final UIButton button = UIButton.fromType(UIButtonType.RoundedRect);
button.setFrame(new CGRect(115.0f, 121.0f, 91.0f, 37.0f));
button.setTitle("Click me!", UIControlState.Normal);
button.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() {
@Override
public void onTouchUpInside(UIControl control, UIEvent event) {
button.setTitle("Click #" + (++clickCount), UIControlState.Normal);
}
});
window = new UIWindow(UIScreen.getMainScreen().getBounds());
window.setBackgroundColor(UIColor.lightGrayColor());
window.addSubview(button);
window.makeKeyAndVisible();
return true;
}
public static void main(String[] args) {
NSAutoreleasePool pool = new NSAutoreleasePool();
UIApplication.main(args, null, IOSDemo.class);
pool.drain();
}
}
-os ios
をつけてiOS向けにコンパイル。
$ javac -cp /opt/robovm/lib/robovm-rt.jar:/opt/robovm/lib/robovm-objc.jar:/opt/robovm/lib/robovm-cocoatouch.jar -d classes/ IOSDemo.java
$ /opt/robovm/bin/robovm -verbose -arch x86 -os ios -cp /opt/robovm/lib/robovm-objc.jar:/opt/robovm/lib/robovm-cocoatouch.jar:classes/ -run IOSDemo
iOS向けも初回は時間がかかる。ログ。
-runをつけるとシュミレーターが立ち上がる。