Gluon Mobile(無料)を試してみる

これは、JavaFX Advent Calendar 2016 - Qiita の12月5日分です。
前日の項目は、arachan@github さんの「JavaFX8でDatabaseを扱いたいけど未だできない - Qiita」でした。
翌日の項目は、y_q1m さんの「JavaFX で Flux アーキテクチャを実装する - Qiita」です。

(2016-12-06に、y_qlmさんの記事リンク追加と、リンク形式の変更を行いました)

ネタバレ

この項目、結局のところ、過去の「JavaFxPortsを試した」記事以下のものです。テンプレートのまんまですし。

(2014年)

kozake.hatenablog.com

(2015年)

erudoru.hatenablog.com

kozake.hatenablog.com

違うのは、Gluon Mobile無料版告知スクリーンやビルド失敗のお話です。 間抜けな失敗が多いのですが、きっと他にもやらかす人がいるはず、という勝手な想像で公開します。

JavaFxPortsからGluon Mobileへ

Gluonといえば、個人的にはOracleが公開をとりやめたScene Builderを代わりに公開している企業という印象です。同時にJavaFxAndroidで動かす「JavaFxPorts」も記憶にありました。

そして2016年、同社が推しているのはGluon Mobile。

gluonhq.com

これは、JavaFxPortsに次を加えたものです。

さらにJavaソースコードiOSで動かせるようにコンパイルすることで、PC/Android/iOS共通化が可能…と謳っています。どこまで共通でいけるのかはともかく。

また、共通UIコードでDesktop版も作れるため、基本的な動作確認はPCでできますし、内容によってはPC版も公開できます。Android / iOS / Windows / Linux / macOSの全てに対応するというのは、珍しい印象です。

「Buy Now」とあるので有料かと思いきや、「直接サポートなし」かつ「うっとうしい表示(Nag Screen)を許容する」なら無料だそうです。どのくらいうっとうしいのかが気になります。

開発機の条件

概要からビルドなども示したチュートリアル的な文書もあります。

Gluon Mobile Documentation
http://docs.gluonhq.com/charm/4.1.0/

ここに開発機の前提条件が載ってます。

  • JDK8(今回は1.8.0_111を使用)
  • Gradle 2.2以上(今回はAndroid Studio付属の2.14.1を使用)
  • iOS向けはMacOS10.9以上、Xcode6以上(今回は該当なし)
  • Android向けはAndroidSDKなど。API21(Android5.0)以上必須(今回はAndroid Studio 2.2.2とAPI21を準備)

Android5.0以上は、現時点では、ややユーザを絞ってしまうかも、という印象を受けます。4.0(ICS)はともかく4.4(KK)は結構残ってるんじゃないでしょうか。

その次は「2.1.4 Embedded」。これだけ開発というより動作条件のような気がしますが、組み込みは配布というよりハードも含めたシステム全体を作るという観点でしょうか。

Embeddedでは、Gluon自身による「JavaFX Embedded SDK port」を使います。 atmv6hf-sdkとあるので、Raspberry Pi(RasPi)等が前提のようです。

Oracleは昔、RasPiでJavaFxのデモをしたものの、しばらく後からOracle JREJavaFxは含まれなくなっていたので、そこを補完しているようです。OracleのRaspi向けJavaFXを本家の変更にあわせて更新したものかな?

ちなみにRasPiのJavaFxは(最初から)フルスクリーン表示のみです。 LXDEなどデスクトップ環境との同居はできません。 もっとも今回のように、スマートフォン向けアプリが主軸という場合は、全画面でも問題はなさそうです。

NetBeansで試してみる

Gluon Mobileを試すには、Javaの主要IDEプラグインか、サンプルプロジェクトの改造をしろとあります。 ここでは、最初に載っていたNetBeans8.2で試してみます。

チュートリアルとほぼ同じですが、日本語環境なのでスクリーンショットも一部入れておきます。

まず、メニューの「ツール」→「プラグイン」。 「使用可能なプラグイン」タブで、右上の検索欄に「Gluon」と入れます。

f:id:mokake:20161205123100p:plain

