【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
开发一个 N-API 模块听起来可能有点技术感十足,但实际上入门并不复杂。本文,我们来一步步实现一个简单的 Hello World 原生模块,感受一下 N-API 开发的魅力,为HarmonyOS Next中使用C++接口做知识储备。
环境准备
在开始之前,请确保你已经安装了以下工具:
- Node.js:运行时环境,建议安装 LTS 版本。
- C++ 编译器:根据你的操作系统安装合适的编译器(如 Visual Studio Build Tools、Xcode 或 GCC)。
- node-gyp :通过 npm 安装,运行
npm install -g node-gyp
即可。
这些工具前面环境搭建文章已配置完成,现在可以着手开发了。
创建项目
-
创建一个新的项目文件夹:
bashmkdir napi-hello-world cd napi-hello-world
-
初始化 Node.js 项目:
bashnpm init -y
这会生成一个默认的
package.json
文件。 -
安装必要的依赖:
bashnpm install --save nan
配置构建工具
N-API 使用 node-gyp
来编译原生代码,因此需要创建一个 binding.gyp
文件。
-
在项目根目录下创建
binding.gyp
文件:json{ "targets": [ { "target_name": "hello", "sources": ["hello.cc"] } ] }
这里的
target_name
是模块的名字,sources
指定了 C++ 源文件。
编写 C++ 源代码
接下来,我们需要创建一个简单的 C++ 文件 hello.cc
,实现 Hello World 功能。
-
创建
hello.cc
文件:cpp#include <napi.h> Napi::String HelloWorld(const Napi::CallbackInfo& info) { return Napi::String::New(info.Env(), "Hello, HarmonyOS N-API!"); } Napi::Object Init(Napi::Env env, Napi::Object exports) { exports.Set("hello", Napi::Function::New(env, HelloWorld)); return exports; } NODE_API_MODULE(hello, Init)
这段代码的核心逻辑是定义了一个返回字符串的函数
HelloWorld
,并将其暴露给 Node.js 使用。
编译模块
使用 node-gyp
将上述代码编译成可运行的模块:
-
运行以下命令生成构建文件:
bashnode-gyp configure
-
执行编译:
bashnode-gyp build
如果一切正常,你将在项目目录下看到一个
build/Release
文件夹,里面包含了编译生成的模块文件(如hello.node
)。
测试模块
我们可以通过一个简单的 JavaScript 文件测试刚刚创建的模块。
-
在项目根目录下创建
test.js
文件:javascriptconst hello = require('./build/Release/hello'); console.log(hello.hello());
-
运行测试文件:
bashnode test.js
如果输出
Hello, HarmonyOS N-API!
,恭喜你,原生模块开发成功了!
代码寿命
简单说明下一下代码的关键部分:
- Napi::String::New
这是 N-API 提供的 API,用于创建一个 JavaScript 字符串对象。 - Napi::Object::Set
用来将函数绑定到模块的导出对象中,以便在 JavaScript 中调用。 - NODE_API_MODULE
宏定义模块的入口函数,告诉 Node.js 这个模块应该如何初始化。
扩展与提升
这个 Hello World 模块只是 N-API 的基础入门,接下来可以尝试添加更多功能,比如:
- 接受参数并进行简单计算。
- 与操作系统进行交互(如文件系统、网络请求)。
- 集成现有的 C++ 库,扩展模块的功能。
通过这些实践,你会更深入地理解 N-API 的强大之处,也为后续的 HarmonyOS 开发打下坚实基础。