最近要写一个addon插件,所以。。。。
准备材料:1.安装python;2.安装开发包(下载 | Node.js 中文网);3.安装vscode(windows版本)/ xcode(MAC版本)
我是在windows下开发,选择vscode。下面的经历都是windows版本,其他系统的忽略
现在网上的材料大部分不适用于新版的node.js。举个例子:新版的参数多了一个v8::Local<v8::Context> context,很多转换都要用到。以前可以直接args[0]->ToString();现在是不允许了。
安装好上述3件宝,将下载的hello范例拉到vscode上,选择nan版本,右键“在继承终端模式打开”,输入(1)>>>npm init
然后(2)>>>npm install nan
(3)>>>npm install node-gyp -g
(4)>>>node-gyp configure
(5)>>>node-gyp build
之后的debug可以选择>>>node-gyp rebuild 取代(5),最后调试>>>node hello.js
上述的hello可以在C++ 插件 | Node.js API 文档看到详细的介绍,我不细说。
搭建好调试环境,接下来就是开动addon定制了。
我这个插件需要调用外部已经写好的DLL,所以要先SetDLLPath(用到windows API "SetDllDirectory"&"GetModuleHandle"&"LoadLibrary"等),网上一堆类似的教程,我不赘述了。js调用可能是
var buf=Buffer.alloc(2048);
buf.write(__dirname+'/dll_path')
addon.jSetDllPath(Object(buf), buf.length)
C++函数SetDLLPath:
void SetDLLPath_C(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
Isolate* isolate = info.GetIsolate();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
Local<Object> out=Local<Object>::Cast(info[0]); //直接Buffer类型就Object
unsigned char *ss = (unsigned char *)node::Buffer::Data(out);
//处理传递的字符串
double arg1 = info[1]->NumberValue(context).FromJust(); //Buffer的大小
//...后面的省略
}
void Init(v8::Local<v8::Object> exports) {
v8::Local<v8::Context> context = exports->CreationContext();
exports->Set(context,
Nan::New("SetDLLPath").ToLocalChecked(),
Nan::New<v8::FunctionTemplate>(SetDLLPath_C)->GetFunction(context).ToLocalChecked());
}
NODE_MODULE(addon, Init)
这样就完成一个函数的对接。我只学Buffer和Number的传递,其他的String之类的完全摸不到边,工程时间急先这样做了。
上述的代码可以看出,js调用的实际上是暴露的接口字符串,和C的函数接口没啥关系,不过我们习惯写法都是将它们统一的(方便复制粘贴^_^)。同时也看出了新版的Buffer转换其实比旧版的要简单,但是Number转换时需要参数content,所谓的上下文。String也是和Number类似的,只不过缓存UTF8有点问题,我还在研究中。。。。
好了,暂时就这么多!