ラズパイでjavafxを動かす方法　2020/07/12投稿

恐らく、かなり多数の方がラズパイでJAVA FXを実行する方法を探しているかと思うが日本語の情報が少ない為、ここに略記する。

Google先生で検索すると以下の記事が最も気になる。
https://qiita.com/sh1k1ya/items/72d40e6ef8b8cd51e68c
「RaspberryPiでJavaFXとGPIO制御を組み合わせてみる…が、まだ完成していないorz」

参考にしたが、なかなか動作させるに至らなかった

開発ツールはEclipseを使用
EclipseにJAVAFXを導入し、開発する方法は他サイトにゆずる。
＜やりたいこと＞
〇ラズベリーパイにsambaを導入してwindows上のeclipseでクロス開発環境を構築する
　windows10の場合は、プログラムと機能でsambaクライアントを有効にする必要もある
〇シーンビルダーで編集した実行可能jarを自動実行させる

＜実行手順略記＞
1.SDカードにRasbian OS　イメージを書き込み
2.初期設定
3.無線LANの設定
4.sambaのインストール

  <p><b>$/sudo apt-get install samaba</b></p>

5.smb.conf編集
<p><b>sudo nano /etc/samba/smb.conf</b></p>

最終行に追記
<p><b>
[raspberry_pi]
comment = Share
path = /home/pi/samba
public = yes
read only = no
browsable = yes
force user = pi
</b></p>
6./home/piにsambaフォルダを作成
<p><b>$ sudo mkdir /home/pi/samba</b></p>
7.  サービス起動  ※次回以降ラズパイ起動時にも自動起動される
　<p><b>$ sudo systemctl restart smbd</b></p>

8.javafxの配置
  ・https://openjfx.io/
　・JavaFX armv6hf SDKをダウンロードしZIPを解凍
　・解凍したファイル群をsambaフォルダに配置
　・armv6hf-sdkを右クリック　端末で開く
  ・パーミッション確認
  ・パスを通す　※パスを通すことでjavaFXのsoファイルが実行できる
    <p><b>\$ export PATH="$PATH:/home/pi/samba/armv6hf-sdk"</b></p>
　　
   ・パスの確認
    <p><b>/$ echo PATH</b></p>
    <p>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/pi/samba/armv6hf-sdk</P>

9.sambaに適当なJAVAFXを含む実行可能jarを配置
（例)
 ・コマンドラインに以下を入力すると実行できる
 <p><b>$ java --module-path /home/pi/samba/armv6hf-sdk/lib --add-modules=javafx.controls,javafx.fxml -jar /home/pi/samaba/test.jar</b></p>


<h1>EclipseでjavaFXプロジェクトを組む方法</h1>
   1.javaFX - javaFXプロジェクトを作成
　 2.プロジェクト名を入力
   3.ライブラリ追加でユーザーライブラリのJAVAFX11を配置
   4.JAVAFX11のネイティブライブライブラリロケーションを設定
   (例)C:\javafx-sdk-11.0.2\bin
   5.宣言的UIの言語をFXMLを選択
     名前などは適宜変更
　6.完了
　7.XXX.fxmlをシーンビルダーで編集
　　XXXXController.javaにコードを記載
　8.実行環境ｈはjava8を使用　java13を使っても良いがコマンドライン引数にモジュール化の宣言必要
  9.実行可能jarを作成　ユーザーライブラリのJAVAFX11はパッケージ化必要
  10./home/pi/samba に配置し実行権限付与 ※sambaで共有させたラズベリーパイ側のフォルダに直接出力
  11.以下、例に従いテスト実行
 <p><b>$ java --module-path /home/pi/samba/armv6hf-sdk/lib --add-modules=javafx.controls,javafx.fxml -jar /home/pi/samaba/test.jar</b></p>
 12.自動起動の設定
  
 以下コマンドを実行して、autostartファイルの雛形を、ホームディレクトリのコンフィグにコピー
  <p><b>$ mkdir -p ~/.config/lxsession/LXDE-pi</b>
  <b>$ cp /etc/xdg/lxsession/LXDE-pi/autostart ~/.config/lxsession/LXDE-pi/</b></p>

  13.autostartを編集
  <p><b>$ sudo nano  ~/.config/lxsession/LXDE-pi/autostart</b><p>
　設定ファイル末尾に追記
  <p><b>@java --module-path /home/pi/samba/armv6hf-sdk/lib --add-modules=javafx.controls,javafx.fxml -jar /home/pi/samaba/test.jar</b></p>
　
　14.再起動し自動起動を確認

<h3>最後に</h3>
ポイントはJavaFXの*.soファイルがある場所にパスを通すことと、実行時にモジュール化の引数を入れること

今回の、方法だとmediaplayerが例外が出て動かない。
ffmpegが、インストールされてない？よくわからない
うまく行ったら、また記載する

<h3>2020/7/14</h3>
JAVAFXを動かす方法が別に見つかったので記載する
以下のコマンドでbellsoftのJDKをインストールでき、sudo update-alternativesで切り替えもできる
前記の方法を見つけるのに相当時間を要したのに.....Orz...
<p><b>
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
</b></p>

<注意>
ラズパイのjavafxではなぜかMP3が再生できない。wavに変換してから使用せねばならない
前記の方法でmediaplayerで例外が出ていたのもこの理由..orz.orz...
変換には無料のRealPlayerを使った。広告がうざいが..

<2020/08/03追記>
13のautostartにコマンドを記述する場合、WindowsのBATファイルの様にCD /home/piなどと記述しても意味がない
java -jar /home/pi/samba/test.jar と絶対パスで記述しないと認識もしないし、起動時にエラーも出ない