I wrestled with the same issue a few days ago.
I have been running a Minecraft server on a Raspberry Pi 4, using Java 8, installed via sudo apt install openjdk-8-jdk
.
However, as of snapshot 21w19a, which was a few snapshots before the 1.17 release, Java 16 has become the minimum for Minecraft.
The Java 16 binary in the openjdk-16.0.1_linux-aarch64_bin.tar.gz
file I downloaded from http://jdk.java.net/16/ gives an error when run on my Raspberry Pi 4:
$ ./jdk-16.0.1/bin/java --version
-bash: ./jdk-16.0.1/bin/java: cannot execute binary file: Exec format error
If we use file
on that binary, we can see a bit more detail:
$ file ./jdk-16.0.1/bin/java
./jdk-16.0.1/bin/java: ELF 64-bit LSB shared object, ARM aarch64,
version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1,
for GNU/Linux 3.7.0, not stripped
Note "64-bit" and "ARM aarch64".
Compare this with the working Java 8 binary I have - note "32-bit" here:
$ file /usr/lib/jvm/java-8-openjdk-armhf/jre/bin/java
/usr/lib/jvm/java-8-openjdk-armhf/jre/bin/java: ELF 32-bit LSB executable, ARM,
EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3,
for GNU/Linux 3.2.0, BuildID[sha1]=6d2781f51a497603976e8fee28b888bd771fd5b7, stripped
I believe (I'm no expert) that the Raspberry Pi 4 CPU is able to run aarch64
code, but the current default OS doesn't support it.
$ uname -a
Linux [name] 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux
There, note armv7l
.
This article - "How to Make Your Raspberry Pi 4 Faster with a 64 Bit Kernel" helped me to understand a little more. If I read that right, although we could edit /boot/config.txt
to include the arm_64bit=1
, that would give us a 64 bit kernel, but not the ability to run 64 bit aarch64
binaries, because we still have a 32 bit userland. (If I've misunderstood here, I'd appreciate if someone could correct me so I can learn.)
So, summary so far: Oracle supply a Java 16 JDK at jdk.java.net, but the only ARM binary there is aarch64
. I think this may be supported by the processor on the Raspberry Pi 4, but not by the default OS.
Luckily, AdoptOpenJDK (run by a community of Java User Group members, including some big names) seem to make a wider variety of Java binaries available for download.
I went to https://adoptopenjdk.net/releases.html and made the following choices:
Those choices have given me a working Java 16:
$ ./jdk-16.0.1+9-jre/bin/java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-16.0.1+9 (build 16.0.1+9)
OpenJDK Server VM AdoptOpenJDK-16.0.1+9 (build 16.0.1+9, mixed mode)
$ file ./jdk-16.0.1+9-jre/bin/java
./jdk-16.0.1+9-jre/bin/java: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0,
not stripped
... and this is working so far for me, in the limited testing I've done so far, with the vanilla 1.17 server JAR I downloaded from https://www.minecraft.net/en-us/download/server.
AArch64
is 64-bit, your kernel isarmv7l
which is 32-bit. You cannot run 64-bit userspace applications using a 32-bit operating system. You'll either have to upgrade to a 64-bit OS, or find a 32-bit version of Java.