最近在看一个使用JS控制树莓派的项目(https://github.com/fivdi/pigpio);发现它其实是利用一个nodejs的C++扩展,最终调用C库实现的;所以分享下nodejs的C++扩展,使用的是nan的方式;
1.初始化node项目
mkdir demo
cd demo
npm init
2.安装编译工具和头文件
sudo npm install -g node-gyp
npm install nan bindings --save
node-gyp是C++扩展的编译工具;
nan和bindings包含了C++扩展需要的头文件;
3.编写C++代码(./src/demo.cc)
#include <nan.h>
NAN_METHOD(multi)
{
int result = 1;
for (int i = 0; i < info.Length(); i++)
{
result *= info[i]->NumberValue();
}
info.GetReturnValue().Set(Nan::New(result));
}
NAN_METHOD(add)
{
int result = 0;
for (int i = 0; i < info.Length(); i++)
{
result += info[i]->NumberValue();
}
info.GetReturnValue().Set(Nan::New(result));
}
void init(v8::Local<v8::Object> exports)
{
Nan::SetMethod(exports, "multi", multi);
Nan::SetMethod(exports, "add", add);
}
NODE_MODULE(demo, init);
4.编写node-gyp配置文件
文件名固定为binding.gyp,提供给node-gyp来编译C++扩展;
{
"targets": [
{
"target_name": "demo",
"sources": [ "./src/demo.cc" ],
"include_dirs": [
"<!(node -e \"require('nan')\")"
]
}
]
}
5.运行配置文件、编译C++文件
// 只有配置文件发生变化后,才需运行
node-gyp configure
node-gyp build
6.编写js代码测试(./demo.js)
const demo = require('./build/Release/demo')
console.log(demo.add(3, 6));
console.log(demo.multi(3, 6));
node demo.js
9
18