仓颉语言中导入 ArkTS 模块:JSContext.requireArkModule 使用指南 文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载导读本文围绕仓颉- ArkTS 互操作中的关键接口JSContext.requireArkModule系统讲解如何在仓颉代码中动态加载 ArkTS 模块并访问其导出的变量与调用其导出的接口。文中覆盖系统模块、hap/har/hsp 模块内文件以及 nativenapi | 仓颉模块五类加载场景包含完整的 build-profile.json5、oh-package.json5 工程配置与可编译的仓颉示例代码。阅读完成后你将掌握 ArkTS 模块名与仓颉导入名的映射规则、各类模块的工程配置要点、加载结果 JSValue 的读取与调用方法以及线程限制与常见错误码排查手段。场景介绍为什么需要在仓颉里加载 ArkTS 模块在 OpenHarmony 系统中仓颉与 ArkTS 的互操作能力基于仓颉 CFFIC Foreign Function Interface与 ArkTS 运行时接口实现为开发者提供库级别的互操作能力参见 仓颉-ArkTS 互操作概述。对于仓颉应用而言一个典型诉求是复用 ArkTS 生态中已有的系统库与三方模块。ArkTS 互操作库中提供的JSContext.requireArkModule接口正是为此设计它可以在仓颉侧加载一个 ArkTS 模块模块加载成功后返回一个JSValue随后开发者即可通过互操作接口访问模块导出的变量、调用模块导出的接口。从调用形态上看该能力属于仓颉调用 ArkTS方向的动态导入方式。与之相对的另一种形态是仓颉侧通过互操作库预先requireSystemNativeModule加载 NAPI 模块见 仓颉侧调用 ArkTS 模块而requireArkModule进一步放宽了对模块来源的限制可加载源码形态的 ArkTS 文件。函数说明requireArkModule 接口签名public func requireArkModule(src: String): JSValue该接口定义于互操作库ohos.ark_interop的JSContext类上在 API 参考文档 cj-apis-ark_interop.md 中有完整定义功能导入一个 ArkTS 模块起始版本为 23。参数src模块标识符String 类型具体格式取决于目标模块类型详见下文支持场景。返回值ArkTS 模块对应的JSValue对象可通过.asObject()等方法转换为具体的 ArkTS 引用类型。可能的异常调用requireArkModule可能抛出BusinessException对应错误码如下完整说明见 互操作错误码错误码错误信息含义34300002Module initialize fail模块初始化失败ArkTS 运行时异常或模块初始化逻辑出错34300004Thread mismatch线程校验失败在非 ArkTS 运行时绑定线程上执行互操作34300006Target module not exist导入的 ArkTS 模块不存在路径错误或系统模块在低版本系统上不存在34300007Can not requireArkModule during initializing cangjie module在仓颉导出 ArkTS 接口期间模块导出流程中调用导入接口34300008Current application have not support requireArkModule of the url当前应用不支持导入指定的 ArkTS 模块使用限制在实际编码前需要先了解requireArkModule的三条使用约束只能在 ArkTS 绑定线程使用该接口。仓颉线程是用户态线程互操作逻辑要求运行在与 ArkTS 运行时绑定的系统线程上否则将触发线程相关异常如错误码 34300004对应JSThreadMisMatch异常。禁止在全局变量初始化过程和模块导出流程中使用该接口。这与错误码 34300007 对应——在仓颉模块注册导出接口期间调用导入会直接失败。部分系统模块如 ohos.router只在主运行时上提供在 worker 线程导入将产生错误。注意当前在spawn(Main)或context.postJSTask的回调里直接调用该接口将失败该限制计划在后续的版本里移除。关于线程约束的更多处理手段如JSContext.isInBindThread()判断、JSContext.postJSTask切回 ArkTS 线程可参见 仓颉-ArkTS 互操作开发规范。支持场景与 src 格式总览requireArkModule可加载五类模块src的格式随模块类型不同而变化场景src 格式说明系统模块ohos.*、system.*、hms.*和kit.*如ohos.hilog/hap 模块里的文件模块名/模块下路径如entry/src/main/ets/Index支持.ets、.ts和.js格式的文件。src 不带后缀适用于所有场景har 模块里的文件模块名/模块下路径如myhar/src/main/ets/Index支持本地 | 远程 | ohpm源码 | 二进制har需要额外配置hsp 模块里的文件模块名/模块下路径如ohos/lottie/src/main/js/main支持远程 | ohpmhspnative 模块lib模块名.so如libentry.so支持har|本地hsp|hap里带的napi|仓颉模块提示与 NAPI 模块的导入名称映射规则不同ohos.file.photoAccessHelper在仓颉侧需去掉ohos.前缀参见 ArkTS 侧获取互操作模块名requireArkModule的src直接使用 ArkTS 侧模块名/路径无需二次映射。加载系统模块系统模块的加载最简单直接传入ohos.*、system.*、hms.*或kit.*形式的模块标识符即可。以ohos.hilog为例func loadModule(context: JSContext): Unit { // 1. 使用requireArkModule导入模块ohos.hilog let module context.requireArkModule(ohos.hilog) // 2. 把导入的模块转换为JSObject let hilog module.asObject() // 3. 调用对象的info方法 hilog.callMethod(info, [ context.number(0).toJSValue(), context.string(test).toJSValue(), context.string(load hilog success).toJSValue() ]) }代码中的三步操作概括了requireArkModule返回值的通用使用模式先拿到JSValue再通过asObject()转为JSObject最后用callMethod调用方法或通过下标[key]读写属性。系统模块在导入前即可在 ArkTS 侧确认其 API 形态因此适合直接按其文档调用。加载 hap 模块里的文件当目标文件位于当前 hap应用安装包模块内时例如 ArkTS 侧存在如下源码文件// entry/src/main/ets/Test.ets export function test() { console.log(call hap file) } export let value 123步骤 1配置 build-profile.json5需要在模块的build-profile.json5中将该 ArkTS 文件加入runtimeOnly.sources列表使其在运行时仍然保留{ buildOption: { arkOptions: { runtimeOnly: { sources: [ ./src/main/ets/Test.ets ] } } } }步骤 2导入文件并访问导出接口func loadModule(context: JSContext): Unit { // 1. 使用requireArkModule导入模块 let module context.requireArkModule(entry/src/main/ets/Test) // 2. 把导入内容转换为JSObject let test module.asObject() // 3. 读取导出的value变量 let value test[value].toNumber() Hilog.info(value is ${value}) // 4. 写value变量 test[value] context.number(2).toJSValue() // 5. 调用导出的test方法 test.callMethod(test) }这里演示了模块导出内容的三种访问方式读变量test[value].toNumber()将 JSValue 转换为仓颉数值类型写变量test[value] context.number(2).toJSValue()赋值右侧必须是JSValue因此需要先用JSContext的构造方法生成目标值调方法test.callMethod(test)无参方法可直接调用有参时参照系统模块示例传入参数数组。注意src中不带文件后缀.ets/.ts/.js该规则适用于所有场景。加载 har 模块里的文件harHarmony Archive模块的来源更丰富支持本地源码 har、预编译的远程 har 以及发布到 ohpm 的 har因此需要额外配置依赖与打包规则。步骤 1模块依赖配置在模块的oh-package.json5中声明对 har 的依赖三种来源的写法如下// 模块下的 oh-package.json5 { name: entry, version: 1.0.0, dependencies: { localhar: file:../localhar, // 本地har在同一个工程下用相对路径指向模块根目录 remotehar: file:../prebuilts/remotehar.har, // 远程har预编译为har不区分源码har和二进制har用路径指向har文件 ohos/lottie: ^2.0.0 // ohpm har已发布到ohpm的har指定版本即可 }, }步骤 2配置 build-profile.json5与 hap 场景不同har 场景需要在build-profile.json5的runtimeOnly.packages中列出允许在运行时加载的 har 包名{ buildOption: { arkOptions: { runtimeOnly: { packages: [ localhar, remotehar, ohos/lottie ] } } } }步骤 3导入和调用导出的接口func loadModule(context: JSContext): Unit { // 1. 使用requireArkModule导入模块 let module context.requireArkModule(localhar/src/main/ets/Test) // 导入本地har里的文件 let module context.requireArkModule(remotehar/src/main/ets/Test) // 导入远程har里的文件 let module context.requireArkModule(ohos/lottie/src/main/js/main) // 导入ohpm har里的文件 // 2. 把导入内容转换为JSObject let test module.asObject() // 3. 读取导出的value变量 let value test[value].toNumber() Hilog.info(value is ${value}) // 4. 写value变量 test[value] context.number(2).toJSValue() // 5. 调用导出的test方法 test.callMethod(test) }注意整包导入的本质ArkTS 静态导入中存在整包导入机制例如import * as localhar from localhar。这种导入本质上仍然是导入一个文件每个har | hsp模块的oh-package.json中有一个字段main它指向一个源码文件整包导入时实际导入的就是该文件。因此若localhar的oh-package.json配置为main: Index.ets那么使用本接口时应写成context.requireArkModule(localhar/Index)——把main指向的文件名作为路径的最后一段而非使用模块名本身。加载 hsp 模块里的文件hspHarmony Shared Package共享包场景无需修改build-profile.json5直接导入模块路径即可。hsp 支持远程 | ohpm两种来源func loadModule(context: JSContext): Unit { // 1. 使用requireArkModule导入模块 let module context.requireArkModule(localhsp/src/main/ets/Test) // 导入本地hsp里的文件 // 2. 把导入内容转换为JSObject let test module.asObject() // 3. 读取导出的value变量 let value test[value].toNumber() Hilog.info(value is ${value}) // 4. 写value变量 test[value] context.number(2).toJSValue() // 5. 调用导出的test方法 test.callMethod(test) }加载 native 模块针对 hap、har 和本地 hsp 中定义的 nativenapi | 仓颉模块可以直接通过生成的二进制名称.so文件名进行加载func loadModule(context: JSContext): Unit { // 1. 使用requireArkModule导入模块 let module context.requireArkModule(libentry.so) // 导入native模块 // 2. 把导入内容转换为JSObject let test module.asObject() // 3. 读取导出的value变量 let value test[value].toNumber() Hilog.info(value is ${value}) // 4. 写value变量 test[value] context.number(2).toJSValue() // 5. 调用导出的test方法 test.callMethod(test) }该场景的加载对象既包括通过Interop宏或互操作库注册导出的仓颉模块如 仓颉-ArkTS 互操作库 中通过JSModule.registerModule注册EXPORT_MODULE的产物也包括 NAPI 实现的动态库。只要二进制名称正确即可用libxxx.so形式统一加载。加载结果的通用操作从 JSValue 到仓颉数据所有场景中requireArkModule返回的JSValue是 ArkTS 运行时中的统一数据类型参见 仓颉-ArkTS 互操作概述。其后续操作遵循互操作库的通用规则详细示例见 仓颉访问 ArkTS 数据要点如下类型判定可用JSValue.typeof()获取JSType枚举或用isNumber()、isObject()等校验接口确认类型转为仓颉数据拷贝如.toNumber()、.toString()得到的是仓颉侧拷贝ArkTS 数据可能在仓颉变量生命周期内释放转为 ArkTS 引用如.asObject()、.asString()得到的是 ArkTS 数据引用期间 ArkTS 数据不能释放构造值通过JSContext的方法类构造如context.number(...)、context.string(...)、context.boolean(...)再经.toJSValue()生成跨语言传参值。常见错误与排查建议结合 互操作错误码requireArkModule使用中常见的失败可按下述思路排查34300006 模块不存在检查src路径是否正确若是系统模块确认设备 ApiLevel 是否满足该模块的版本要求34300004 线程不匹配确认调用发生在 ArkTS 绑定线程上必要时先用JSContext.isInBindThread()判断再通过postJSTask切换到 ArkTS 线程执行34300007 导出期间导入检查是否在JSModule.registerModule等模块导出流程中调用了requireArkModule将调用移除或延迟到运行时34300008 应用不支持当前仓颉应用对 ArkTS 源码模块的导入支持有限若出现该异常可切换为 ArkTS 应用形态或等待后续版本能力放开spawn(Main)/postJSTask 回调中调用失败属于当前版本已知限制应避免在这两类异步回调中直接调用该接口。延伸阅读仓颉-ArkTS 互操作概述JSValue、JSContext、JSCallInfo、JSRuntime 四大核心类型说明仓颉侧调用 ArkTS 模块基于requireSystemNativeModule的 NAPI 模块调用方式ArkTS 侧获取互操作模块名ohos/hms 前缀模块与仓颉导入名称的映射规范仓颉访问 ArkTS 数据JSValue 类型判定、转换与属性读写全集仓颉-ArkTS 互操作开发规范线程约束、异常处理、跨引擎实例上下文敏感等工程规范ohos.ark_interop API 参考requireArkModule及互操作库全量接口定义ArkTS 互操作库错误码34300001-34300008 错误码完整说明赞分享文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载相关推荐PostgreSQL 是否正在吞噬数据库世界——system-design-101 视角下的全能数据库能力全景PostgreSQL 是否正在吞噬数据库世界——system design 101 视角下的全能数据库能力全景 本指南基于 is postgresql eat文档知识库教程OpenHarmony仓颉-ArkTS 互操作实战ArkTS 侧用 import 与 loadNativeModule 加载并调用仓颉模块仓颉 ArkTS 互操作实战ArkTS 侧用 import 与 loadNativeModule 加载并调用仓颉模块 本篇指南聚焦仓颉 ArkTS 互操作中文档知识库教程OpenHarmony仓颉语言 HLE 工具使用指南自动生成 ArkTS/C 语言互操作胶水代码仓颉语言 HLE 工具使用指南自动生成 ArkTS/C 语言互操作胶水代码 导读 HLE HyperlangExtension 是仓颉Cangjie官文档教程上一篇推荐一款强大的Python Websocket服务器框架——Websocket Server下一篇Zod 仓库中如何托管 typia 预构建校验产物transformer 构建机制的工程化处理与再生成指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考