当前位置: 首页 > 科技观察

Nodejs系列使用V8写C++插件

时间:2023-03-12 20:18:01 科技观察

虽然大多数情况下都是用n-api写插件,但底层毕竟是v8(还有libuv)。使用v8编写简单的插件,熟悉v8的使用。本文介绍编写c++插件时简单常用的编写方法。其实写插件的难点在于对??libuv和v8的底层能力和理解。话不多说,直接看代码。#includenamespacedemo{usingv8::FunctionCallbackInfo;usingv8::Isolate;usingv8::Local;usingv8::Object;usingv8::String;usingv8::Value;usingv8::FunctionTemplate;usingv8::Function;usingv8::Number;usingv8::MaybeLocal;usingv8::Context;usingv8::Int32;staticintseq;//定义一个工具函数生成seqvoidGenSeq(constFunctionCallbackInfo&args){Isolate*isolate=args.GetIsolate();args.GetReturnValue().Set(Number::New(isolate,++seq));}//定义一个加法函数voidAdd(constFunctionCallbackInfo&args){Isolate*isolate=args.GetIsolate();inta=args[0].As()->Value();intb=args[1].As()->Value();args.GetReturnValue().Set(Number::New(隔离,a+b));}voidInitialize(Localexports,Localmodule,Localcontext){Isolate*isolate=context->GetIsolate();//创建一个新的函数模板Localfunc=FunctionTemplate::New(isolate);//创建一个代表函数名的新字符串Localzaylee=String::NewFromUtf8(isolate,"zaylee",v8::NewStringType::kNormal).ToLocalChecked();//设置函数名func->SetClassName(zaylee);//设置原型属性func->PrototypeTemplate()->Set(isolate,"protoField",Number::New(isolate,1));//设置对象属性func->InstanceTemplate()->Set(isolate,"instanceField",Number::New(isolate,2));func->InstanceTemplate()->Set(isolate,"add",FunctionTemplate::New(isolate,Add));//设置函数对象本身的属性func->Set(isolate,"funcField",Number::New(isolate,3));//根据函数模板创建函数Localret=func->GetFunction(context).ToLocalChecked();LocalDemo=String::NewFromUtf8(isolate,"Demo",v8::NewStringType::kNormal).ToLocalChecked();//导出函数exports->Set(context,Demo,ret).Check();//导出工具函数NODE_SET_METHOD(exports,"genSeq",GenSeq);}NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME,Initialize)}//namespacedemo写一个测试例子const{Demo,genSeq}=require('./build/Release/test.node');constdemo=newDemo();console.log('演示对象:',demo,'\n');console.log('原型属性:',demo.protoField,'\n');console.log('执行添加方法:',demo.add(1,2),'\n');console.log('执行seq方法:',genSeq(),genSeq(),'\n');最后写编译配置{"targets":[{"target_name":"test","sources":["./test.cc"]}]}看起来很简单,大致流程如下npminstall-gnode-gypnode-gypconfigurenode-gypbuildnodetest.jsnodejs的扩展方式有很多种,插件是一种,直接修改内核也是一种,之前有介绍过如何修改内核,有兴趣的同学也可以看看