JavaFX on RPi 〜ラズパイでJavaFX〜

イントロダクション

前回はラズパイにSSHで作成したJarファイルを送信しました。

でもJavaFXは起動できませんでした。それはARM(ラズパイで使用しているCPU)で起動するためのJDKを使用しないといけないのが原因の様です。

ちなみに、JavaFXは下のようなGUIアプリケーションを作成することができます。
画面上のPNG画像を動かして、画面の下部分に文字を表示したりしています。

Introduction

Last time, we tried to upload jar file to RPi using SSH. But we can not execute JavaFX. Because it is need to use JDK for ARM.

Gluonからインストールする

参考サイトはラズパイのサイトです。
GLUONのJavaFXPortsからラズパイ用のJavaFXをダウンロードします。

2.1.4. Embedded
The latest version of JDK 8 installed on your embedded device, available from http://www.oracle.com/technetwork/java/javase/downloads/index.html

The latest version of the JavaFX Embedded SDK port, available from http://gluonhq.com/open-source/javafxports/downloads. Unzip the downloaded JavaFX Embedded SDK and copy the following files into the JDK 8 installation directory:

ダウンロードしたファイルが、ZIPファイルだったので下のコマンドで、

unzip

コマンドをインストールします。unzipの参考サイト

sudo apt-get install xarchiver

そして解凍します。

unzip XXXXX.zip

