PiJava - Part 1 - Trying to run Java 11 on an old Raspberry PI

One of my goals for 2019 is experimenting with the latest Java and JavaFX versions on a Raspberry PI. After my experiments with the Python Pong game I was not very happy with the GUI I could build with Python and definitely wanted to try something similar, but with JavaFX which I like much more.

Tools used for first experiments

Starting point

I started with this step-by-step from Gluon to get Java 11 running on the board.

The Java version they are using (Liberica from BellSoft) only returned “Illegal argument” exception. Thanks to Michael Röschter from Azul Systems I also got two different versions of the embedded Zulu version they build. But those gave me “error while loading shared libraries”. So what is going wrong?

Inside information about the PI board

I had to look “inside” the PI to know what is going wrong and why. So it is important to be able to know exactly what is inside the PI being used. So back to my best friend Stackoverflow to get some assistance and find some tips and tricks ;-)

In this GitHub repo I added some scripts based on what I found on-line, which can help you to identify the hardware and software of the PI you are using.

check_raspian_version.sh

This script will read out different parameters of the system to give you an overview of the Debian Linux and kernel version.

Debian version: 9.6
Kernel version: 4.14.79+

Full version info:
Linux raspberrypi 4.14.79+ #1159 Sun Nov 4 17:28:08 GMT 2018 armv6l GNU/Linux

Even more version info:
Linux version 4.14.79+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1159 Sun Nov 4 17:28:08 GMT 2018

check_float_version.sh

This script helps you to define which float system is used by the Debian system.

Hard float means floating number calculations are done with a dedicated block in the chip. And soft float is done in software. So the hard float will be faster but needs a chip which supports it. And the filesystem and tools also need to be build to match the floating type.

Soft float?
   By checking dpkg for armel (if > 0): 0
   By checking if directory exists: No

Hard float?
   By checking dpkg for armhf (if > 0): 1063
   By checking if directory exists: Yes

dpkg architecture: armhf

check_hardware_version.sh

This script helps you to define which hardware is used (processor model) and some other stuff like temperature, memory in use…

CPU info: 
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		: 000000002d2617a6

CPU current values: 
temp=38.5'C
frequency(45)=700000000
volt=1.2000V

Memory:               total        used        free      shared  buff/cache   available
Mem:           433M         67M        184M        3,4M        181M        314M
Swap: 99M 0B 99M

Trying-out with a Pi Zero

Quick additional experiment: same SD-card in a Pi Zero. But same “Illegal argument” result.

Side-note: isn’t this remarkable. Swapping the SD-card between different Pi’s, even completely different types just works. No driver changes needed, no new downloads. Just exchange the SD, power-up and start working! Isn’t the Pi a really remarkable, well-built device?!

Conclusion

Based on the hardware version, Michael pointed out that “your Raspberry is a pre-2015 version with an ARMv6 chip. I fear the community has to wait till some commercial hardware vendor goes for Java 11 on a low-end ARMv6 chip, which is increasingly unlikely. On ARM is not easy to build a binary that works on every 32bit version. V5, V6 (two variants) and V7 are too different.” BTW, also the Pi Zero is an ARMv6-type.

I you look at the overview of Pi-specs on Wikipedia it’s clear which boards are supported and which aren’t. Looking at the “Instruction set” row, immediately shows which types are based on the ARMv7/8 and which should be supported by the Java 11 of Liberica.

So Java 11 is not (yet) built for my old Raspberry PI…
In the meantime I bought a new one and started all over again.
Spoiler alert: it works “out of the box”, but more about that in the next blog.