В предыдущем посте Установка Java и JavaFX на Raspberry Pi вы можете прочитать, как установить BellSoft LibericaJDK, чтобы иметь возможность запускать приложения JavaFX с графическим пользовательским интерфейсом на Raspberry Pi с процессором ARMv7 или ARMv8.

Но это не сработает для некоторых (более старых) версий Raspberry Pi, поскольку они используют процессор ARMv6, который несовместим с OpenJDK 11 по умолчанию, который является частью Raspbian OS.

Этот пост проведет вас через шаги, чтобы иметь работающие Java JDK и JavaFX 11 на этих версиях платы Raspberry Pi.

Подготовьте плату ARMv6 Raspberry Pi

Для этого поста я использую старую версию Raspberry Pi B + 1.2. Чтобы узнать, какая версия ARM используется, проверьте вывод «cat / proc / cpuinfo» в терминале:

$ cat /proc/cpuinfo

processor	: 0
model name	: ARMv6-compatible processor rev 7 (v6l)
BogoMIPS	: 697.95
Features	: half thumb fastmult vfp edsp java tls 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xb76
CPU revision	: 7

Hardware	: BCM2835
Revision	: 0010
Serial		: 000000005f9ba615
Model		: Raspberry Pi Model B Plus Rev 1.2

Чтобы получить четкое представление о различных версиях платы и ARM, посмотрите эту таблицу в Википедии. Платы с ARMv6:

  • Raspberry Pi 1 A и A +
  • Raspberry Pi 1 B и B +
  • Вычислительный модуль 1
  • Ноль 1,2, 1,3 и Вт

Подготовьте SD-карту с Raspbian OS (Полная версия)

Мы начинаем со свежей новой ОС Raspbian на SD-карте с помощью инструмента Imager.

Теперь, когда мы загружаем плату Rasberry Pi с процессором ARMv6 и проверяем версию Java, мы получаем следующий результат:

$ java -version 
Error occurred during initialization of VM 
Server VM is only supported on ARMv7+ VFP

Как и ожидалось, включенный по умолчанию OpenJDK для ARM создан для версии 7 или выше, поэтому не работает с Raspberry Pi B + 1.2 на базе ARMv6.

О Java JDK

Исходники Java доступны через проект с открытым исходным кодом OpenJDK. Так что любой может создавать пакеты Java JDK - да, вы даже можете сделать это сами! - и, к счастью, доступно множество бесплатных предварительных версий.

Установите Java 11 для ARMv6, предоставленную Azul

Только Azul, похоже, предоставляет версию ARMv6 с Zulu JDK, которая доступна бесплатно!

Давайте возьмем его со страницы загрузки и распакуем на Raspberry Pi.

$ cd /usr/lib/jvm
$ sudo wget https://cdn.azul.com/zulu-embedded/bin/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf.tar.gz
$ sudo tar -xzvf zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf.tar.gz
$ sudo rm zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf.tar.gz
$ ls -l
total 12
lrwxrwxrwx  1 root root   21 Jul 23 15:58 java-1.11.0-openjdk-armhf -> java-11-openjdk-armhf
drwxr-xr-x  9 root root 4096 Aug 20 11:41 java-11-openjdk-armhf
drwxr-xr-x  2 root root 4096 Aug 20 11:41 openjdk-11
drwxrwxr-x 10  111  122 4096 Jul 10 16:50 zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf

Хорошо, вот оно! На нашей плате появился новый JDK. Теперь давайте настроим ОС, чтобы она знала об этой новой.

$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/java 1
$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/javac 1

Теперь мы можем выбрать новый JDK, чтобы он был связан с командами «java» и «javac».

$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                                             Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-armhf/bin/java                       1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-armhf/bin/java                       1111      manual mode
  2            /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/java   1         manual mode

Press <enter> to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/java to provide /usr/bin/java (java) in manual mode

$ sudo update-alternatives --config javac
There are 2 choices for the alternative javac (providing /usr/bin/javac).

  Selection    Path                                                              Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-armhf/bin/javac                       1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-armhf/bin/javac                       1111      manual mode
  2            /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/javac   1         manual mode

Press <enter> to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/javac to provide /usr/bin/javac (javac) in manual mode

Если все пойдет хорошо, мы сможем проверить версию Java сейчас ...

$ java -version 
openjdk version "11.0.8" 2020-07-14 LTS 
OpenJDK Runtime Environment Zulu11.41+75-CA (build 11.0.8+10-LTS) 
OpenJDK Client VM Zulu11.41+75-CA (build 11.0.8+10-LTS, mixed mode)

У нас есть победитель! Теперь мы успешно заменили OpenJDK 11 по умолчанию (который работает только на ARMv7 +) на Azul Zulu JDK, который работает на ARMv6.

Тестирование с нескомпилированным файлом Java

Давайте попробуем недавно установленный Java JDK. Начиная с Java 11, мы можем запускать Java-файлы напрямую, без необходимости их компилировать. Давайте создадим простой файл с помощью nano и запустим его.

$ cd /home/pi
$ nano HelloWorld.java

public class HelloWorld {
    public static void main (String[] args) {
        System.out.println("Hello World");
    }
}

$ java HelloWorld.java
Hello World

Идеально! Java работает должным образом, но требуется около 15 секунд, прежде чем на этой старой доске, датируемой 2014 годом, появится надпись «Hello World».

Графические пользовательские интерфейсы с JavaFX

