MobileプラットフォームをJavaを使って
マルチにアレコレやるにはというのを考えるやつです。
ということでOpenJDK 9のモバイル対応の話。
基本的にOpenJDKに書いてある情報を適当に訳してたりしているだけです。
深く理解していない部分も多いので、間違ってたらコメント下さい。
概要
OpenJDKのProjectの1つ。
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で提供されるだろうとのこと)
- Android x86とarm対応(arm64はzero interpreterで提供されるだろうとのこと)
- Windows 10タブレットアプリ対応
- Javaランチャーのヘルパーインターフェースはモバイル用のJavaアプリケーションのプロセスに簡略化される
- Hello worldのサンプルアプリやもしくはプロジェクトテンプレートを各プラットフォームごとに提供する
一応それぞれのプラットフォームの開発手順などが載っている。
あと、Sample Projectも作られている様子。
iOS
http://openjdk.java.net/projects/mobile/ios.html
x64 simulatorとARM 64-bitデバイスをサポート、と。
x64実装は標準的なHotspot JITだがARM 64-bit実装デバイスはzero interpreterに制限される.
iOS ARMプラットフォームでは動的コード生成を許してないからだとか。
Hotspotの動的テンプレート生成インタプリタは厳密に禁止されてる。ランタイムでコード生成するので。
iOSのデバイスがサポートするCのインタプリタによってこの問題をwork aroundで解決しているとか。
せっかくなので、Sample Projectを落としてみる。
wget http://openjdk.java.net/projects/mobile/samples/hello-ios-x86_64.tar.gz
gzip -dc hello-ios-x86_64.tar.gz | tar xvf -
多分こんな感じか。
構成はこんな感じになっていました。
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を落としてきて実行してみると
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
Androidサポートはx86とarm。実行をエミュレーターもしくはデバイスですることが可能。
x86実装は標準のHotspot JITだがARM 32-bit実装はzero interpreterに制限された。
Android NDK & SDKが必要。
libffiというネイティブコンパイラを使っているらしい
こっちはiOSの方みたいにSample ProjectのURLは無さそうかな。hgのリポジトリURLはあるんだが。
Windows
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にするなどはさほど難しくないと思う。