Nodejs的C扩展怎么写?怎么调用?

发布于 1周前 作者 zlyuanteng 来自 nodejs/Nestjs

Nodejs的C扩展怎么写?怎么调用?

有知道的咩?

6 回复

Node.js 的 C 扩展怎么写?怎么调用?

在 Node.js 中编写 C 扩展可以显著提高性能,特别是在处理计算密集型任务时。下面是一个简单的示例来说明如何编写和使用 Node.js 的 C 扩展。

1. 创建 C 源文件

首先,创建一个 C 文件(例如 addon.cc),在这个文件中定义你的扩展函数。以下是一个简单的例子:

// addon.cc
#include <node.h>

using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;

void Add(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();
  int a = args[0]->Int32Value(isolate->GetCurrentContext()).ToChecked();
  int b = args[1]->Int32Value(isolate->GetCurrentContext()).ToChecked();
  args.GetReturnValue().Set(a + b);
}

void Initialize(Local<Object> exports) {
  NODE_SET_METHOD(exports, "add", Add);
}

NODE_MODULE(addon, Initialize)

2. 编译 C 扩展

为了编译这个 C 文件,你需要安装 node-gyp 工具。你可以通过 npm 安装它:

npm install -g node-gyp

然后,在包含 addon.cc 的目录中运行以下命令来配置和构建项目:

node-gyp configure
node-gyp build

这将生成一个动态链接库(例如 build/Release/addon.node)。

3. 在 Node.js 中使用 C 扩展

现在你可以在 Node.js 中使用这个扩展了。创建一个 JavaScript 文件(例如 index.js)并加载扩展:

const addon = require('./build/Release/addon');

console.log(addon.add(5, 3)); // 输出 8

总结

以上就是如何编写和使用 Node.js 的 C 扩展的基本步骤。关键点包括编写 C 代码、使用 node-gyp 进行编译,并在 Node.js 中加载生成的动态链接库。这种方法非常适合需要高性能计算的任务。


官方api上有的

示例
v8文档
node v0.8.x通过node-gyp 编译 node的buffer部分是自己写的,没找到文档…可以直接看代码。Buffer类

要编写和调用 Node.js 的 C 扩展,可以使用 node-addon-api 或者直接使用 N-API(Node-API)。以下是一个简单的示例,展示如何创建一个 C 扩展并从 Node.js 中调用它。

示例代码

1. 创建 C 扩展

首先,创建一个名为 addon.cc 的文件,内容如下:

#include <napi.h>

// 定义一个简单的 C 函数
double Add(double a, double b) {
  return a + b;
}

// 绑定这个函数到 Node.js
Napi::Number AddWrap(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();

  if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber()) {
    Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
    return Napi::Number::New(env, 0);
  }

  double a = info[0].As<Napi::Number>().DoubleValue();
  double b = info[1].As<Napi::Number>().DoubleValue();

  double result = Add(a, b);

  return Napi::Number::New(env, result);
}

// 导出函数
Napi::Object Init(Napi::Env env, Napi::Object exports) {
  exports.Set(Napi::String::New(env, "add"),
              Napi::Function::New(env, AddWrap));
  return exports;
}

NODE_API_MODULE(addon, Init)

2. 编译扩展

确保安装了 node-gyp,然后运行以下命令来编译扩展:

npm install -g node-gyp
cd path/to/your/project
node-gyp configure
node-gyp build

3. 在 Node.js 中调用扩展

创建一个 index.js 文件,内容如下:

const addon = require('./build/Release/addon');

console.log(addon.add(1.0, 2.0)); // 输出: 3

解释

  • addon.cc 文件中定义了一个简单的 C 函数 Add,该函数将两个双精度浮点数相加。
  • 使用 Napi::Function::NewAdd 函数绑定到 Node.js 中的一个 JavaScript 函数 add
  • Init 函数用于导出 add 函数。
  • NODE_API_MODULE 宏用于指定模块名称和初始化函数。

通过这些步骤,你可以成功创建并调用一个 Node.js 的 C 扩展。这种方法非常适合需要高性能计算的任务,或者当你希望重用现有的 C/C++ 库时。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!