我想在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也不支持)?谁问它在不久的将来是否会得到支持?
答案 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团队在这里所做的出色工作!