Skip to content

嵌入式应用 (Embedded App)

EmbeddedApp 允许在不接管完整的平台事件循环的情况下驱动运行时。您可以使用它将 zero-native 嵌入到已有的原生应用程序、外部游戏引擎或自定义的渲染循环中。

使用方法

zig
var embedded = zero_native.embed.EmbeddedApp.init(my_app.app(), my_platform);

try embedded.start();

// 在您的自定义主渲染循环中:
try embedded.frame();

// 当窗口或表层发生尺寸调整时:
try embedded.resize(new_surface);

// 退出关机时:
try embedded.stop();

成员方法 (Methods)

方法描述
init(app, platform)创建一个带有运行时的嵌入式应用实例。
start()分发 app_start 事件,并加载对应的 WebView 渲染源页面。
resize(surface)分发 surface_resized 表层大小调整事件。
frame()分发 frame_requested 单帧重绘刷新事件。
stop()分发 app_shutdown 应用关机卸载事件。

工作原理

EmbeddedApp 本质上是对 RuntimeApp 的二次封装。它的每一个方法都是通过调用底层 runtime.dispatchPlatformEvent 来分发具体的平台事件。这样,您就可以在将事件循环的主控权保留在外部环境(例如游戏引擎的主循环)的同时,依然完整地使用 zero-native 提供的运行时管理、桥接交互及窗口系统。

移动端集成示例 (Mobile examples)

本仓库中包含了完整的移动端宿主集成代码示例:

  • examples/ios —— 一个 Xcode 项目,内含 Swift 的 UIViewController 控制器、WKWebView 组件以及提供桥接交互的 zero_native.h 头文件。
  • examples/android —— 一个 Gradle/Kotlin 开发的 Android 项目,其中配置好了通过 JNI 与 CMake 编译链接 libzero-native.a 原生库的构建脚本。

这两个示例均需要先从本仓库构建出目标芯片架构的本地 libzero-native.a 静态链接库,并将其手动复制到各自示例项目下 README 中指定的目录下。

配合 EmbeddedApp 进行测试

zig
var null_platform = zero_native.NullPlatform.init(.{});
var state: u8 = 0;
var embedded = zero_native.embed.EmbeddedApp.init(.{
    .context = &state,
    .name = "embedded",
    .source = zero_native.WebViewSource.html("<p>Embedded</p>"),
}, null_platform.platform());

try embedded.start();
// 此时,null_platform.loaded_source 已经成功接收到了加载出的 HTML 源码