В предыдущем посте Установка 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.