问题描述
我是 gluon 领域的新手,但我知道如何创建基于 JDK-8 的 JavaFX 应用程序,其中嵌入了 JavaFX 库。
Gluon 应用程序似乎可以在 JVM 上轻松执行,尽管要创建本机映像,您将需要最新版本的 GraalVM。另一方面,最近我阅读了 2018 年发布的 gluon VM 的 docs,它说:
gluon VM 是一组软件组件,结合起来允许 开发人员编写 Java 应用程序并在移动设备或 嵌入式设备。 gluon VM 包含一个 AOT(Ahead Of Time)编译器 将 Java 字节码编译为特定于平台的本机代码。
我认为 GraalVM 和 gluon VM 有相同的目标,所以我很困惑,我想知道我应该使用什么? gluon VM 还是 GraalVM?它们有什么区别?
我的 IntelliJ IDEA 有 gluon VM 选项,我猜不推荐使用
解决方法
Gluon 和 GraalVM 在稍微不同的层面上工作,这实际上意味着它们可以相互合作而不是竞争。 GraalVM 是一个 JVM 和一个交叉编译器。 Gluon 为在不同平台上编写应用程序提供了抽象。
以 Android 应用为例。 GraalVM Native Image 可让您将使用多种编程语言编写的代码编译为 Android 可执行文件,即 APK。使用标准的 Android SDK,您将被迫使用 Kotlin 或旧的 Java(较新的 Adroid SDK 支持 Java 8 中的一部分功能,但我不知道)。借助 GraalVM,您可以使用新的 Java、Scala、Python、Ruby... 选择。
但 GraalVM 本身不会为您提供任何与 Android 设备通信的工具。你想在屏幕上显示一些东西吗?使用本地存储?公关监听来自后端的事件?祝你好运,GraalVM 对此一无所知。
这里进入胶子。它提供了插件和库作为您的代码和底层设备之间的抽象层,因此理论上您可以为 Android、iOS 和桌面编写相同的代码。 (“理论上”,因为在实践中,这些平台中的每一个都需要一些不同的处理方式)。因此,对于图形用户界面,您将使用由 Gluon 维护的 JavaFX。您将把它添加到您的 Maven 或 Gradle 配置中,并且tadaah现在您可以编写一个带有 UI 的应用程序,该应用程序将在 Android 或 iOS 上运行,就像在桌面上运行一样。
这一切仍处于早期阶段,但看起来很有希望。我喜欢从事非常不同的工作的人们可以聚在一起并产生类似的东西。
,我在开始研究 Gluon 时也读了太多书……旧方法(javafxports、robovm、android 粘合)和新方法(grallvm 基板)有时混合使用,不幸的是,Gluon Substrate 中的一些内部命名也注明了“VM”等。 .. 但是没问题。在混合阶段之后,我用 http://openjfx.io 返回绘图板,并首先使用纯 JavaFX (mvn javafx:run,mvn:javafx:jlink) 从这里开始,从字面上开始。学习 maven(更简单,必需)和 gradle(至少阅读构建脚本)基础知识。请注意,使用旧的 Gluon 方法有可能自然地与 android 环境集成,但现在它仅适用于附加服务。原生 Gluon 应用程序实际上脱离了 android 环境。它没有被 DalvikJava 解释为它的纯原生,你需要 Gluon.Attach 层,它与 android 和 ios 运行时接口,有时还提供桌面实现(非强制性,未测试,未强制,未模拟,但...浏览附加服务源了解现在有什么)。在您能够根据 openjfx.io jlink javafx 应用程序之后,然后转到 github 上的 gluon-samples 并尝试它们,现在您可以执行 mvn client:build (如果且仅当您安装并运行 VS2019 社区时客户端:从他的 x64 Native Tools CMD-line 构建,如果你在 Windows 上 - 它的所有描述都在 gluon 文档中 - 但忘记扫描互联网太多,坚持使用当前信息)
,@Elias,GluonVM 现在根本不是什么东西。你是这里某种旧营销的受害者。您链接的文章/文档已有 3 年历史,并且仍然提到使用 javafxports 和 jfxmobile 插件的 ODLEST 方法(再次查看那里,看到一些链接已失效,jfxmobile 的 github 存储库已有 3 年历史)。在了解 Gluon Mobile 的当前状态的过程中,我发现了这篇非常古老的文章(2014 年),它很好地描述了最旧的方法,其中 javafx 在 android 设备上的 DalvikVM 之上使用,并在 iOS 上使用 RoboVM。但是后来苹果公司禁止在他的设备上使用 JIT 编译和任何类型的外部虚拟机。所以这条路没了。然后是带有 GraalVM 的 Oracle,它是 Java 本身中的 JDK,而这种 GraalVM 的一部分是用于本地编译的 Java 代码的最小 VM,他们称之为 SubstrateVM (Oracle)。虽然 GraalVM 将代码编译成纯原生处理器代码,但在某些情况下,当应用程序使用反射时,必须有方法至少在某些类上反射元数据。这必须明确提供给 GraalVM 编译阶段。并且有一些工具可以扫描您的代码中的此类访问,尽管它可能还需要手动调整,以防您的应用程序过于动态(某种依赖注入和此类魔法),但在大多数简单的移动应用程序中都不是问题。这一切都很难手动完成。然后是 Gluon,他的名字是 Gluon VM 术语(从您 2018 年的链接文档开始),可能开始使用 GraalVM 构建本机映像。胶子还在他的产品中使用了术语 SUBSTRATE。它在 github 上的 Gluon-Substrate。这是新的、当前的方法。将 Gluon Substrate 理解为使用 GraalVM 的“高级构建引擎”,而不是任何类型的新“VM”。由于 GluonMobile 本机应用程序中实际上没有任何 VM(除了 GraalVM SubstrateVM 由于反射而留在此处)-您还在关注吗?是的,它不幸的一团糟主要是:-)。但这没关系,它现在就可以使用。 Gluon Substrate 构建引擎将所有魔法隐藏在新的 gluon “client-maven-plugin”(主要)和“client-gradle-plugin”(社区)中。这提供了目标“mvn client:build”,它使用 Gluon Substrate 为移动设备组装所有东西,甚至嵌入到 Raspberry Pi 上。使用基于 ARM 的 openJDK、基于 ARM 的 openJFX 并允许您在 android/ios 设备上运行甚至几乎纯 JavaFX 应用程序,但此结果将无法访问此类操作系统平台。为此,有 Gluon-Attach 定义抽象 API 并在特定平台上实现它们,以提供对不属于 JavaFX 的事物的访问,并尝试以统一的方式进行。当您开发应用程序时,您将其设置为桌面,即使没有构建本机映像也可以运行它。事实上,它是推荐的,因为您拥有所有工具。只有当最终应用程序按预期工作时,您才能执行“mvn client:build”和其他步骤将其传递到您的设备或模拟器进行测试。您还拥有 Glisten UI 增强功能,可在 android 和 iOS 上提供一些基于“材料设计”的统一 UI。虽然它不是平台原生的。它不适用于所有类型的应用程序,但从我的角度来看,它足以让我做一些可以分发到 Apple 和 Google 商店的东西。是的,仍然有一些怪癖,主要取决于 Attach 实现。将此视为一种 HAL/PAL - 硬件或平台抽象层,但请谨慎操作。它在这里定义得不是很好,并且一些硬件访问在 Attach 中还没有桌面实现。有些在桌面上没有意义,是的。但我可以想象开发至少模拟桌面实现,在最终部署到设备上之前,使用某种配套开发应用程序帮助测试桌面上的所有内容。 Attach 是一组非常扁平的平台抽象,只是还缺少一些东西。任何拥有 AndroidSDK+NDK 和 iOS 专业知识的人都可以尝试扩展 HIS 应用所缺少的东西。
OLD (2014) 文章,写得很好,但对于旧方法(强烈警告!): https://www.infoq.com/articles/Building-JavaFX-Android-Apps/
新视频,甚至描述了旧方法 (46:42) 和新的 Substrate-build-engine (50:52) https://drive.google.com/file/d/1Td9rZLh-1sY-GylBcPIrpM9028GJ43T7/view
对于“基板”术语,请比较 GraalVM JDK 和 Gluon-Substrate github: https://en.wikipedia.org/wiki/GraalVM https://github.com/gluonhq/substrate