左の「Gluon Plugin」の左側のチェックを入れると、左下に「インストール」ボタンが現れるのでクリックします。あとはよくある流れでインストール。

f:id:mokake:20161205123148p:plain

f:id:mokake:20161205123203p:plain

f:id:mokake:20161205123217p:plain

途中で「これオレオレ証明書だけどいい?」ときかれます。

f:id:mokake:20161205123230p:plain

Gluonのチュートリアル画像にもあるので、これで正当らしいです。 Gradleも自己証明とのこと。

github.com

仕方ないので両方とも導入します。

インストール後、NetBeansを再起動。

最初のプロジェクトを作成

ここは、公式チュートリアル通りでいけると思います。 表記も、ウインドウタイトルなど周辺的なところを除けば同じです。

f:id:mokake:20161205123322p:plain

プラットフォームは、あえて全部選択してみました。iOS開発できませんけど。

(2016-12-06追記)メールアドレスは必須ですが、プロジェクトを作っても特にメールは来ません。ライセンスキーは空欄だと無料版となります。

f:id:mokake:20161205125202p:plain

最初は、フォルダも少なくエラー表示がついているのですが、左のプロジェクトフォルダを右クリックして「ビルド」してみると、一気にできあがりました。

f:id:mokake:20161205123501p:plain

ビルドできたので、さっそく実行してみます(Desktopにチェックが入っているので、実行できるのです)。

左上のプロジェクトフォルダを右クリックし、「Tasks」から「Run」、さらに「Run」を選びます。

f:id:mokake:20161205123600p:plain

無事起動し、無料版の「Nag Screen」が現れます。

f:id:mokake:20161205123618p:plain

どんなすごいものかと思いましたが、案外シンプルですね。「CLOSE」ボタンを押せば消えます。

もっとも、ユーザさんによっては「英語が出たよ!!」と大騒ぎになるのかな。

f:id:mokake:20161205123646p:plain

その後は過去のJavaFxPortsネタと同じです。

中央の「Change the World!」がボタンで、クリックすると上のラベルの文言が変わります。Change the Worldですからね。

f:id:mokake:20161205123709p:plain

Androidでも動かす(成功前1)

次はAndroid。 TasksのAndroidAndroidを選ぶとビルド開始です。

しかし、できません。

最初は「ANDROID_HOMEがない」というもの。 これは確かに手順に書いてあるのをさぼったためです。 今回は、プロジェクト内のBuild Scripts → Project → build.gradle に追記しました。該当部分を次に示します。

jfxmobile {
    downConfig {
        version = '3.0.0'
        plugins 'display', 'lifecycle', 'statusbar', 'storage'
    }
    android {
        manifest = 'src/android/AndroidManifest.xml'
        androidSdk = 'C:/Users/yourname/AppData/Local/Android/Sdk'
    }
// (iOSは割愛)
}

Androidでも動かす(成功前2)

これだけでは、うまくいきませんでした。

エラーメッセージは「android-support-multidex.jarがない」というもの。 Android Support Libraryに含まれるのですが、確かにエラーメッセージにあるパスが存在しません。

調べて分かったのですが、これ、Obsolete版のASLが必要です。 googleさんってobsoleteに冷たそうだし、こんな状態で大丈夫なんでしょうか?

それはともかく、Obsolete版を入れるには、Android Studio起動状態から Configure → SDK Manager → Launch Standalone SDK Manager として、昔からある詳細指定可能な単体SDK Managerを呼び出します。

f:id:mokake:20161205125130p:plain

そして、SDK Managerの左下「Obsolete」チェックを入れると出現する「Android Support Library (Obsolete)」をインストールします。

f:id:mokake:20161205123759p:plain

Androidでも動かす(成功前3)

しかし、先の設定を行っても新たなエラー。

:shrinkMultiDexComponents
:createMainDexList
:writeInputListFile
[ant:java] Java Result: 1
:dex FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':dex'.
> org.gradle.api.GradleException (no error message)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

同じ症状の人がいました。

stackoverflow.com

