【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块

【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块

开发一个 N-API 模块听起来可能有点技术感十足,但实际上入门并不复杂。本文,我们来一步步实现一个简单的 Hello World 原生模块,感受一下 N-API 开发的魅力,为HarmonyOS Next中使用C++接口做知识储备。

环境准备

在开始之前,请确保你已经安装了以下工具:

  1. Node.js:运行时环境,建议安装 LTS 版本。
  2. C++ 编译器:根据你的操作系统安装合适的编译器(如 Visual Studio Build Tools、Xcode 或 GCC)。
  3. node-gyp :通过 npm 安装,运行 npm install -g node-gyp 即可。

这些工具前面环境搭建文章已配置完成,现在可以着手开发了。

创建项目
  1. 创建一个新的项目文件夹:

    bash 复制代码
    mkdir napi-hello-world
    cd napi-hello-world
  2. 初始化 Node.js 项目:

    bash 复制代码
    npm init -y

    这会生成一个默认的 package.json 文件。

  3. 安装必要的依赖:

    bash 复制代码
    npm install --save nan
配置构建工具

N-API 使用 node-gyp 来编译原生代码,因此需要创建一个 binding.gyp 文件。

  1. 在项目根目录下创建 binding.gyp 文件:

    json 复制代码
    {
      "targets": [
        {
          "target_name": "hello",
          "sources": ["hello.cc"]
        }
      ]
    }

    这里的 target_name 是模块的名字,sources 指定了 C++ 源文件。

编写 C++ 源代码

接下来,我们需要创建一个简单的 C++ 文件 hello.cc,实现 Hello World 功能。

  1. 创建 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 将上述代码编译成可运行的模块:

  1. 运行以下命令生成构建文件:

    bash 复制代码
    node-gyp configure
  2. 执行编译:

    bash 复制代码
    node-gyp build

    如果一切正常,你将在项目目录下看到一个 build/Release 文件夹,里面包含了编译生成的模块文件(如 hello.node)。

测试模块

我们可以通过一个简单的 JavaScript 文件测试刚刚创建的模块。

  1. 在项目根目录下创建 test.js 文件:

    javascript 复制代码
    const hello = require('./build/Release/hello');
    console.log(hello.hello());
  2. 运行测试文件:

    bash 复制代码
    node test.js

    如果输出 Hello, HarmonyOS N-API!,恭喜你,原生模块开发成功了!

代码寿命

简单说明下一下代码的关键部分:

  1. Napi::String::New
    这是 N-API 提供的 API,用于创建一个 JavaScript 字符串对象。
  2. Napi::Object::Set
    用来将函数绑定到模块的导出对象中,以便在 JavaScript 中调用。
  3. NODE_API_MODULE
    宏定义模块的入口函数,告诉 Node.js 这个模块应该如何初始化。
扩展与提升

这个 Hello World 模块只是 N-API 的基础入门,接下来可以尝试添加更多功能,比如:

  1. 接受参数并进行简单计算。
  2. 与操作系统进行交互(如文件系统、网络请求)。
  3. 集成现有的 C++ 库,扩展模块的功能。
    通过这些实践,你会更深入地理解 N-API 的强大之处,也为后续的 HarmonyOS 开发打下坚实基础。
相关推荐
listening77719 分钟前
HarmonyOS 6.1 性能调优实战:从卡顿到丝滑的6个底层逻辑
华为·harmonyos
程序员黑豆44 分钟前
鸿蒙开发入门:Row 和 Column 布局组件详解
前端·harmonyos
胖大和尚1 小时前
C++ 多线程编程的实现方式
c++·thread
xd1855785551 小时前
[特殊字符] 宠物美容指南 —— 鸿蒙AI智能助手开发全流程解析
人工智能·华为·harmonyos·鸿蒙·宠物
JaneConan1 小时前
鸿蒙 ArkUI 深水区:@Watch 和 @Observed,状态变了「自动跑」+ 嵌套对象「深层重绘」
开发语言·后端·ui·harmonyos
AD02271 小时前
HarmonyOS应用实战-启示散页-06-仪式感动画不要卡业务:用 DrawingPage 隔离抽取和转场
harmonyos·arkts·鸿蒙开发
hunterandroid2 小时前
[鸿蒙从零到一] ArkUI 组件化实战:构建可复用、可组合的自定义组件
前端·华为·架构
qizayaoshuap2 小时前
# [特殊字符] 密码生成器 — 鸿蒙ArkTS安全算法与密码强度评估系统
java·算法·安全·华为·harmonyos
在水一缸2 小时前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
2401_841495642 小时前
【数据结构】B*树
数据结构·c++·b树·算法·删除·插入·三分分裂