问题描述
这是我需要的:具有硬件加速功能的有效 OpenJFX 14 环境。
我有一个 i.MX 8M ARMv8 嵌入式系统,我正在尝试运行 OpenJFX 14 或最新版本。该芯片组具有 Vivante GC7000UL GPU。我所做的当前 Yocto 构建已加载 galcore
模块。 X 窗口环境运行良好,它在 /usr/lib 中有 libEGL.so
、libGLESv2.so
和 libGL.so
。我是一名 Java 工程师,不是 OpenGL 专家,所以我不知道 OpenGL API 是否需要更多库。
我查看了来自 LibericaFX 和 Azul zulu 的预构建版本。后者没有 ARM 版本。前者有 aarch64
构建,但它没有单片眼镜实现。他们有 prism ES2
实现,但不幸的是它需要 GLX v1.3 或更高版本,而我似乎没有。
我尝试使用基于 armv6hf.gradle 的 Yocto 配方为 ARMv8 自己编译 OpenJFX。我设法成功编译并能够运行它。但它不使用硬件管道进行渲染。
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for hidpi pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2_monocle
GraphicsPipeline.createPipeline Failed for com.sun.prism.es2.ES2Pipeline
java.lang.UnsatisfiedLinkError: /usr/lib/jni/libprism_es2_monocle.so: /usr/lib/jni/libprism_es2_monocle.so: undefined symbol: getNativedisplayType
at java.base/java.lang.classLoader$NativeLibrary.load0(Native Method)
...
at java.base/java.lang.Thread.run(Thread.java:832)
*** Fallback to Prism SW pipeline
Prism pipeline name = com.sun.prism.sw.SWPipeline
(X) Got class = class com.sun.prism.sw.SWPipeline
Initialized prism pipeline: com.sun.prism.sw.SWPipeline
这是有道理的,因为 getNativedisplayType()
方法是在 eglWrapper.c 中定义的,它不包含在 prism_es2_monocle
链接中。
行。凉爽的。让我将该文件添加到编译步骤。
现在编译失败并出现此错误。
jfx-14.0.2.1-1/modules/javafx.graphics/src/main/native-prism-es2/eglWrapper/eglWrapper
.c:71:1: error: unkNown type name 'PrismNativePort'
71 | PrismNativePort prismPort;
| ^~~~~~~~~~~~~~~
我的旅程到此结束。除了这个文件,我在任何地方都找不到提到的 PrismNativePort
(我已经用 Google 搜索了整个互联网)。
是否有人尝试过编译除 Android 或 Linux x86 以外的 OpenJFX?谁能告诉我是否可以尝试任何方法使其与硬件加速一起使用?谢谢。
这是我用来启动示例应用程序的内容。
java --module-path /opt/openjfx/jfx-14 \
--add-modules javafx.controls \
-Djava.library.path=/usr/lib/jni \
-Dembedded=monocle \
-Dprism.verbose=true \
ColorfulCircles
更新:我发现 PrismNativePort
在 2016 年的一个非常旧版本的 JFX 代码中定义。看起来名为 LensPort 的组件已退役,但 eglWrapper 仍然有指向已删除代码的链接。
解决方法
不是真正的答案,只是一个想法。 OpenJFX 16-ea 对 Raspberry Pi 进行了更多改进,因此也许也适用于您的用例。我在 Raspberry Pi 3 B(gtk 而不是单片眼镜)上使用以下命令启动我的应用程序:
java -Dglass.platform=gtk \
-Dprism.verbose=true \
-Djavafx.verbose=true \
-p /opt/arm32fb-sdk/lib \
--add-modules javafx.controls \
-jar /home/pi/APP.jar
,
你必须告诉 Glass 使用单片眼镜:
-Dglass.platform=Monocle
这是我启动应用程序的完整命令行:
java --module-path ./dist/libARMv8/ --add-modules javafx.controls,javafx.fxml \
-Dembedded=monocle \
-Dglass.platform=Monocle \
-Dmonocle.platform=MX8 \
-Dprism.order=es2 \
-Dprism.verbose=true \
-Djavafx.verbose=true \
-Dcom.sun.javafx.isEmbedded=true -Dcom.sun.javafx.touch=true -Dcom.sun.javafx.virtualKeyboard=javafx \
-jar ./dist/JavaFXTestApp4.jar
我为 iMX8 构建了 javaFX。硬件加速工作但存在一些闪烁问题:例如,当我单击 textField 以显示虚拟键盘时,显示屏开始闪烁。与组合框相同的问题。 在软件渲染模式下不会发生这种闪烁问题。 我也不是 openGL 专家,所以现在没有更多的想法......这可能是 Vivante openGL 驱动程序的问题。 如果有人对它感兴趣,我可以分享我的构建脚本并提供更多详细信息。
编辑:为避免硬件加速闪烁问题,将其添加到命令行:
-Dprism.forceUploadingPainter=true
最好的问候,