AndroidもiOSにも対応、Mobile OpenJDK 9について

MobileプラットフォームをJavaを使って
マルチにアレコレやるにはというのを考えるやつです。


ということでOpenJDK 9のモバイル対応の話。

基本的にOpenJDKに書いてある情報を適当に訳してたりしているだけです。
深く理解していない部分も多いので、間違ってたらコメント下さい。


# 概要

OpenJDKのProjectの１つ。

[http://openjdk.java.net/projects/mobile/](http://openjdk.java.net/projects/mobile/)

Mobile OpenJDK 9はその名の通り、JDKをMobileのプラットフォームに移植しようというもの。


2016年11月現在、Java SE 9 のリリースは2017年の7月とされているので、
そこに含まれるはず、、という代物。たぶん。

# 対応プラットフォーム

Android,iOS,Windows

iOSやWindowsのアプリケーションもサポートしているのがミソ。

# 特徴

* JDK 9ベースの移植(ヘッドレス)
* 最低限のJDK 8の機能のサポート。compact2 profile (モジュール形式)
* iOS x64とarm64対応(arm64は[zero interpreter](http://openjdk.java.net/projects/zero/)で提供されるだろうとのこと)
* Android x86とarm対応(arm64は[zero interpreter](http://openjdk.java.net/projects/zero/)で提供されるだろうとのこと)
* Windows 10タブレットアプリ対応
* Javaランチャーのヘルパーインターフェースはモバイル用のJavaアプリケーションのプロセスに簡略化される
* Hello worldのサンプルアプリやもしくはプロジェクトテンプレートを各プラットフォームごとに提供する


##

一応それぞれのプラットフォームの開発手順などが載っている。
あと、Sample Projectも作られている様子。

## iOS  
[http://openjdk.java.net/projects/mobile/ios.html](http://openjdk.java.net/projects/mobile/ios.html)



x64 simulatorとARM 64-bitデバイスをサポート、と。
x64実装は標準的なHotspot JITだがARM 64-bit実装デバイスは[zero interpreter](http://openjdk.java.net/projects/zero/)に制限される.
iOS ARMプラットフォームでは動的コード生成を許してないからだとか。
Hotspotの動的テンプレート生成インタプリタは厳密に禁止されてる。ランタイムでコード生成するので。
iOSのデバイスがサポートするCのインタプリタによってこの問題をwork aroundで解決しているとか。


せっかくなので、Sample Projectを落としてみる。

```bash
wget http://openjdk.java.net/projects/mobile/samples/hello-ios-x86_64.tar.gz
gzip -dc hello-ios-x86_64.tar.gz  | tar xvf -
```

多分こんな感じか。


構成はこんな感じになっていました。

```bash
tree hello-ios-x86_64
hello-ios-x86_64
├── JavaLauncher.framework
├── build
├── build.xml
├── copy-jre.sh
├── hello
│   ├── AppDelegate.h
│   ├── AppDelegate.m
│   ├── Default-568h@2x.png
│   ├── Default.png
│   ├── Default@2x.png
│   ├── JavaLauncherArgs.properties
│   ├── ViewController.h
│   ├── ViewController.m
│   ├── en.lproj
│   │   ├── InfoPlist.strings
│   │   ├── ViewController.strings
│   │   └── ViewController.xib
│   ├── hello-Info.plist
│   ├── hello-Prefix.pch
│   ├── hello.h
│   ├── hello.m
│   └── main.m
├── hello.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   │   ├── contents.xcworkspacedata
│   │   └── xcuserdata
│   ├── xcshareddata
│   │   └── xcschemes
│   │       └── hello.xcscheme
│   └── xcuserdata
├── helloTests
│   ├── Info.plist
│   ├── JavaLauncherArgs.properties
│   └── helloTests.m
├── java
│   └── src
│       └── hello
│           ├── Printer.java
│           └── hello.java
├── manifest.mf
├── nbproject
│   ├── build-impl.xml
│   ├── genfiles.properties
│   ├── project.properties
│   └── project.xml
└── remove-jre.sh
```

なるほどおもいっきりNetBeanベースな感じがありますね。


ということで、NetBeans8.2を落としてきて実行してみると

```bash
ant -f /Users/yy_yank/hello-ios-x86_64 -Dnb.internal.action.name=run run
run:
/Users/yy_yank/hello-ios-x86_64/build.xml:99: Execute failed:
java.io.IOException: Cannot run program "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator" (in directory "/Users/yy_yank/hello-ios-x86_64"): error=2, No such file or directory
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
	at java.lang.Runtime.exec(Runtime.java:620)

```

ということで、Xcodeが必要。



Xcodeをインストールし、実行すると、XcodeのバージョンによりiOSのSimulatorのディレクトリが違うらしいのでbuild.xmlを修正する。ここの部分。

```
exec executable="/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"
```

で、Simulatorが動いてHello Worldだけ表示されるアプリがあらわれる！
はずなのだが出てきてくれない。よく分からない。そもそもこのSample Project自体が古い疑惑もある。ちゃんとしてるかも分からないのでこれ以上の深追いはやめる。



## Android
[http://openjdk.java.net/projects/mobile/android.html](http://openjdk.java.net/projects/mobile/android.html)

Androidサポートはx86とarm。実行をエミュレーターもしくはデバイスですることが可能。
x86実装は標準のHotspot JITだがARM 32-bit実装は[zero interpreter](http://openjdk.java.net/projects/zero/)に制限された。
Android NDK & SDKが必要。

[libffi](https://sourceware.org/libffi/)というネイティブコンパイラを使っているらしい


こっちはiOSの方みたいにSample ProjectのURLは無さそうかな。hgのリポジトリURLはあるんだが。

## Windows 
[http://openjdk.java.net/projects/mobile/windows.html](http://openjdk.java.net/projects/mobile/windows.html)


Windows Platform Implementation Details - Coming Soon!

Coming Soonですか、、いつですか。



# まとめ

情報がOpenJDKコミュニティとhgのソースコードのアクティビティしか無いので、
常にウォッチしてないと動きがわからない。

メーリングリストはあるので、そこに参加するのが一番分かりやすいかもしれないです。
みた感じ、2016年10月とかも活動しているので今のところアクティブなプロジェクトであるといえるでしょう。

Mobile OpenJDKの形式に合わせてJavaのプロジェクトを作れば、マルチプラットフォームにいけちゃうということだろう。
Maven、Gradleあたりのビルドツールとの連携ももちろん考えているはず。
NetBeansのantからは動いているわけで、そこからGradleのtaskにするなどはさほど難しくないと思う。