[ことクロ5]RoboVM on iOS現状調査(あるいは、Google対Oracle代理戦争調査)

AltJavaの"Kotlinでスマートフォン・クロスプラットフォーム開発入門"、勝手に略して、"ことクロ"シリーズ　その５。

今回は、RoboVMチームがIntelliJを採用するまでの[JetBrains社による経緯解説](http://blog.jetbrains.com/idea/2015/10/robovm-and-the-move-to-the-intellij-platform/) (One IDE to rule them all – RoboVM Studio)を参考に、RoboVM Studioの現状を淡々と探っていたのだが、どうやら、今週末からのOracle JavaOneの祭りネタに行き当たったようなので、Google対Oracle代理戦争、、と釣り記事にさせてもらう(ここ数年、似たようなネタがあったような気がするが...本件、Javaな人々の見解がほしい...)

**FYI:RoboVM on iOSの今後、詳しくは、今週末の[Oracle JavaOne "RoboVM sessions"](https://robovm.com/robovm-at-javaone-and-oracle-open-world/)でってことらしい。**

=> Googleが担ぐAndroidStudioのJetbrain社と、AndroidもiOSもOracle-JDKでっていうOracleの方向性に延長線上にあるRoboVM&Kotlinのネタなので、けっこうこの先が気になっている。

Cf.Javaの本家と分家の争訟について:
[OracleとGoogleの判決文を斜め読む](http://qiita.com/shibukawa/items/9c99321b8edb6fc09cce)
Cf.SQLite代替のクロスプラットフォームデータベースRealmチームからの釣り記事(?):
[(日本語訳)Androidには新しい言語が必要か？ Kotlin JetBrainsが作ったJavaの代案](https://realm.io/jp/news/android-kotlin/)

#1) RoboVM Studioに関する[RoboVMチームのyoutube](https://www.youtube.com/watch?v=wwr3sMo-84s)
2015年9月の解説ビデオ:

- XcoceとJVMが入っているMacにRoboVM Studioをインストールすることで、RoboVMプロジェクトを扱えるIntelliJ環境が動く。
- Javaで書かれたiOSシュミレーターでのHelloWorldプログラムを実行。
- プログラムは、org.robovm.apple.uikit...のライブラリをインポートしている(すなわち、AppleのUIkitを使用)
- フリートライアル期間は14日

フリートライアル期間がもうちょっと長ければ、お試ししたいところだが・・・、もう少し基礎調査と考察をすすめることにする。

#2) 先人からの情報
## Java
８月時点での[RoboVMまとめ](http://qiita.com/garsue/items/0487aae7a4e45e313a36)。

RoboVM開発の基本形となる必要なjar(Cocoa Touchバインディング等)をクラスパスに入れて、javacコマンドでクラスファイルを生成し、robovmコマンドでターゲット機向けにビルドして実行する様子がわかる。引用:

```sh
javac -cp robovm-rt.jar:robovm-objc.jar:robovm-cocoatouch.jar:. HelloIOS.java
```

対象OSをiOS, CPUアーキテクチャをx86_64として指定してビルドする場合:

```sh
robovm -cp robovm-objc.jar:robovm-cocoatouch.jar:. -os ios -arch x86_64 -run HelloIOS
```
これらをgradleプラグインを利用した`build.gradle` ファイルで一括実行する書き方が参考になる。その他、RoboVM Studio1.5への言及もあり。
どうも10月に入ってRoboVMのライセンス体系が変わった関係か、環境導入方法が変わっているもようで、そのあたりは要調査。

## Groovy
github上のGroovyでRoboVMを動かすためのGradleプロジェクトのbuild.gradleを活用した[昨年末の事例](http://touchez-du-bois.hateblo.jp/entry/2014/12/26/025650)。一部動きはしたが、イベントリスナーのコードが動かなかったとのこと。。

## Kotlin
[今年５月時点でRoboVMのサンプルをKotlin向けにフォークした事例@github](https://github.com/ashleyj/robovm-samples-kotlin)。
=> Gradleラッパーであるgradlewを使ってビルドできるようになっている。

#3) 今夏のiOS9～今月のRobovm1.9まで
今夏の[RoboVM Studio1.6リリース時点の投稿](https://robovm.com/robovm-1-6-released-ios-9-xcode-7-support/)のビデオ(９分ちょい)が参考になる。
なるほど、IntelliJ相当のRoboVM StudioでAndroid向けのUI作って実行した後、XCodeでUI作って、それをRoboVM Studioにインポートするわけね。
あと、roboVMをObjective-C/Swift側に埋め込んだり・・・


そして、今月21日、JavaOne開催に合わせて、[RoboVM Studio1.9リリース](https://robovm.com/robovm-1-9-released/)とのこと。バージョンアップ早すぎ。。。

#4) 考察
Java/KotlinなどのJVM言語でクロスプラットフォーム開発、主な選択肢はどうやら３つ。

- コントローラとモデルはJVM。UI制御とViewはAndroid/iOSで別々。iOS向けにはうすいラッパーを書いて、Swiftのコード等をJVMから呼び出す。
- UI制御までJVM、Viewは個別。IntelliJ等でAndroidのViewを開発し、XCodeでiOSのViewを開発(RoboVMチームの推奨?）。
- UI制御はJVM、Android&iOSのViewも抽象化された何ものかを活用しJVM言語で共通的に記述。それって、次のJavaFX?? あるいは、RxJava系の未来???

現実には、３つ目の選択肢にまともなものはまだ存在しないが、Oracle対Googleの訴訟ネタと絡んで、RoboVM2.0以降は、Oracleも関与してなど、とならないか、若干期待。。Oracle社は最近改めてスマートフォンとJavaについての言及をしているようだが、公式見解はJavaOne待ちってことで・・・（続く）。

## 追記 :　現時点での自分の取るだろうアプローチを以下に書いた。
[Java資産を活かした、FRP的クロスプラットフォーム開発環境　一案](http://qiita.com/kmry2045/items/6a2aeddd4cf9ab0598cd)

=> 文脈はだいぶ違うけれど、RoboVM&Kotlinも使いものになるなら、それなりに使うよ、と考えている。