跳到内容
CrossFly 是 100% 开源在 GitHub 关注我们
CrossFlyCrossFly
开始使用

本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。

原生集成 🤖🍎🖥️

中立的 Java 代码(位于 core)如何触达因平台而异的操作系统功能。

PlatformUtils——单一抽象入口

PlatformUtils.instance 是平台门面(facade)。每个 launcher 都会安装自己的实现 (web 安装 PlatformUtilsWeb)。关键方法:

IWebView wv = PlatformUtils.instance.createWebView();   // 无 webview 处为 null(web)
PlatformUtils.instance.view(url);                        // 打开外部 URL
PlatformUtils.instance.dial(numero);                     // 拨号

原生库 crossfly-lib

在启动时由 Main.create() 内部的 SharedLibraryLoader.load("crossfly-lib") 加载—— 在所有目标平台上,WebGL 除外:

if (Gdx.app.getType() != Application.ApplicationType.WebGL)
   new SharedLibraryLoader().load("crossfly-lib");

因此,所有依赖它的东西(例如:通过 JNI 的 NativeImage)在 web 上并不存在——在那里适用的是 纯 Java 实现(JavaImageOps)或 stub。

“带 fallback 的原生功能”模式

在使用一个可能不存在的功能之前,务必先检查:

if (PlatformUtils.instance.createWebView() != null) {
   WebContainer c = new WebContainer();     // Android/iOS/Desktop
   painel.add(LAY_FILL, c);
   c.show(url);
} else {
   PlatformUtils.instance.view(url);        // Web:在外部打开
}

同样适用于相机/地图返回的 null 以及 Device.platform:

if (Device.platform.isDesktop()) { /* 桌面端路径 */ }

编写你自己的原生实现

具体的服务(webview、GPS 等)位于 core 之外,在每个 launcher 中。对于一个 新功能,在 core 中定义接口,并按 launcher 实现它,在启动时将其安装到 PlatformUtils/服务 字段中。图像抽象就遵循这个模型:ImageOps → JavaImageOps (JVM) vs NativeImage (JNI)。

最佳实践

  • 永远不要假设某个设备功能存在——检查 != null/Device.platform。
  • 将操作系统相关的代码放在 launcher 中,而不是 core 中。

常见错误

  • 调用一个没有 fallback 的原生功能(在 web 上崩溃)。
  • 期望在 web 上有 crossfly-lib/JNI(它在 WebGL 上不会被加载)。

另请参阅

这个页面有帮助吗?