JARファイル コピー先
armv6hf-sdk/rt/lib/ext/jfxrt.jar jre/lib/ext/
armv6hf-sdk/rt/lib/arm/* jre/lib/arm/
armv6hf-sdk/rt/lib/javafx.platform.properties jre/lib/
armv6hf-sdk/rt/lib/javafx.properties jre/lib/
armv6hf-sdk/rt/lib/jfxswt.jar jre/lib/

そのあとの、設定方法=ビルドする手順(Gradleの使用方法など)

ダメだったケース(can not execute javafx)

役に立たない情報です。が一応残しておきます。

Build tool for ARM

こちらのサイトを参考にクロスコンパイル(OSが違っても同じ様に起動ファイルを作成する)をする準備をします。

acording to this site. we will setup for closs-compile for JavaFX. using 「JavaFX Embedded SDK」

こちらのページからSDKをダウンロードします。今回は「JavaFX Embedded SDK」をダウンロードしました。

そして、JavaFXをラズパイ上で動かすのに必要な設定のチュートリアルを参考にセットアップを行います。※上のチュートリアルはイマイチでしたので下のチュートリアルも参考にします。

チュートリアルその2 

結局、RPi用JDKをRPiにインストール

使用しているPCでARM用のJDKをダウンロード(jdk-8u181-linux-arm32-vfp-hflt.tar.gzをダウンロードしました。)

必要と思われる部分を選択して記載しています。

I have picked up point that I think it will need to execute JavaFX

0.ブートローダを再インストール

sudo apt-get update
sudo apt-get install raspberrypi-bootloader --reinstall

1.JDKをインストールする領域を確保する(prepare enogh room to install JDK)

2.デスクトップを使用しない設定をする(using CUI mode)

3.「raspi-config」で「Advanced Option」→「Memory Split」を選択し「50/50」に設定する。→設定後に再起動する("raspi-config → select "Advanced Option" → "Memory Split" → set 50/50 → reboot RPi)

4.SSHサーバーを起動する設定をする( setup using SSH server)

5.インストールしたJDKにSDKを追加する

・サイトより「JavaFX Embedded SDK」をダウンロード(Download left link)

・SSHでRPiにアップロード (upload to RPi using SSH)

・unzipで解凍「sudo unzip armXXXX-sdk-XXX.zip 解凍先」(unzip on RPi using "unzip" command like "sudo unzip SDK.zip 「unzip directory」".

$cd target directory
$unzip SDK.zip

・SDKの中身を下の表にある様に配置する

armv6hf-sdk/rt/lib/ext/jfxrt.jar

jre/lib/ext/

armv6hf-sdk/rt/lib/arm/*

jre/lib/arm/

armv6hf-sdk/rt/lib/javafx.platform.properties

jre/lib/

armv6hf-sdk/rt/lib/javafx.properties

jre/lib/

armv6hf-sdk/rt/lib/jfxswt.jar

jre/lib/

※結局は「解凍したフォルダ/rt/lib」をJDK/libにコピペすれば、おっけ。

ちなみに自分が使用したコマンドは以下の通り

cp -r SDK/rt/jre/lib/ext /usr/local/jdk1.8XXXX/jre/lib
cp -r SDK/rt/jre/lib/arm /usr/local/jdk1.8XXXX/jre/lib
cp SDK/rt/jre/lib/javafx.platform.properties /usr/local/jdk1.8XXXX/jre/lib
cp SDK/rt/jre/lib/jfxswt.jar /usr/local/jdk1.8XXXX/jre/lib

そして以下のコマンドで実行。 execute like this.

sudo /<path to JDK>/bin/java -Djava.ext.dir=<arm-sdk dir>/rt/lib/ext -jar <executable JAR PATH>.jar

自分の場合は以下の様になりました。

/usr/local/jdk1.8.0_181/bin/java -Djava.ext.dir=./sdk/rt/lib/ext -jar RpiCtl.jar

これでもダメだった。。。

java.lang.UnsatisfiedLinkErrorが出力され動きませんでした。

調べた結果「libgtk-x112.0.so」ファイルがないのが原因でした。

なんでも32bit版でSDKをダウンロードするとついていない様です。。。

そんなわけでインストールします。

But I can not execute RpiCtl.jar...

get java.lang.UnsatisfiedLinkError  after execute jar

becase i have not "libgtk-2.0-0.so" that's why I will install one as bellow.

sudo apt-get install libgtk2.0-0

改めて実行!!! でもダメだった。。。

ここのページを参考にしました。

I hava got reslution from this page

XWindowシステムをCUIなのでインストールしていません。なのでJavaFXが動かない様です。。。

>sudo apt update
>sudo apt install raspberrypi-ui-mods

これでもダメでした。。。

仕方ないので (there is no way)

一度このやり方を断念します。

下の記事は不要な設定なので無視してください。

開発環境の構築(setting up Development enviroment)

・サイトより「JavaFX Embedded SDK」をダウンロード(Download left link)

・DLして解凍したら、各資源をいかに配置(Deploy as bellow)

armv6hf-sdk/rt/lib/ext/jfxrt.jar

jre/lib/ext/

armv6hf-sdk/rt/lib/arm/*

jre/lib/arm/

armv6hf-sdk/rt/lib/javafx.platform.properties

jre/lib/

armv6hf-sdk/rt/lib/javafx.properties

jre/lib/

armv6hf-sdk/rt/lib/jfxswt.jar

jre/lib/

※結局は「解凍したフォルダ/rt/lib」をJDK/libにコピペすれば、おっけ。

各IDEでの設定(Setting for IDE)

Eclipse

NetBeans

InteliJ IDEA

今回は、InteliJ IDEAを使用します。

・InteliJ IDEAを開き「IntelliJ IDEA -> Prefference」を開きます。

・Open InteliJ and select "IntelliJ IDEA -> Preference"

・同様に「Plugins」を選択します。

・And select "Plugins"

・リポジトリをブラウズします。

・Browze Rpositories

検索キーワード画面の左上に「Glu」と入れておくと楽です。

「Restart IntelliJ IDEA」と表示されたボタンがあるので押下再起動します。

restart IntelliJ IDEA from "Restart IntelliJ IDEA" button.

もともと書いていたソースは以下になります。

package rpictl.view;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;

import java.util.ResourceBundle;

public class RpiCtl extends Application {
    /** 画面の横サイズ */
    private static final int VIEW_WIDTH = 300;
    /** 画面のたてサイズ */
    private static final int VIEW_HEIGHT = 300;
    /** プロパティファイル名 */
    private static final String RPI_CTL_PROPERTY = "RpiCtl";
    /** リソースバンドル */
    private static ResourceBundle bundle;

     /**
     * Applicationクラスのメソッドをオーバーライド
     * @param primary 一番下肉るステージ
     */
    @Override
    public void start(Stage primary) {
        // ステージ上に載せるグループ(ペインの様なもの)
        Group root = new Group();
        root.getChildren().add(new Label("Hello World"));
        Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
        primary.setScene(scene);
        // フルスクリーン
        primary.setFullScreen(true);
        primary.show();

        // プロパティファイルのロード
        bundle = ResourceBundle.getBundle(RPI_CTL_PROPERTY);
        System.out.println("Properties: " + bundle.getString("test"));
    }

    /**
     * 起動するデバイス(ディスプレイ)のサイズを取得、起動する。
     *
     * @param root ルート・ペイン
     * @return Sceneクラス
     */
    private Scene createBaseScene(Group root) {

        return new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
    }

    /**
     * メインメソッド、JavaF≈を起動する
     *
     * @param args プログラム引数
     */
    public static void main (String[] args) {
        launch(args);
    }
}

新しくプロジェクトを作成します。初期画面(ダイアログ)から以下の様なダイアログを開き、「Gluon => Gluon Mobile」を選択します。(今回はラズパイにデプロイしたいので。。。)

 

 

 

 



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す