Blog chevron_right 未分类

使用 Azul Zulu 在 ARM 上运行 JavaFX 应用程序

4 月,OpenJDK 的 Azul Zulu 构建版本发布后,针对 64 位 ARM 系统提供了支持 JavaFX 的软件包。ARM 处理器是大多数嵌入式系统的“核心”,而这些运行时通过将用户界面开发引入 Java 环境,创造了额外的优势。从服务器到终端设备,您的整个代码库都将基于相同的 Java 代码和依赖关系,这将在总体成本、开发方法以及测试和部署策略等方面带来许多改进。

Raspberry Pi 为测试 Java 和 JavaFX 在 ARM 架构上的表现提供了理想平台,我们在本文中记录了这一过程,并在以下视频中进行了演示:

支持 JavaFX 的 Azul Zulu 构建版本

正如我们的文档所述,您可以通过多种方式为您的系统获取最新版本的 Zulu。这篇文章重点介绍其中两种方法。

从 Azul 下载页面下载

您可以在 Azul 下载页面查看可用版本。借助搜索筛选器,您可以轻松找到要下载的正确版本,例如适用于 Linux ARM 系统的版本:

使用 SDKMAN

SDKMAN 工具为 Java 的安装和不同版本的切换提供了一种非常便利的方式。例如,在配备 64 位 Raspberry Pi 操作系统的 Raspberry Pi 5 上使用它时,执行 sdk list java 命令即可清楚地列出所有可在该平台上使用的 Zulu 运行时,其中一些版本支持 JavaFX。要安装其中某个版本,只需执行一条命令:sdk sdk install java VERSION. 如下方输出所示, SDKMAN 显示,其已检测到自己正运行在一个 Linux ARM 64bit 系统上,并仅显示适用于该平台的版本:

$ sdk list java
================================================================================
Available Java Versions for Linux ARM 64bit
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
...
 Zulu          |     | 22.0.2       | zulu    |            | 22.0.2-zulu
               |     | 22.0.1.crac  | zulu    |            | 22.0.1.crac-zulu
               |     | 22.0.1.fx    | zulu    | installed  | 22.0.1.fx-zulu
...
               |     | 21.0.3.fx    | zulu    |            | 21.0.3.fx-zulu
...
               | >>> | 17.0.11.fx   | zulu    | installed  | 17.0.11.fx-zulu
...
               |     | 11.0.23.fx   | zulu    |            | 11.0.23.fx-zulu
...
               |     | 8.0.412.fx   | zulu    |            | 8.0.412.fx-zulu
...

# Install Azul Zulu 22.0.1 with JavaFX:
$ sdk install java 22.0.1.fx-zulu

# Check the installed version:
$ java -version
openjdk version "22.0.1" 2024-04-16
OpenJDK Runtime Environment Zulu22.30+13-CA (build 22.0.1+8)
OpenJDK 64-Bit Server VM Zulu22.30+13-CA (build 22.0.1+8, mixed mode, sharing)
 
# If you already installed a version before and want to switch back to it, use:
$ sdk use java 22.0.1.fx-zulu
Using java version 22.0.1.fx-zulu in this shell.

JavaFX 演示实验

让我们在这台 Raspberry Pi 上通过一个简单的 JavaFX 应用程序进行尝试。您可以在这个 GitHub Gist 中找到完整的代码。它将启动一个用户界面,通过标签显示 Java 和 JavaFX 的版本以及帧率计数器。此外,该应用程序还会添加一个或多个在屏幕上弹跳的圆球,它们将在碰到屏幕边缘时改变方向。

正如您在代码中看到的,更改 NUMBER_OF_BALLS 的值可让您快速测试系统在帧率下降之前能够处理多少动画。所有代码都包含在一个文件中,前三行使我们能够用 J’BANG! 运行它,以避免构建完整的 Maven 或 Gradle 项目。

///usr/bin/env jbang "$0" "$@" ; exit $?

//DEPS org.openjfx:javafx-controls:22.0.2
//DEPS org.openjfx:javafx-graphics:22.0.2:${os.detected.jfxname}

...

public class FxDemo extends Application {

    private static int NUMBER_OF_BALLS = 10_000;
    
    ...
    
    @Override
    public void start(Stage stage) {
        var javaVersion = System.getProperty("java.version");
        var javaVendor = System.getProperty("java.vendor");
        var javaVendorVersion = System.getProperty("java.vm.version");
        var javafxVersion = System.getProperty("javafx.version");

        VBox holder = new VBox();
        holder.setFillWidth(true);
        holder.setAlignment(Pos.TOP_CENTER);
        holder.setSpacing(5);
        holder.getChildren().addAll(
            new Label("Java: " + javaVersion + ", " 
               + javaVendor + ", " + javaVendorVersion),
            new Label("JavaFX: " + javafxVersion),
            getFramerateLabel(),
            getBouncingBallPane()
        );

        scene = new Scene(holder, 400, 700);
        stage.setTitle("JavaFX Demo");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

    ...
}

既然我们已经使用 SDKMAN 安装了 Java,也可以用它来安装 J’BANG!,并运行以下命令检查是否安装正确:

$ sdk install jbang
$ jbang --version
0.117.1

从 GitHub 获取代码,并将其保存为 FxDemo.java。您现在可以直接启动应用程序而无需编译任何代码,J’BANG! 将为我们处理这一过程:

$ jbang FxDemo.java
[jbang] Building jar for FxDemo.java...
 
# If you are connected via SSH, add the display.
# Otherwise you get this error:
# "UnsupportedOperationException: Unable to open DISPLAY"
$ DISPLAY=:0 jbang FxDemo.java

结论

通过为 ARM 64 位 Linux 系统添加 JavaFX 支持,Azul 再次将 Java 推广到了更多平台上。得益于 JavaFX 中的许多内置组件,以及社区创建的库,对于需要现代、稳定用户界面的任何应用场景而言,JavaFX 都是理想的解决方案。

Raspberry Pi 是在 ARM 上试验 Java(和 JavaFX)的理想平台。它使用户能够快速建立边缘设备原型,让 Java 应用程序可以在这些设备上将传感器与云服务或其他任何需要与用户交互的设备连接起来。根据您的要求,还有许多其他基于 ARM 的嵌入式平台可供选择,它们都具有相同的优势:可以完全融入到您的 Java 开发中。