在Raspberry Pi 3上使用JavaFX 11播放mp3

时间:2018-12-23 18:25:34

标签: javafx raspberry-pi gluon

我想在Raspberry Pi 3上运行Java 11和JavaFX 11。 我在这里遵循了Gluon的指示:http://docs.gluonhq.com/embedded/ (唯一的区别是:我运行的是完整的Stretch映像,而不是Lite,而BellSoft也为ARM发布了Liberica JDK版本11.0.1,所以我使用了它。)

我的应用程序非常简单:一个标签和一个按钮,当按下按钮时,将播放mp3:

public class HelloFX extends Application
    {
    @Override
    public void start(Stage stage) {
        String version = System.getProperty("java.version");
        String fxVersion = System.getProperty("javafx.runtime.version");
        Label l = new Label ("Java version: " + version + "\nJavaFX version: " + fxVersion);
        Button b = new Button("play");
        Scene scene = new Scene(new VBox(l, b), 350, 200);
        b.setOnAction(
                new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent event) {
                        PlayMp3();
                    }
                });

        stage.setScene(scene);
        stage.show();
    }

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

    Media media;

    void PlayMp3()
    {
        String resource = "/resources/sound.mp3";
        media = new Media(getClass().getResource(resource).toURI().toURL().toString());

        MediaPlayer mp = new MediaPlayer(media);
        mp.play();
    }

在Windows / Eclipse上,它将运行并播放mp3。在Raspberry Pi上,我可以使用以下命令执行应用程序:

sudo /opt/jdk-11.0.1/bin/java --module-path=/opt/armv6hf-sdk/lib/ --add-modules javafx.graphics,javafx.media  -cp /home/pi/Java/HelloFX/ -Dprism.verbose=true -Dembedded=monocle -Dglass.platform=Monocle javafx11.HelloFX

图形在显示屏上可见,但是当我按下按钮时,出现以下异常:

Exception in thread "JavaFX Application Thread" java.lang.UnsatisfiedLinkError: no jfxmedia in java.library.path: [/usr/java/packages/lib, /lib, /usr/lib]
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
    at java.base/java.lang.System.loadLibrary(System.java:1867)
    at javafx.graphics/com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:150)
    at javafx.graphics/com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:62)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.lambda$new$0(NativeMediaManager.java:136)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.<init>(NativeMediaManager.java:107)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager$NativeMediaManagerInitializer.<clinit>(NativeMediaManager.java:78)
    at javafx.media/com.sun.media.jfxmediaimpl.NativeMediaManager.getDefaultInstance(NativeMediaManager.java:90)
    at javafx.media/com.sun.media.jfxmedia.MediaManager.canPlayProtocol(MediaManager.java:78)
    at javafx.media/com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:239)
    at javafx.media/javafx.scene.media.Media.<init>(Media.java:393)
    at javafx11.HelloFX.PlayMp3(HelloFX.java:62)

我发现一些帖子说此错误消息意味着Java正在寻找一个名为“ libjfxmedia.so”的库,但是我在任何地方都找不到该文件。

我犯了任何错误或遗漏了什么吗?

我需要在java命令中更改某些内容以执行应用程序吗? (我不确定--add-modules参数,如果没有此选项,它将运行相同的参数...)

JavaFX 11是否仍可能不支持Raspberry Pi上的Media(我听说Gluon提供的v8也不支持)?谁问它在不久的将来是否会得到支持?

1 个答案:

答案 0 :(得分:0)

何塞·佩雷达(JoséPereda)所写的内容是正确的,没有包含javafx.media,并且在11版本中也没有包含它。 但与此同时,情况有所变化,BellSoft最近在14.0.1版中发布了Liberica软件包(包括JavaFX的Java),现在可以播放mp3了: https://bell-sw.com/pages/downloads/?version=java-14&release=14.0.1+8&os=Linux&bitness=32-bit&architecture=ARM&package=jdk-full

仍然存在一些小错误(例如mp3文件名不能包含空格,任何mp3的长度始终是无限的),但基础知识仍然有效,它甚至可以播放视频,请参阅其博客: https://bell-sw.com/announcements/2019/09/12/JDK-JavaFX-Video-Preview/

请确保真正使用14.0.1,而不要使用第一个14版本,因为特别是有几个修复程序。在那里已经实现了Raspberry Pi的功能。

感谢BellSoft团队在这里所做的出色工作!