创建Hello.cc文件
#include <node_api.h>
namespace demo {
napi_value Method(napi_env env, napi_callback_info args) {
napi_value greeting;
napi_status status;
status = napi_create_string_utf8(env, "world", NAPI_AUTO_LENGTH, &greeting);
if (status != napi_ok) return nullptr;
return greeting;
}
napi_value init(napi_env env, napi_value exports) {
napi_status status;
napi_value fn;
status = napi_create_function(env, nullptr, 0, Method, nullptr, &fn);
if (status != napi_ok) return nullptr;
status = napi_set_named_property(env, exports, "hello", fn);
if (status != napi_ok) return nullptr;
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)
}
- 每一个node.js的插件,都必须暴露如下模式的初始化函数:
void Initialize(Local<Object> exports);
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
- 参数
module_name
除了后缀.node
不一样之外,必须和最终的二进制文件名称相匹配。
- 上述列子中,初始化函数是
init
,module_name
使用了NODE_GYP_MODULE_NAME
宏,该宏在使用node-gyp
进行编译时,会保证二进制文件名称被当作第一个参数传递给NODE_MODULE
。
创建binding.gyp
{
"targets": [
{
"target_name": "addon",
"sources": [ "hello.cc" ]
}
]
}
- 该文件是json格式的,被工具
node-gyp
所使用,用来编译我们的插件。
编译插件
- 在我们的项目目录下执行
node-gyp configure build
编译我们的插件。
- 编译完成后在目录
./build/Release
下面会生成我们的插件的二进制文件addon.node
。
测试
const addon = require('./build/Release/addon');
console.log(addon.hello());
- 执行测试文件
node hello.js
,会打印world
。
全部代码在这里