嵌入式应用 (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 本质上是对 Runtime 和 App 的二次封装。它的每一个方法都是通过调用底层 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 源码