有没有办法将 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.
就是一个例子
例如:我想将我的 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.
就是一个例子