HarmonyOS ArkGraphics 2D NativeImage 实操:获取 NativeWindow 与 SurfaceId

NativeImage 是把图像生产端和 OpenGL 纹理连接起来的一座桥。本文做一个最小可运行实验:创建 OH_NativeImage,获取它关联的 NativeWindow,再读取 SurfaceId,最后完整销毁资源。

实验结果

真机页面显示三项结果:NativeImage 创建成功、NativeWindow 已获取、SurfaceId 219013267324928。这三个值来自 Native API 实际返回,不是页面预设文本。

准备

  • DevEco Studio,API 26 工程。
  • HUAWEI Mate 60 Pro 真机。
  • Native 文件:entry/src/main/cpp/native_image_bridge.cpp。
  • ArkTS 页面:entry/src/main/ets/features/graphics2d/NativeImageBridgePage.ets。

本实验使用纹理目标 GL_TEXTURE_EXTERNAL_OES,不读取相册,也不申请相机权限;真实相机或视频接入时,可以继续使用返回的 NativeWindow。

实施过程

1. 创建 NativeImage

cpp 复制代码
const uint32_t textureTarget = 0x8D65; // GL_TEXTURE_EXTERNAL_OES
g.image = OH_NativeImage_Create(0, textureTarget);
g.create = g.image == nullptr ? -1 : 0;

创建失败时保留错误状态,不继续解引用空指针。真机本次返回 create=0。

2. 获取 NativeWindow 和 SurfaceId

cpp 复制代码
g.window = OH_NativeImage_AcquireNativeWindow(g.image);
g.surface = OH_NativeImage_GetSurfaceId(g.image, &g.surfaceId);

真机返回 window=0 surface=0,并得到一个非零 SurfaceId。这个 SurfaceId 可以交给后续的视频解码器、相机生产者或图形管线使用。

3. ArkTS 显示实际返回值

ArkTS/ets 复制代码
const snapshot: ImageSnapshot = api.snapshot();
this.status = '已提交纹理桥接请求';
this.snap = snapshot;

页面分别显示创建状态、NativeWindow 状态和 SurfaceId,便于逐项核对。

4. 退出时销毁

cpp 复制代码
if (g.image != nullptr) {
  OH_NativeImage_Destroy(&g.image);
  g.image = nullptr;
  g.window = nullptr;
}

退出按钮和页面销毁都会调用 stop()。Hilog 中的 IMAGE_RELEASE 证明 NativeImage 已释放。

遇到的情况与处理

创建成功但没有画面

本实验只验证桥接对象、NativeWindow 和 SurfaceId,并没有把空纹理当作可见图像。要显示真实画面,还需要有效的 OpenGL 纹理上下文以及生产者向 NativeWindow 写入帧。

SurfaceId 为 0

SurfaceId 为 0 时不能继续接入下游管线,应保留返回码并检查 NativeImage 创建参数和图形上下文。本次真机取得非零 SurfaceId。

重进页面资源残留

NativeImage 是原生资源,必须在退出路径调用 OH_NativeImage_Destroy();当前实现同时覆盖退出按钮和 aboutToDisappear()。

真机 Hilog

text 复制代码
IMAGE_LAB_ENTER texture=0 target=GL_TEXTURE_EXTERNAL_OES permissionRequired=false
IMAGE_READY create=0 window=0 surface=0 id=219013267324928
IMAGE_RELEASE

验证结果

验证项 真机结果
NativeImage 创建 成功,返回状态 0
NativeWindow 获取 成功,返回状态 0
SurfaceId 查询 成功,得到非零 ID
退出释放 IMAGE_RELEASE 已记录

本篇完成了 NativeImage → NativeWindow → SurfaceId 的真实桥接验证;下一步可以在这个 SurfaceId 上接入视频帧或相机生产者。

相关推荐
熊猫钓鱼>_>8 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 KMPNotifier 实现 OpenHarmony 本地通知引擎
kotlin·ai编程·harmonyos·鸿蒙·openharmony·适配·kmp
特立独行的猫A12 小时前
cj-tauri开源项目介绍与imovie观影客户端项目实战
harmonyos
fellow9915 小时前
Electron + pnpm 在鸿蒙应用里跑起来
electron·harmonyos·openharmony·deepseek·deepseekharness
熊猫钓鱼>_>17 小时前
从闲置平板到家里的“控制大脑“:鸿蒙智慧中控面板完整实战
运维·人工智能·华为·自动化·电脑·ai编程·harmonyos
5008417 小时前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
熊猫钓鱼>_>20 小时前
从2D平铺到3D沉浸:我用HarmonyOS 7端侧AI做了一个全程数据不出设备的空间化私密相册
前端·人工智能·3d·华为·华为云·harmonyos·鸿蒙
m0_7381858220 小时前
Flutter 鸿蒙化实战:foundation_fluttify 适配 OpenHarmony,Fluttify 桥接层
flutter·华为·harmonyos·鸿蒙
m0_7381858220 小时前
Flutter 鸿蒙化实战:http_proxy 适配 OpenHarmony,HTTP 代理
flutter·http·华为·harmonyos·鸿蒙
m0_7381858221 小时前
Flutter 鸿蒙化实战:headset_connection_event 适配 OpenHarmony,耳机插拔监听
flutter·华为·harmonyos·鸿蒙
5008421 小时前
React Native for OpenHarmony 实战:三方库 react-native-volume-control 的鸿蒙化适配指南
javascript·react native·react.js·electron·harmonyos