「RoboVM」はJavaのバイトコードを、ARMまたはx86コードに変換することができるコンパイラ(フリーソフト。GPLv2)。これを使えばJava言語を使ってiOSプログラムを作ることができます。
iOS用プログラムを開発してみたいJavaプログラマにとっては、便利なツールになるかもしれません。AndroidとiOSでコードを共有するなんてこともできるみたいです。
インストール
インストール方法は、「Getting started」に詳しく書いてありますがちょっとめんどうです。
- OracleのJava SE 7をインストール。
- Xcode 4.5.2をMac App Storeからインストール。
- XcodeのPreferencesメニューから、Command Line Toolsをダウンロードしてインストール。
- 以下のコマンドを実行して、LLVM toolsを/opt/llvm以下にセットアップ。
curl http://llvm.org/releases/3.2/clang+llvm-3.2-x86_64-apple-darwin11.tar.gz > llvm.tar.gz sudo mkdir -p /opt sudo tar xvfz llvm.tar.gz -C /opt sudo rm -f /opt/llvm sudo ln -s /opt/clang+llvm-3.2-x86_64-apple-darwin11 /opt/llvm
シンプルiOSアプリ
同じ場所に簡単なiOSアプリのサンプルプログラムが掲載されています。以下を IOSDemo.java として保存します。
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();
}
}
UIWindowや、UIButtonなど、iOSプログラマならお馴染みのクラスがJavaプログラムの中でも使われていることがわかります。ボタンに対する、イベントハンドラの登録は、イベントリスナーを作って登録するというJavaプログラマお馴染みの方法ですね。
このJavaソースコードをJavaバイトコードにコンパイル。
mkdir classes javac -cp /opt/robovm/lib/robovm-rt.jar:/opt/robovm/lib/robovm-objc.jar:/opt/robovm/lib/robovm-cocoatouch.jar -d classes/ IOSDemo.java
Javaバイトコード(*.class)をネイティブコードにコンパイルします(ここがやたら時間かかる)。
/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シミュレーターに画面が表示されます。
クリックすると数字がカウントアップされるということで。
まとめ
サイト上に「Warning! RoboVM is pre-alpha software.」と警告が表示されていることからもわかるように、まだ実用段階ではないと思いますが、今後の発展によってはおもしろいかもしれません。イベントハンドラの登録方法とか、Java方式のほうが分かりやすいと思うプログラマーも多いでしょう。
Javaソースコードのトランスレーターとしては、Googleの開発した「J2ObjC」なんてのもあるみたいです。