NAPI篇【3】——如何编写一个NAPI函数

        在NAPI篇【2】中讲解了cpp目录中各文件的作用,默认生成的hello.cpp源代码文件中,包含NAPI函数编写、定义与注册,本篇以分析hello.cpp的Add函数用来讲解一下NAPI函数的编写。

        首先,明确一个概念,NAPI的目的是提供了JS与C/C++不同语言模块之间的相互访问(主要是数据的传递),但是JS与C/C++是不同语言,无法直接进行数据传递,需要进行数据类型转化,这需要一座桥梁。

一、NAPI数据类型

        OpenHarmony NAPI 将 ECMAScript 标准中定义的 Boolean、Null、Undefined、Number、BigInt、String、Symbol和 Object 这八种数据类型以及函数对应的 Function 类型统一封装成了napi_value 类型,是 JS 数据类型和 C/C++ 数据类型之间的桥梁。

        napi_value 表示 JS 值的不透明指针,在 C/C++ 端要使用 JS 端传递的数据类型,都是通过 NAPI 提供的相关方法把napi_value转换成 C/C++ 类型后再使用,同理当需要把 C/C++的数据传递给 JS 应用层也要通过 NAPI 提供的方法把 C/C++ 端的数据转换成 napi_value 再向上传递

   常用的C/C++与napi_value数据类型的转换。

        1、C/C++转napi_value

        (1)int类型转换

NAPI_EXTERN napi_status napi_create_int32(napi_env env,
                                          int32_t value,
                                          napi_value* result);
NAPI_EXTERN napi_status napi_create_uint32(napi_env env,
                                           uint32_t value,
                                           napi_value* result);
NAPI_EXTERN napi_status napi_create_int64(napi_env env,
                                          int64_t value,
                                          napi_value* result);

说明:

        env:方法调用者的运行环境,包含 JS 引擎等。
        value:C/C++端的 int 类型的值。
        result

### 集成和使用 NAPI-RS 开发的 Node.js 包于 Electron 项目 为了使基于 NAPI-RS 构建的 Node.js 扩展模块能够在 Electron 中正常工作,需遵循特定流程来编译这些扩展以匹配 Electron 的 Chromium 和 V8 版本。 #### 准备环境 确保已安装必要的工具链以及依赖项。这包括但不限于 Node.js、Electron 及其 CLI 工具,并且熟悉 JavaScript 和 C++ 编程[^2]。 #### 安装 napi-rs 库 在目标项目的根目录下执行命令以初始化 Rust 环境并引入 `napi` crate: ```bash cargo init --lib my_napi_extension cd my_napi_extension echo 'napi = { version = "1", features = ["napi-6"] }' >> Cargo.toml ``` 上述操作创建了一个新的 Rust 库工程,并配置好支持构建 Native Abstractions for Node.js (N-API) 接口所需的设置。 #### 创建简单的 NAPI 绑定逻辑 编辑 src/lib.rs 文件定义对外暴露的方法: ```rust use napi::bindgen_prelude::*; #[napi] pub fn greet(name: String) -> String { format!("Hello {} from Rust!", name) } ``` 这段代码实现了名为 `greet()` 的函数,它接收字符串参数返回带有问候语的新字符串。 #### 构建 .node 文件供 Electron 使用 完成源码编写之后,利用 cargo 命令行工具生成动态库文件(`.so`, `.dylib` 或者 Windows 下的 `.dll`),接着将其转换为目标平台上的 `.node` 模块以便被 Node.js 加载器识别。对于 Electron 来说,则要特别注意指定正确的 target triple 参数指向当前使用的 Electron 运行时版本对应的 ABI: ```bash npm install --save-dev electron-rebuild # 修改 package.json 添加 postinstall 脚本自动重建 native modules { ... "scripts": { "postinstall": "electron-builder install-app-deps && electron-rebuild" } } # 如果是首次运行, 则手动触发一次 rebuild ./node_modules/.bin/electron-rebuild -f -w my_napi_extension ``` 此过程会读取本地 node-gyp 设置中的 Python 解释器路径和其他必要变量,从而正确地针对所选 Electron 发布版进行交叉编译。最终产物即为可以直接由 Electron 主进程加载调用的原生插件形式——`.node` 文件[^3]。 #### 在 Electron 应用程序内引用自定义 NAPI 插件 最后一步是在前端部分通过 require() 方法导入刚才制作好的 binding 并测试功能是否按预期生效: ```javascript const addon = require('./path/to/compiled/my_napi_extension'); console.log(addon.greet('World')); // 输出 Hello World from Rust! ``` 至此便完成了整个集成步骤,在实际开发过程中可根据需求调整具体细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值