Если вы также хотите использовать пользовательские интерфейсы JavaFX, необходимы дополнительные шаги, поскольку эта библиотека не включена в JDK 11. Она разработана как независимый проект с открытым исходным кодом на openjfx.io. Главный разработчик и сопровождающий - Gluon. Они также предлагают коммерческую поддержку компаниям, которые хотят использовать JavaFX для разработки настольных и мобильных приложений.

Убедитесь, что вы успешно обновились до Azul Zulu JDK 11, прежде чем переходить к следующим шагам.

Установите JavaFX 11 для ARMv6, предоставленный GluonHQ

Мы собираемся использовать бесплатную общедоступную версию, предоставленную Gluon на их странице загрузки.

$ cd /home/pi 
$ wget -O javafx.zip https://gluonhq.com/download/javafx-11-0-2-sdk-armv6hf/ 
$ unzip javafx.zip 
$ rm javafx.zip

Теперь мы можем проверить библиотеку JavaFX, распакованную в «armv6hf-sdk»:

pi@raspberrypi:~ $ ls -l
total 44
drwxr-xr-x 4 pi pi 4096 Mar 12  2019 armv6hf-sdk
drwxr-xr-x 2 pi pi 4096 Aug 20 11:40 Bookshelf
drwxr-xr-x 2 pi pi 4096 Aug 20 12:10 Desktop
...

$ ls -l armv6hf-sdk/
total 8
drwxr-xr-x 8 pi pi 4096 Mar 12  2019 legal
drwxr-xr-x 2 pi pi 4096 Mar 12  2019 lib

$ ls -l armv6hf-sdk/lib/
total 17124
-rw-r--r-- 1 pi pi  845637 Mar 12  2019 javafx.base.jar
-rw-r--r-- 1 pi pi 2761905 Mar 12  2019 javafx.controls.jar
-rw-r--r-- 1 pi pi  143926 Mar 12  2019 javafx.fxml.jar
-rw-r--r-- 1 pi pi 5270589 Mar 12  2019 javafx.graphics.jar
-rw-r--r-- 1 pi pi  294822 Mar 12  2019 javafx.media.jar
-rw-r--r-- 1 pi pi     992 Mar 12  2019 javafx.platform.properties
-rw-r--r-- 1 pi pi     113 Mar 12  2019 javafx.properties
-rw-r--r-- 1 pi pi   41802 Mar 12  2019 javafx-swt.jar
-rw-r--r-- 1 pi pi  786021 Mar 12  2019 javafx.web.jar
-rwxr-xr-x 1 pi pi   61200 Mar 12  2019 libdecora_sse.so
-rwxr-xr-x 1 pi pi   31428 Mar 12  2019 libglass_monocle.so
-rwxr-xr-x 1 pi pi   15946 Mar 12  2019 libglass_monocle_x11.so
-rwxr-xr-x 1 pi pi  200074 Mar 12  2019 libglass.so
-rwxr-xr-x 1 pi pi   22409 Mar 12  2019 libjavafx_font_freetype.so
-rwxr-xr-x 1 pi pi   20508 Mar 12  2019 libjavafx_font_pango.so
-rwxr-xr-x 1 pi pi   15206 Mar 12  2019 libjavafx_font.so
-rwxr-xr-x 1 pi pi  231402 Mar 12  2019 libjavafx_iio.so
-rwxr-xr-x 1 pi pi   43339 Mar 12  2019 libprism_common.so
-rwxr-xr-x 1 pi pi   54506 Mar 12  2019 libprism_es2_monocle.so
-rwxr-xr-x 1 pi pi   56505 Mar 12  2019 libprism_sw.so
-rw-r--r-- 1 pi pi 6598638 Mar 12  2019 src.zip

Тестирование с минимальным приложением JavaFX

Мы собираемся повторно использовать минимальное приложение JavaFX, которое было создано в этом посте PiJava - Часть 4 - Создание минимального приложения JavaFX 11 с помощью Maven. Во-первых, нам нужно клонировать исходники из GitHub:

$ cd /home/pi 
$ git clone https://github.com/FDelporte/MinimalJavaFx11Application.git

Для создания приложения нам также необходимо установить Maven.

$ sudo apt install maven

Теперь создадим приложение:

$ cd MinimalJavaFx11Application 
$ mvn clean package

Это займет некоторое время, так как необходимо загрузить все зависимости.

По завершении мы можем запустить приложение с помощью следующей команды запуска, которая указывает на загруженную библиотеку JavaFX и сгенерированное jar-приложение в исходном каталоге «MinimalJavaFx11Application»:

$ sudo java --module-path /home/pi/armv6hf-sdk/lib 
      --add-modules=javafx.controls 
      -jar /home/pi/MinimalJavaFx11Application/out/MinimalJavaFx11Application-0.1-SNAPSHOT.jar

И вот оно! JavaFX работает на ARMv6 Raspberry Pi B + 1.2 !!!

Заключение

По сравнению с последней версией Raspberry Pi с гораздо более быстрым процессором и большим объемом памяти, приложение запускается намного медленнее на моей тестовой плате 6-летней давности. Но это работает! Да действительно работает :-)

Опять же, эта маленькая супергеройская плата может справиться со всем, даже с самыми современными версиями Java на старом процессоре.

И, если вам нравится видео, вот видео с Javarevisited Youtube Channel о том, как установить Java на Raspberry PI.

И, если вам нравится это видео и вы хотите узнать больше, вы также можете проверить полный курс здесь - Использование Java и Java FX на Raspberry PI.

Первоначально опубликовано на https://webtechie.be.