---
title: JavaでiOSアプリをつくる(RoboVMインストールメモ)
tags: []
categories: ["Programming", "Java", "RoboVM"]
date: 2013-07-13T05:28:47Z
updated: 2013-07-13T05:28:47Z
---

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`は初回めっちゃ時間がかかる。[ログ][1]が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向けも初回は時間がかかる。[ログ][2]。

-runをつけるとシュミレーターが立ち上がる。


<a href='/api/v1/files/00102/RoboVMIOSDemo.png'><img src='/api/v1/files/00102/RoboVMIOSDemo.png' width="40%" /></a>

次は[JavaFXでUIを作るのを試す][3]。


  [1]: /api/v1/files/00101/robovm-verbose.log
  [2]: /api/v1/files/00103/robovm-objc.log
  [3]: http://blog.software4java.com/?p=41
