Java Swing ラズパイ 起動メモ

イントロダクション

ラズパイ上でJava  Swingを自動起動させるのにエラーが発生して動かないので

動かすために調べた事のメモです。

動かない原因

Java Swingはデスクトップを起動する「X」というアプリがないと動かない。

ラズパイのCUIでは、Xが起動していないため、こいつを動かす必要がある。

どーやるか?

その一

https://www.raspberrypi.org/forums/viewtopic.php?t=26234

を参考にする。

その二

https://stackoverflow.com/questions/1529526/to-create-x-windowx11-in-java-swing-and-to-get-its-id

JavaからXを起動しているようだ

調べた事

ラズパイ上では

/etc/init.d/lightdm startでデスクトップ起動、ストップなどもある

ちょいとsudo lightdmコマンドについて調べてみる

LXDE

発見

ラズパイ での Swingの問題を解決する手順がある。

まだ試していません。

  1. ラズパイ 起動
  2. xを起動(lxde)
  3. デスクトップを表示せずにターミナルに戻る
  4. Javaコマンドを実行

https://lb.raspberrypi.org/forums/viewtopic.php?t=54025

1.ラズパイ起動時に自動ログイン

.config/lxsession/LXDE-pi/autostartファイルを作成する

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@pint-rpi
@vncviewer
・
・
・

結論

SwingではAWT(Abstract Window Toolkit)を使用するので、Xserverを起動する必要がある。

対策

Javaのアプリケーションから直接画像を書き出してしまう

→ファイルバッファを使うなど。。。

「Xvfb」仮想フレームバッファが使用できる。以下のサイトを参考にする。

https://github.com/processing/processing/wiki/Running-without-a-Display

 


関連ページ一覧

ラズパイ SSH接続メモ

RPi create build enviroment〜ラズパイにビルド環境〜

RPi Maven Install 〜ラズパイでMeven〜

update alternatives RPi ~ラズパイのJVMを切り替える~

RPi Install Git 〜ラズパイにGitのインストール〜

Install XFCE4 to RPi〜ラズパイにXFCE4のインストール〜

RPi JavaFX execution ~ラズパイでJavaFX起動~

ラズパイでJavaFXを起動する

JDKのインストール

注意点としては、ARM32のJDKをインストールするというところです。

参考にするサイトはオラクルのブログです。

ラズパイにRaspbianのFULLバージョンをインストールした場合の記述になっています。

そして、使用するJDKはLibraSoftが提供しているものです。
以下のコマンドを叩きます。

$ cd /home/pi 
$ wget https://download.bell-sw.com/java/13/bellsoft-jdk13-linux-arm32-vfp-hflt.deb 
$ sudo apt-get install ./bellsoft-jdk13-linux-arm32-vfp-hflt.deb 
$ sudo update-alternatives --config javac 
$ sudo update-alternatives --config java

ここでのポイントは「update-alternatives」コマンドです。
このコマンドは、使用するJDKを選択するものだと思ってくれればOKです。下のようなイメージです。

使用しているJDKが違うので注意してください。

余談ですが、GPIOの番号と機能に関しては、こちらです。

そして、確認を行います。

java --version

Mavenのインストール

ズバリ下のようにコマンドを叩くだけです。

cd /tmp
wget http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar xzvf apache-maven-3.6.3-bin.tar.gz
sudo mv apache-maven-3.6.3 /opt
echo "export PATH=/opt/apache-maven-3.6.3/bin:$PATH" >> ~/.profile
source ~/.profile

そして、実行するのですが、下のようなエラーが出ました。

Caused by: java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at application.Main.initWindowInfo(Main.java:154)
    at application.Main.<init>(Main.java:88)

どうやら、リモートデスクトップでの実行ではほかの設定が必要なようです。今後、接実行してみようと思います。

でわでわ。。。

<以前の記述です>

Oracle JDKをダウンロードしてやる場合

ラズパイでのJavaFXを起動時に実行する手順のメモです。

Introduction

This blog is a Memo for Execute to JavaFX on RPi2 when start up.

設定するもの一覧(List of setting files)

  1. JDK + jfxswt.jar amd etc...
  2. raspi-config(ラズパイの設定)
  3. ./config/lxsession/LXDE-pi/autostart

