当前位置: 首页 > 后端技术 > Node.js

【Node】AddonC++模块开发

时间:2023-04-03 18:15:56 Node.js

NodeAddonNodeAddon是官方开发C++模块的方式,可以实现Node与驱动、操作系统等底层技术的结合。开发环境需要安装nodev8.11.1npmv5.6.0node-gyppython2.7VS2017CommunityC/C++桌面开发(或windwos-build-tools)VSCode或其他IDE安装步骤1.安装node,npm(略)2.安装python2.7(略)#在npm中设置python环境变量npmconfigsetpython=C:\\Python27\\python.exe3.安装VS2017CommunityC/C++桌面开发(略)#npmsetvsversion环境变量npmconfigsetmsvs_version=20174.installnode-gyp#安装node-gypnpmglobalinstall-gnode-gyp5.VSCodeorotherIDEs(略)HelloWorld从创建一个空项目文件夹开始mkdirhelloworld-addoncdhelloworld-addonnpminit#一顿饭回车#安装addon开发所需的基础模块npminstall--savenanbindings开始开发C++模块创建源文件![hello.cc](),写入如下代码://@file:hello.cc//@author:jialun.liu//@date:2018-09-29#include#include#includeusingnamespacestd;usingnamespaceNan;usingnamespacev8;voidhello(constNan::FunctionCallbackInfo&info){if(info.Length()<1||!info[0]->IsString()){Nan::ThrowTypeError("非法参数:hello('hello')");返回;}v8::String::Utf8Value输入t(信息[0]->ToString());std::stringoutput(*input,input.length());输出=输出+“世界”;//创建字符串并返回Localstr=Nan::New(output).ToLocalChecked();info.GetReturnValue().Set(str);}voidInit(v8::Localexports){//导出函数,就像在nodejs中一样:module.exports.hello=helloexports->Set(Nan::New("hello").ToLocalChecked(),Nan::New(hello)->GetFunction());}//selfregistryNODE_MODULE(hello,Init)编译配置创建编译配置文件binding.gyp,类似Makefile,注意这是一个python格式文件#-*-coding:UTF-8-*-#@file:binding.gyp#@author:jialun.liu#@date:2018-9-29{#跨操作系统的配置,比如不同的操作系统可能链接不同的库,使用不同的编译参数"conditions":[['OS=="linux"',{"targets":[{#编译的模块名称"target_name":"hello",#源文件,如果有多个则一一列出"source":["hello.cc"],"include_dirs":[#在这里添加我们需要查找的头文件路径,nan是必须的"nodeStr=Nan::New(str).ToLocalChecked();//转换NodeString//从参数nodeStr(info[0]->ToString())中读取v8::String::Utf8Value;//转换为std::stringstd::stringstdStr(*nodeStr,nodeStr.length());//转换为char*char*cStr=stdStr.c_str();value类型包括不支持64位整数的浮点数和整数。Number/double//创建doubled=123456.789;v8::Localnd=Nan::New(d);//从参数读取doubled=info[0]->NumberValue();Int32/int,UInt32/unsignedint//createinti32=123456;v8::Localni32=Nan::New(i32);unsignedui32=0xffffffff;v8::Localnui32=Nan::New(ui32);//从参数中读取int32_ti32=info[0]->Int32Value();uint32_tu32=信息[1]->Uint32Value();Buffer/char*//创建长度为8的Bufferv8::Localbuf=Nan::NewBuffer(8).ToLocalChecked();//获取缓冲区指针longlong*bp=node::Buffer::Data(buf);//操作指针*bp=0x12345678;//从参数读取char*p=(char*)node::Buffer::Data(info[0]->ToObject());Array/XX[]//创建一个长度为10的数组v8::Localarray=Nan::New(10);//给数组赋值Nan::Set(array,0,南::新(“第一个”));Nan::Set(array,1,Nan::New("second"));//TODO:从参数读取//v8::Localarray=Nan::Cast(info[0]->ToObject());踩坑1、c++代码中不要出现中文注释,否则编码错误会导致意想不到的问题,比如莫名其妙的某些代码不会生效(因为编码问题导致编译器识别换行错误,代码被认为被注释掉了,切记!!!)https://github.com/liujialun/...