首页 / 资讯中心 / 文章详情

ohos.ark_interop_helper:仓颉与 ArkTS 互操作的公共辅助函数详解

ohos.ark_interop_helper:仓颉与 ArkTS 互操作的公共辅助函数详解 ★ FEATURED ARTICLE
文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载ohos.ark_interop_helper是仓颉Cangjie语言面向 ArkTS 互操作场景提供的公共辅助功能函数模块为 ohos.ark_interop 互操作库 中的类型如JSValue、JSContext提供便捷的转换与判断能力。本文完整覆盖该模块的 4 个 API 函数全部起始版本为 22结合互操作库的类型定义与错误码说明讲解每个函数的签名、参数、返回值以及JSValue生命周期约束下的典型使用方式帮助你在仓颉与 ArkTS 混编项目中完成数据双向转换、应用模式判断与 NAPI 值互转。一、模块定位在仓颉-ArkTS 互操作体系中的位置ArkTS 应用的开发语言包括 ArkTS、TypeScript、JavaScript而 ArkTS 互操作库是为仓颉语言提供与 ArkTS 语言互操作能力的核心库详见 ohos.ark_interop 总览。在此体系下ohos.ark_interop_helper承担的是公共辅助功能函数角色导入方式如下import ohos.ark_interop_helper.*该模块与互操作主库配套使用主库 ohos.ark_interop 定义了JSRuntime、JSContext、JSValue以及各类安全引用JSArray、JSObject等而ohos.ark_interop_helper则在其之上封装了跨层数据转换与运行时状态判断的通用工具函数。在 ArkInterop 模块目录中它与互操作 API、ohos.business_exception、ohos.callback_invoke 及 ArkTS 互操作库错误码 并列共同构成仓颉与 ArkTS 互操作Beta 特性的完整 API 面。理解本模块前必须掌握的两个核心类型ohos.ark_interop_helper的 4 个函数全部围绕以下两个类型展开二者定义在 cj-apis-ark_interop.md 中JSValue —— 短生命周期的 ArkTS 值JSValue是 ArkTS 运行时的统一类型也是直接与 ArkTS 运行时交互的数据类型。只有互操作接口可以创建JSValue其生命周期在出栈被创建时的栈时结束不能拷贝、捕获以及在非互操作函数中返回。如果需要跨作用域传递该变量必须先转换再以仓颉类型或安全引用的形式传递。这一约束直接决定了本模块中mapFromJSValue、mapToJSValue等转换函数在互操作回调内即时转换的使用模式。JSContext —— 单线程互操作上下文JSContext是一个单线程执行的 ArkTS 互操作上下文与 ArkTS 运行时一一对应主要目标是创建JSValue和安全引用、管理 ArkTS 侧引用的仓颉对象生命周期。它持有一个 ArkTS 运行时的弱引用当 ArkTS 运行时失效后继续使用这个JSContext会抛出仓颉异常。因此所有接收JSContext参数的辅助函数都应在对应 ArkTS 运行线程上、且运行时仍然存活时调用。此外两个函数涉及 NAPI 侧的类型别名定义见 cj-apis-ark_interop.md#type-napi_envpublic type napi_env CPointerUnit public type napi_value CPointerUnitnapi_env与napi_value均为CPointerUnit的类型别名起始版本为 22。这意味着当仓颉代码需要与基于 NAPI 的 C/C 层交换数据时arktsValueToNapiValue充当了 ArkTS 运行时值与 NAPI 值之间的桥梁。二、func arktsValueToNapiValueJSValue 到 napi_value 的转换public func arktsValueToNapiValue(env: napi_env, ark_value: JSValue): napi_value功能将JSValue类型转化为napi_value类型。起始版本22参数参数名类型必填默认值说明envnapi_env是-环境上下文。ark_valueJSValue是-需要转换的值。返回值类型说明napi_value转化的napi_value值。从签名结构看该函数把互操作库一侧的JSValue转换为 NAPI 一侧的napi_value即CPointerUnit别名。它的典型适用场景是仓颉侧代码例如通过互操作库从 ArkTS 回调中拿到了一个JSValue需要把这个值继续传递给基于 NAPI 约定的 C/C 层或既有原生模块时先经由本函数完成类型桥接。使用时需注意两点前提env必须是与目标值同属一个运行环境的有效 NAPI 环境上下文传入的JSValue仍须处于其创建栈的有效生命周期内参考上文JSValue的生命周期约束转换动作应在互操作函数内部完成。三、func isStageMode判断当前是否处于 Stage 应用模式public func isStageMode(env: napi_env, context: napi_value): Bool功能判断是否处于应用模式Stage 模式。起始版本22参数参数名类型必填默认值说明envnapi_env是-环境信息。contextnapi_value是-上下文信息。返回值类型说明Bool是否处于应用模式。OpenHarmony 应用存在不同的应用模型如 FA 模型与 Stage 模型。在一份需要同时兼容多种运行环境的仓颉-NAPI 混编代码中isStageMode允许开发者根据napi_env与napi_value通常对应 ArkTS 侧传入的 context 值判断当前运行环境是否处于 Stage 应用模式从而选择对应的初始化或分支逻辑。返回值为原生Bool可直接用于match/ 条件判断。四、func mapFromJSValue把 JSValue 数据转换为 HashMappublic func mapFromJSValueT( context: JSContext, value: JSValue, convert: (JSContext, JSValue) - T ): ?HashMapString, T功能把JSValue格式的数据转换成HashMap。起始版本22参数参数名类型必填默认值说明contextJSContext是-互操作上下文。valueJSValue是-需要转换的JSValue数据。convert([JSContext](https://link.gitcode.com/i/27a2b0d83bfd221b2c07335af34dd5e8), [JSValue](https://link.gitcode.com/i/27a2b0d83bfd221b2c07335af34dd5e8)) - T是-把JSValue当作一个 HashMap 后获取这个 HashMap 的 key 对应的 value 转换成 T。返回值类型说明?HashMapString, T转换后的 HashMap 数据。该函数是ArkTS 对象 → 仓颉集合方向的通用转换工具其设计特点值得展开键固定为 String值类型为泛型 T函数把入参JSValue视为一个类映射map结构遍历其键产出HashMapString, T。通过convert闭包定制每个 value 的反序列化仓颉侧拿到每个 key 对应的JSValue后调用用户提供的convert: (JSContext, JSValue) - T完成类型解析。闭包同时拿到JSContext可以在转换过程中继续调用互操作 API例如读取嵌套属性、做类型断言。返回值是可空类型?HashMapString, T表明当入参value不能被当作 map 结构处理时函数会返回None调用方必须做空值处理。一个符合文档签名的使用示意JSValue必须在互操作回调栈内即时消费转换结果则以仓颉类型形式留存import ohos.ark_interop.* import ohos.ark_interop_helper.* // 假设 value 是在互操作回调中得到的 JSValueArkTS 侧的一个对象字面量 let result mapFromJSValue(context, value, { ctx: JSContext, v: JSValue in // 将每个 key 对应的 JSValue 解析为仓颉 String v.toString().fromJSValue(ctx) }) match (result) { case Some(map) // map: HashMapString, String此处可做仓颉侧业务处理 () case None // value 不是合法的 map 结构走降级逻辑 () }注上述示例中的具体取值方式如属性读取、类型断言应基于 ohos.ark_interop 中JSValue、JSObject的实际 API 选择本示例仅用于说明mapFromJSValue的签名用法与可空返回值的处理模式。五、func mapToJSValue把 HashMap 数据转换为 JSValuepublic func mapToJSValueT( context: JSContext, parameter: ?HashMapString, T, convert: (JSContext, T) - JSValue ): JSValue功能把HashMap格式的数据转换成JSValue。起始版本22参数参数名类型必填默认值说明contextJSContext是-互操作上下文。parameter?HashMapString, T是-需要转换的 HashMap 数据。convert([JSContext](https://link.gitcode.com/i/27a2b0d83bfd221b2c07335af34dd5e8), T) - JSValue是-把 HashMap 的 T 转换成JSValue。返回值类型说明JSValue转换后的JSValue数据。mapToJSValue与mapFromJSValue互为逆操作构成仓颉集合 → ArkTS 对象方向的通用转换入参parameter本身可为None签名允许直接传入?HashMapString, T空值此时函数仍会返回一个合法的JSValue可以推断对应 ArkTS 侧的空值/空对象表示调用方无需在调用前额外做空值分支。convert闭包负责值的正向序列化与反序列化方向对称每个T值经由(JSContext, T) - JSValue闭包逐一转换后组装进结果对象。使用示意把仓颉侧参数表转换为 ArkTS 侧可直接消费的对象import ohos.ark_interop.* import ohos.ark_interop_helper.* func buildParams(context: JSContext): JSValue { let params: HashMapString, Int64 [ timeout: 3000, retries: 3 ] // 把每个 Int64 值转换为 ArkTS number mapToJSValue(context, params, { ctx: JSContext, v: Int64 in v.toJSValue(ctx) }) }注convert闭包内部对基础类型的JSValue构造方式如Int64.toJSValue来自 ohos.ark_interop 中JSInteropTypeT扩展各基础类型均实现了func toJSValue(JSContext): JSValue实际写法请以该库对应类型的 API 为准。由于返回值JSValue生命周期结束于出栈mapToJSValue的结果应当立即用于返回给 ArkTS 侧例如作为互操作函数的返回值或转换为安全引用而不应长期持有。六、使用约束与错误处理辅助函数的底层调用最终进入 ArkTS 运行时受互操作库统一的线程与生命周期约束。结合 ArkTS 互操作库错误码与本模块最相关的错误包括错误码 ID含义与辅助函数的关系34300002ArkTS 代码异常Outside error occurred.ArkTS 运行时异常或被调用的 ArkTS 函数异常如参数错误或实现逻辑错误。34300003访问非法对象Accessing reference is beyond reach.超出作用域访问JSValue或在 ArkTS 运行时释放之后继续访问JSContext。处理方式是使用安全引用逃逸出当前作用域。34300004线程校验失败Thread mismatch.在非 ArkTS 运行线程上创建或访问 ArkTS 对象。JSContext为单线程上下文辅助函数应在对应运行线程上调用。34300005ArkTS 数据类型不匹配The ArkTS data types do not match.值类型转换asXXX系列时目标类型与实际类型不符。由此可归纳出使用ohos.ark_interop_helper时的三条实践要点在正确的线程上调用所有涉及JSContext的函数mapFromJSValue、mapToJSValue应在 ArkTS 运行线程上执行否则会触发线程校验失败34300004。即时消费JSValue传给辅助函数的JSValue及返回的JSValue都应保持在互操作回调栈内使用需要跨作用域传递时先转换为仓颉类型或安全引用。处理可空与异常mapFromJSValue返回?HashMapString, T需显式匹配None分支涉及 ArkTS 侧执行的转换可能抛出携带上述错误码的BusinessException应结合 互操作错误码文档 做针对性处理。七、与其他互操作辅助能力的配合ohos.ark_interop_helper的函数常与互操作主库中的运行时管理能力配合使用。以仓库中的 仓颉-ArkTS 互操作辅助库使用文档 为例官方给出的辅助库用法是在仓颉侧维护一个JSRuntime单例OptionJSRuntime缓存在UIAbility的onCreate中保存UIAbilityContext全局实例随后调用辅助库提供的getJSContext(runtime, abilityContext)将UIAbilityContext转换为互操作可调用的JSValueimport ohos.ark_interop.* import ohos.ark_interop_helper.* import ohos.ability.UIAbilityContext var runtime OptionJSRuntime.None // 从全局变量中获取 JSRuntime 或创建 JSRuntime func getRuntime() { return match (runtime) { case Some(v) v case None let v JSRuntime() runtime v v } }该模式与本文介绍的 4 个函数可以自然衔接拿到JSRuntime/JSContext后即可调用mapFromJSValue/mapToJSValue完成结构化数据的互转而在与 NAPI 层混编时则使用arktsValueToNapiValue与isStageMode打通 NAPI 侧。更完整的互操作开发背景互操作宏、ArkTS 模块加载、多线程使用互操作库等可参考 cangjie-arkts 学习文档目录。八、API 速查汇总函数签名起始版本 22作用arktsValueToNapiValue(napi_env, JSValue) - napi_value将JSValue转化为napi_valueisStageMode(napi_env, napi_value) - Bool判断是否处于 Stage 应用模式mapFromJSValueT(JSContext, JSValue, (JSContext, JSValue) - T) - ?HashMapString, T把JSValue格式数据转换为HashMapmapToJSValueT(JSContext, ?HashMapString, T, (JSContext, T) - JSValue) - JSValue把HashMap格式数据转换为JSValue相关文档ohos.ark_interopArkTS 互操作库JSValue、JSContext、JSObject及各基础类型JSInteropType扩展的完整 API 定义。ArkTS 互操作库错误码3430000134300005 等错误码的含义与处理步骤。ohos.business_exception通用异常信息、ohos.callback_invoke通用回调信息互操作异常与回调相关 API。仓颉-ArkTS 互操作辅助库使用文档辅助库在真实项目中的getJSContext用法示例。赞分享文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载相关推荐F´ GDS Histories 深度解析Chronological / Test / Ram 三种历史实现的机制、接口与集成测试实战F´ GDS Histories 深度解析Chronological / Test / Ram 三种历史实现的机制、接口与集成测试实战 F´F Prime文档知识库教程OpenHarmonyPostgreSQL 是否正在吞噬数据库世界——system-design-101 视角下的全能数据库能力全景PostgreSQL 是否正在吞噬数据库世界——system design 101 视角下的全能数据库能力全景 本指南基于 is postgresql eat文档知识库教程OpenHarmony仓颉语言 ArkTS 互操作实战ohos.ark_interop 模块 API 详解仓颉语言 ArkTS 互操作实战ohos.ark_interop 模块 API 详解 本篇技术指南以 OpenHarmony 仓颉应用的 ohos.ark_i文档知识库教程OpenHarmony上一篇一键切换Lucide图标深色模式适配全攻略下一篇终极解决LangChain4J中OpenAI与Azure OpenAI依赖冲突Spring Boot集成实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站