IK.AM

@making's tech note


JavaでiOSアプリをつくる(RoboVMインストールメモ)

🗃 {Programming/Java/RoboVM}
🗓 Updated at 2013-07-13T05:28:47Z  🗓 Created at 2013-07-13T05:28:47Z   🌎 English Page

JavaでiOSアプリケーションをつくるためのRoboVMを試す。

http://www.robovm.org/

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をつけるとシュミレーターが立ち上がる。

次はJavaFXでUIを作るのを試す


✒️️ Edit  ⏰ History  🗑 Delete