[JavaFX] How to build Open JavaFX for Android.

原文はこちら。
https://blogs.oracle.com/jfxprg/entry/how_to_build_open_javafx

Android dalvik向けにJavaFXをビルドする方法を手短にまとめました。いくつか必要なものがありますが、それぞれに注意すべきことがあります。それでは仕事にとりかかりましょう。

[訳注]
このエントリの原文にopen JavaFXといった表現がありますが、OpenJFXと読み替えています。

Sources

まずはOpenJFXリポジトリが必要です。これは簡単なものですね。いつものように落とし穴があります。おそらくご存知でしょうが、dalvikはJDK互換であり、Oracleからの古き良きJava VMと比べるとあるAPIがなくなっています。幸いにも、正規のOpenJFXからJDK7へのバックポートであるリポジトリがあり、これをJDK7からJDK6へ移植することが可能です。最初に行うことは、以下のリンクからリポジトリをクローンまたはダウンロードすることです。
JFX78(OpenJFX 8 Master RT のフォーク)
https://bitbucket.org/narya/jfx78
このプロジェクトのメインページには、「ある条件で動作します」とあるため、ほとんどの場合に動作すると想定しましょう。
申し上げた通り、あるAPIがないためにdalvik VMではビルドが失敗してしまいます。不足しているAPIを入手するために、利用可能なGitHub上の別の互換リポジトリを使いましょう。
robovm-jfx78-compat
https://github.com/robovm/robovm-jfx78-compat
Zipファイルをダウンロード、ソースをjfx78/modules/baseに展開します。JavaFXバイナリスタブも必要ですので、JDK8からjfxrt.jarを拝借しましょう。最後にダウンロードすべきものは、FreeTypeのソースです。これはネイティブフォントのレンダリングに必要です。
FreeType Downloads
http://www.freetype.org/download.html

Toolchain setup

これらの手順は、Linuxでのみテスト済みであることをお伝えしなければなりません。おそらく、Mac OS上でも最小限の変更で動作すると思います。また、OpenJFXのビルドが出来たものと想定しています。つまり、antやgradle、gcc、JDK8といった全てのツールがインストールされており、全てうまく動いている、ということです。これに加え、ネイティブコードのコンパイルのためにJDK7、Android SDK、Android NDKをダウンロードしインストールしておきましょう。
Android SDK
http://developer.android.com/sdk/index.html
Android NDK
http://developer.android.com/tools/sdk/ndk/index.html
インストールには少々時間がかかります。パスを通しておくことをお忘れなく。
export ANDROID_SDK=/opt/android-sdk-linux
export ANDROID_NDK=/opt/android-ndk-r9b
export JAVA_HOME=/opt/jdk1.7.0
export PATH=$JAVA_HOME/bin:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK

FreeType

FreeTypeがリリースしているソースをまずは展開します。ARM用にこれらをクロスコンパイルする必要があります。まずは~/work/ndk-standalong-19にインストールされている、クロスコンパイルのためのスタンドアロンのツールチェーンを作成しましょう。
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh  --platform=android-19 --install-dir=~/work/ndk-standalone-19
スタンドアロンのツールチェーンの作業の後、クロスコンパイルFreeTypeを以下のスクリプトで作成します。
export TOOLCHAIN=~/work/freetype/ndk-standalone-19
export PATH=$TOOLCHAIN/bin:$PATH
export FREETYPE=`pwd`
./configure --host=arm-linux-androideabi --prefix=$FREETYPE/install --without-png --without-zlib --enable-shared
sed -i 's/\-version\-info \$(version_info)/-avoid-version/' builds/unix/unix-cc.mk
make
make install
コンパイルし、FreeTypeライブラリを$FREETYPE/installにインストールします。後ほどこのインストールディレクトリにリンクを張ります。FreeTypeに既に含まれている、Android上で利用可能なskiaライブラリに対して動的にサポートするOpenJFXフォントをリンクすることもできます。ファイルサイズはより小さくなりますが、互換性の問題が派生する可能性があります。

Patching

javafx-android-compat.patchandroid-tools.patch の2個のパッチをダウンロードし、jfx78ディレクトリにこのパッチを適用します。これらのパッチをご覧になることをお薦めします。android-compat.patchでは、OpenJFXビルドスクリプトをアップデートし、SharedSecretクラスへの依存性を削除し、LensLoggerを更新してjdk固有のPlatformLoggerへの依存を削除します。もう一つのandroid-tools.patchはandroid-toolsのヘルパースクリプトを作成します。このスクリプトはJavaFX Androidプロジェクトをセットアップするのに役立ちます。

Building

では、ビルドしましょう。以下のスクリプトを実行します。
JAVA_HOME=/opt/jdk1.7.0
JDK_HOME=/opt/jdk1.7.0
ANDROID_SDK=/opt/android-sdk-linux
ANDROID_NDK=/opt/android-ndk-r9b
PATH=$JAVA_HOME/bin:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK:$PATH
gradle -PDEBUG -PDALVIK_VM=true -PBINARY_STUB=~/work/binary_stub/linux/rt/lib/ext/jfxrt.jar \
-PFREETYPE_DIR=~/work/freetype/install -PCOMPILE_TARGETS=android
エラーが出なければ、build/android-sdkにビルドしたものがあるはずです。

Create first JavaFX Android project

android-toolsにあるgradleスクリプトを使います。スクリプトはあなたのためのプロジェクト構造を設定します。以下のコマンドを使ってAndroid Hello Worldプロジェクトを作成し、このプロジェクトを最新ビルドのJavaFXランタイムとHelloWorlrdアプリケーションにリンクします。
  • NAME:Androidプロジェクト名
  • DIR:最初のプロジェクトを作成したディレクトリ
  • PACKAGE:Androidが必要とするパッケージ名。JavaFXアプリケーションのパッケージングとは無関係
  • JFX_SDK:最新ビルドのランタイム
  • JFX_APP:JavaFXアプリケーションのdistディレクトリ(全てのアプリケーションのjarファイルが配置される)
  • JFX_MAIN:メインクラスの完全修飾名
gradle -PDEBUG -PDIR=/home/user/work -PNAME=HelloWorld -PPACKAGE=com.helloworld \
-PJFX_SDK=/home/user/work/jfx78/build/android-sdk -PJFX_APP=/home/user/NetBeansProjects/HelloWorld/dist \
-PJFX_MAIN=com.helloworld.HelloWorld createProject
作成したプロジェクトにディレクトリを移動し、他のAndroidプロジェクトのように使いましょう。ant clean、debug、uninstall、installが使えます。IDEのEclipseやNetBeansからは試していません。
このエントリで使ったリポジトリは、Stefan FuchsとDaniel Zwolenskiの協力によるものです。どうもありがとうございます。

0 件のコメント:

コメントを投稿