HarmonyOS:Node-API实现跨语言交互(1)Node-API简介
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )
➤GitHub地址:https://github.com/strengthen
➤原文地址:https://www.cnblogs.com/strengthen/p/18503923
➤如果链接不是为敢技术的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
场景介绍
HarmonyOS Node-API是基于Node.js 8.x LTS的Node-API规范扩展开发的机制,为开发者提供了ArkTS/JS与C/C++模块之间的交互能力。它提供了一组稳定的、跨平台的API,可以在不同的操作系统上使用。
本文中如无特别说明,后续均使用Node-API指代HarmonyOS Node-API能力。
HarmonyOS Node-API与Node.js 8.x LTS的Node-API规范的接口异同点,详见Node-API参考
一般情况下HarmonyOS应用开发使用ArkTS/JS语言,但部分场景由于性能、效率等要求,比如游戏、物理模拟等,需要依赖使用现有的C/C++库。Node-API规范封装了I/O、CPU密集型、OS底层等能力并对外暴露ArkTS/JS接口,从而实现ArkTS/JS和C/C++的交互。主要场景如下:
-
系统可以将框架层丰富的模块功能通过ArkTS/JS接口开放给上层应用。
-
应用开发者也可以选择将一些对性能、底层系统调用有要求的核心功能用C/C++封装实现,再通过ArkTS/JS接口使用,提高应用本身的执行效率。
Node-API的组成架构
图1 Node-API的组成架构
-
Native Module:开发者使用Node-API开发的模块,用于在ArkTS侧导入使用。
-
Node-API:实现ArkTS与C/C++交互的逻辑。
-
ModuleManager:Native模块管理,包括加载、查找等。
-
ScopeManager:管理napi_value的生命周期。
-
ReferenceManager:管理napi_ref的生命周期。
-
NativeEngine:ArkTS引擎抽象层,统一ArkTS引擎在Node-API层的接口行为。
-
ArkCompiler ArkTS Runtime:ArkTS运行时。
Node-API的关键交互流程
图2 Node-API的关键交互流程
ArkTS和C++之间的交互流程,主要分为以下两步:
-
初始化阶段:当ArkTS侧在import一个Native模块时,ArkTS引擎会调用ModuleManager加载模块对应的so及其依赖。首次加载时会触发模块的注册,将模块定义的方法属性挂载到exports对象上并返回该对象。
-
调用阶段:当ArkTS侧通过上述import返回的对象调用方法时,ArkTS引擎会找到并调用对应的C/C++方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-10-26 [Swift]LeetCode4. 两个排序数组的中位数 | Median of Two Sorted Arrays
2018-10-26 [Swift]LeetCode3. 无重复字符的最长子串 | Longest Substring Without Repeating Characters
2018-10-26 [Swift]LeetCode913.猫与老鼠 | Cat and Mouse
2018-10-26 [Swift]LeetCode916.单词子集 | Word Subsets
2018-10-26 [Swift]LeetCode915.将分区数组分成不相交的间隔 | Partition Array into Disjoint Intervals
2018-10-26 [Swift]LeetCode914.一副牌中的X | X of a Kind in a Deck of Cards
2018-10-26 [Swift]堆栈Stack的两种版本:(1)用类包装Stack (2)用泛型包装Stack