64bit Windows上の32bit JVMで動かすとエラーになるようです。 回答末尾にアドバイスがあります。

実は64bitのJDKも入れたのですが、Netbeansを64bit JVMで起動する必要があります。 確実なのはNetbeans設定ファイルの書き換え。

tigertaizo.hatenablog.com

管理者モードで起動したエディタ(改行がLFなので「メモ帳」は避けること)で、Netbeansフォルダのetcフォルダ内にあるnetbeans.confを開き、「netbeans_jdkhome」に64bit JDKフォルダを指定します。 自分の場合は、次の形です。

Netbeans自体が「Program Files (x86)」の下にあっても64bit指定で問題ありません。

netbeans_jdkhome="C:\Program Files\Java\jdk1.8.0_111"

これで、ようやくビルドが成功しました。 「Tasks → apk → apkDebug」を選ぶと、プロジェクトフォルダ下の build/javafxports/android にapkができます。

Androidでも動かす(成功前4)

エミュレータで動かしてみます。

Android Studioに含まれるエミュレータを起動します。 そうそう、現在のAndroid Studioは関連ツールをスタートメニューに登録しないので、Android SDKフォルダを何かしら登録しておくと楽ですね。 自分の場合は C:\Users\(ユーザ名)\AppData\Local\Android\sdk にありました。

起動後、コマンドプロンプトからインストール。

>adb install GluonSample01-unaligned.apk
4121 KB/s (7212688 bytes in 1.709s)
        pkg: /data/local/tmp/GluonSample01-unaligned.apk
Failure [INSTALL_FAILED_NO_MATCHING_ABIS]

失敗しました。

www.ie-kau.net

ネイティブコードがあり、x86エミュレータでは動かないようですね。

というわけで、エミュレータをARMで作り直しました。 ちなみに、既存エミュレータを変更したらトラブりました。 おすすめしません。

さて、先ほどと同様にadb install。今度は成功です。 初期設定では、アプリアイコンとしてGluonのロゴが入ります。

f:id:mokake:20161205123945p:plain

起動すると、しばらく画面が真っ黒ですが、やがて起動します。 Nag Screenが見えないのですが、真っ黒な間だったのでしょうか。

f:id:mokake:20161205124000p:plain

残念ながら、ボタンを押しても反応がありません。 何回か押していたら、アプリレベルではフリーズ?状態になってしまいました。

f:id:mokake:20161205124014p:plain

上の、メニューボタンなどのある領域をクリックしたところ、復帰しました。 ボタンも、無事反応しました。 どうやら起動がとても遅いようですね。 まあ、ARMエミュレーションなので仕方ありません。

f:id:mokake:20161205124027p:plain

ところで、チュートリアルには「困ったらフォーラムへ」とありますが、フォーラムは既に存在しません。 StackOverflowを使ってねとのこと。

それはそれでいいのですが、過去ログも消滅しているので検索で見つけた場合はキャッシュを見ましょう。

なお、試しにTextField(Glistenの1行テキスト。JavaFxのTextFieldとは少し違う)を入れてみたところ、起動はするものの画面の多くが真っ暗になりました。

おまけ:iOSコンパイル

試しにやっただけなので、特に追求はしていません。 Windows上なのでできなくて当然な気がします。

:createIpa FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':createIpa'.
> java.io.IOException: Cannot run program "security": CreateProcess error=2, 指定されたファイルが見つかりません。

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

まとめ

Gluon Mobile無料版で、PC(Windows)とAndroid(emu)での実行を一応確認しました。

一昨年や昨年と比べて、それほど完成度があがっていない印象で(例えばAndroid版でテキスト入力の際にソフトキーボードが出ても、表示領域がそのままなので、テキストボックスの位置によっては隠れてしまうなど)、ちょっと残念です。StackExchangeを見た印象だと、GUI部品を独自生成している印象(JavaFX自体もそうですが)なので、ネイティブ動作への対応が難しい面もありそうです。スマートフォンOSもPCのOSもカバーするクロスプラットフォームGUIライブラリは(アプリケーションによっては)とても貴重なので、特に。