有没有办法将 Gluon Mobile (javafxports) 与本机 android 代码混合使用?

Is there a way to mix Gluon Mobile (javafxports) with native android code?

例如:我想将我的 javafx 桌面应用程序(使用 Gluon Mobile)的核心迁移到 Android,但只是核心。我想使用本机 android 代码实现的应用程序的其他部分(不包括核心)。

那么,有没有办法在单个项目中保留 Gluon Mobile 和 Android 本机代码库?

根据经验,您不应在 Java 项目中要求特定平台代码。如果您只想提供自定义 Java 代码或基于平台的自定义样式,您可以使用 Platform.getCurrent().name() 然后基于它做出反应,例如使用不同的代码或加载不同的 css 基于平台和设备类型的文件。

尽管如此,包含平台代码的原因有多种,并且由于您没有指定您的要求,我将假设以下情况之一:

  • 利用本机服务,即设备的摄像头
  • 使用原生 API,即 Android 的 Log
  • 使用原生 widget/layer,即 Android 的 Toast 或 SurfaceView

对于第一种情况,访问本机服务,请查看 Charm Down library,以及不同服务的本机实现。

您会注意到,每项服务都包含 Java 和特定平台代码。主要插件(即 charm-down-plugin-storage-3.6.0.jar)包含中性的 API,以后可以从您的 Java 项目中使用,它会调用您 运行ning 平台的实现on(即 charm-down-plugin-storage-desktop-3.6.0.jar 用于桌面或(即 charm-down-plugin-storage-android-3.6.0.jar 用于 Android)。

服务将从 Java 主包调用:

Services.get(StorageService.class).ifPresent(storage -> {
     storage.getPrivateStorage()
         .ifPresent(file -> System.out.println("Private storage " + file.getName()));
     });

这样,您可以运行在任何平台上使用它。

如果您需要的服务尚不可用,您可以创建新服务。可以找到有关如何操作的示例 here。例如,AndroidLogService 实现使用了 android.util.Log.

即使您不需要服务,只是访问 Android API,您也可以按照上面示例中的 Charm Down 设计模式,并提供您的 Android 实施。

至于 Android 小部件,您将无法使用它们,除非您创建一个本地层,注意将小部件和层都放在 JavaFX 之上层。例如,Android 的视频服务就是这样做的。

最后,还有另一种选择,以防您的项目基本上是一个 Android 项目并且您想从中调用 JavaFX。 Kokos sample.

就是一个例子