1.JDKの用意(setting up JDK)

以下のようにOpemJDKに必要なファイルをコピーして配置します。既にファイルを配置しているのであれば飛ばしてよいです。

Setting up as below. if you have jfxrt.jar et... on your JDK then you do not setting up as bellow.

開発環境の構築(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にコピペすれば、おっけ。

2.raspi-config

ラズパイの起動設定を行います。

  1. ラズパイにログイン、ターミナル(コマンド画面)を起動します。
  2. 右のコマンドをたたく「sudo raspi-config」
  3. 「Boot Option」→「Desktop \ CLI」→「Desktop Autologin」を選択

3.「./config/lxsession/LXDE-pi/autostart」

このファイルが存在しない場合は、作成してください。そしてこのファイルの中身に以下の記載を追加します。

If you can not find "aoutostart" file then you create one. And write this file as below.

@"実行したいコマンド(アプリ)

※自分の場合はJavaFXを起動したいので、以下のようなシェルスクリプトを作成し実行しましたので以下のようにシェルを書きました。

In my case, I had created shell script on "~/"(My user root dir). And execute JavaFX from this script/

./config/lxsession/LXDE-pi/autostart

@sh ~/javaExe.sh

~/javaExe.sh

"JDK_PATH"/bin/java -jar "JavaFx.jar"


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」を選択します。(今回はラズパイにデプロイしたいので。。。)

 

 

 

 



RPi and JavaFX sample of deployment 〜ラズパイにサンプルデプロイ〜

イントロダクション

RPi(ラズパイ)にJavaFXで作成した画面をデプロイして起動するテストを行います。

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

〜RPiのセットアップ〜

ラズパイのインストールなど(コンソールのみ)

ラズパイでWifi接続

ラズパイのセットアップで使用したコマンドなど

Introcuction

I will deproy to RPi and execute JavaFX on RPi to testing deployment java apps.

〜Abount setting up RPi〜

・Installing RPi in CUI

・settingup wifi on RPi

・Memos abount commands for setting up RPi

詰まったところ

1.「RPi(ラズパイ)にLAN検索のための設定(インストールなど)をしていなかった。」

1.My RPi has not "nslookup" and "dig". That's why I can not find my Mac.

「nslookup」「dig」コマンドのインストール

$sudo apt-get install dnsutils

でインストール終了。

2.RPiがMac (使用している端末)から見つからなかった。

2.My Mac can not find RPi.

以下の様にコマンドを叩き探しました。

>arp -an

下の様に出力される

ポイントは下の様なIPアドレスを参考にする

>ifconfig

RPi(ラズパイ)で上のコマンドを叩く、そしてIPアドレスから対象のものを見つける

use "ifconfig" and find IP Mac and RPi.

>hostname

RPiで上のコマンドを叩きラズパイの端末名(ホスト名)を取得する

check RPi host name. my RPi host name is "raspberrypi".

今回は「raspberrypi」がそれでした。

※hostnameは変更が可能です。

>ssh pi@rasbberrypi

>sudo raspi-config

このコマンドでSSHが動いているかどうか確認、設定する

check ssh in "ssh pi@raspberrypi" command.

and "sudo raspi-config" to setting about SSH server.

参考サイト

Mac(Windows)でRPiにアクセスする

>ssh <RPiのユーザー>@<IPアドレス or ホスト名>

実行したコマンド

>ssh pi@192.168.XXX.XXX

この後に「続けますか?」と質問があるので「yes」と入力

<例>

 

しかし、ログインしているユーザーのみだったのでログインできませんでした。

But RPi is using "pi", so I can not login RPi. cause I have already logged in RPi.

<LANケーブルの設定>

</etc/network/interfaces>
#eth0を固定値でIPアドレスを設定する → これは接続できませんでした。
#Can not access RPi when I tried as bellow
iface eth0 inet static
address 192.168.XXX.XXX # 自分は192.168.88.88と設定しました。
netmask 255.255.255.0
gateway 192.168.XXX.254 # "XXX"は「address」と同じものにします。

#eth0をDHCPで設定する Using "eth0" for DHCP
iface eth0 inet dhcp →これは繋がった  I can connect RPi

 

sudo ifup eth0で"eth0"を起動します。※eth0を定義していない場合

if you did not set "eth0" then you write like this.

3.ユーザーがすでにログインしているユーザーのみだった

3."pi" user have been already logged in RPi.

ユーザーを新たに作成する。

create user on RPi.

ユーザー追加

sudo adduser "ユーザー名"

ユーザーパスワード(sudo権限あり)

sudo gpasswd -a "ユーザー名"

 改めて接続する Try again connect RPi

>ssh pi@192.168.XXX.XXX

以下の様な文言が出ました。赤字は隠した部分です。

The authenticity of host '192.168.XX.XX (192.168.XX.XX)' can't be established.
ECDSA key fingerprint is SHA256:KXxaXjFgIEb7I6KP5+kkGJUcYizlE8uaLUgV/z7wlK4.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
<<「yes」と入力 >>
Warning: Permanently added '192.168.XX.XX' (ECDSA) to the list of known hosts.
takunoji@192.168.XX.XX's password: 
<<パスワードを入力(input password)>> 
Linux raspberrypi 4.14.66+ #1137 Fri Aug 24 16:31:57 BST 2018 armv6l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

こんな感じで接続完了 you can see it as bellow

SSH接続の参考にしたサイト

そして、いよいよデプロイ Let's Deploy!

作成したJarファイルのディレクトリに移動します。

cd ~/ProjectX/out/artifact/XXX.jar

そして、下のコマンドを叩きます

### scp XXX.jar ユーザー名@192.168.XX.XX:/home/ユーザー名 ###
scp RpiCtl.jar takunoji@192.168.XX.XX:~/

ファイルのアップロードが完了しました。just you finished deploy your jar file.

OK! Let's execute jar file now!!

java -jar RpiCtl.jar

But I can not see javaFx view. cause as bellow だが、起動できず。。。

OpenJDKのJavaFX for ARM~

ARM用のJavaFXが必要なんですと。。。

 

 

 



ラズパイ(CUI)セットアップ

イントロダクション

夏休みの自由研究と称してラズパイ のセットアップを行います。ただし、GUI(デスクトップ)環境でなく、CUI(コンソール)環境です。

※夏休みはとっくに過ぎてしまいましたが…

Introduction

I just be called “Jiyukenkyu” that making from mobile to raspberry pi in CUI.

※But summer vacation is already finished...

目的

ラズパイ での携帯端末を作りJavaアプリを起動する(用途は考え中...)

Goal

Execute java apps on raspberry pi. (Now thinking how to use... )

詰まったところ

7 touchscreen」を使用して画面を表示するのに以下を接続
setting up to "7 touchscreen" to displaying raspberry pi as below.

  1. ひらひらのケーブル(connect to fluttering cable)
  2. GPIO用のピンケーブル(connect to GPIO cable)
  3. 電源ケーブル(connect to power supply cable)

これらを違う形で接続したかたったが、ケーブルの長さが足らず…結局この形になりました。

ログイン時のデフォルトユーザー(login user):pi、パスワード(password):raspberry

キーボード配列の変更(chage key board layout)

raspi-configを使用する

 SSHの自動ロード

sudo systemctl enable ssh

wifi接続の設定

lsusbコマンドでドングルの接続確認

これは単純にコマンドを叩いて対象のデバイス(USBドングル)の名前が表示されればおっけ。

iwlist wlan0(接続インターフェースの名前) scan

このコマンドで利用可能なアクセスポイントが表示されるのだが表示されなかった→USBのドングルがぬけていた(笑)

when i can not get list of accesspoint of wlan0, then I did not connect USB dongle(笑)

結局のところ

「lsusb」でデバイスの接続確認をする

「wpa_passphrase ESSID(Wifiの名前) passwd(パスワード)」で接続情報取得

「/etc/network/interfaces」に以下のプロパティを設定する

wpa_ssid "ESSID"

wpa_psk "パスワード"

「ifdown」でネットワークを終了

「ifup」でネットワーク起動

詳細はこちら。 detail is here

※自分の場合コマンドを行うときに「sudo」をつけて管理者権限で実行する必要がありました。