1.环境
Ubuntu 14.04
node 4.5.0
node-gyp 3.4.0
2.项目
新建项目,加入组件nan和bindings
方法一、在项目文件的node_modules中复制组件nan和bindings的全部代码包;
方法二、在package.json的dependencies中加入这两个组件,用nmp安装
3.c++源码
//myobject.h#ifndef MYOBJECT_H#define MYOBJECT_H#include <nan.h>class MyObject : public Nan::ObjectWrap { public: static void Init(v8::Local<v8::Object> exports); PRivate: explicit MyObject(double value = 0); ~MyObject(); static void New(const Nan::FunctionCallbackInfo<v8::Value>& info); static void GetValue(const Nan::FunctionCallbackInfo<v8::Value>& info); static void PlusOne(const Nan::FunctionCallbackInfo<v8::Value>& info); static void Multiply(const Nan::FunctionCallbackInfo<v8::Value>& info); static Nan::Persistent<v8::Function> constructor; double value_;};#endif//myobject.cc#include "myobject.h"Nan::Persistent<v8::Function> MyObject::constructor;MyObject::MyObject(double value) : value_(value) {}MyObject::~MyObject() {}void MyObject::Init(v8::Local<v8::Object> exports) { Nan::HandleScope scope; // Prepare constructor template v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New); tpl->SetClassName(Nan::New("MyObject").ToLocalChecked()); tpl->InstanceTemplate()->SetInternalFieldCount(1); // Prototype Nan::SetPrototypeMethod(tpl, "value", GetValue); Nan::SetPrototypeMethod(tpl, "plusOne", PlusOne); Nan::SetPrototypeMethod(tpl, "multiply", Multiply); constructor.Reset(tpl->GetFunction()); exports->Set(Nan::New("MyObject").ToLocalChecked(), tpl->GetFunction());}void MyObject::New(const Nan::FunctionCallbackInfo<v8::Value>& info) { if (info.IsConstructCall()) { // Invoked as constructor: `new MyObject(...)` double value = info[0]->IsUndefined() ? 0 : info[0]->NumberValue(); MyObject* obj = new MyObject(value); obj->Wrap(info.This()); info.GetReturnValue().Set(info.This()); } else { // Invoked as plain function `MyObject(...)`, turn into construct call. const int argc = 1; v8::Local<v8::Value> argv[argc] = { info[0] }; v8::Local<v8::Function> cons = Nan::New<v8::Function>(constructor); info.GetReturnValue().Set(cons->NewInstance(argc, argv)); }}void MyObject::GetValue(const Nan::FunctionCallbackInfo<v8::Value>& info) { MyObject* obj = ObjectWrap::Unwrap<MyObject>(info.Holder()); info.GetReturnValue().Set(Nan::New(obj->value_));}void MyObject::PlusOne(const Nan::FunctionCallbackInfo<v8::Value>& info) { MyObject* obj = ObjectWrap::Unwrap<MyObject>(info.Holder()); obj->value_ += 1; info.GetReturnValue().Set(Nan::New(obj->value_));}void MyObject::Multiply(const Nan::FunctionCallbackInfo<v8::Value>& info) { MyObject* obj = ObjectWrap::Unwrap<MyObject>(info.Holder()); double multiple = info[0]->IsUndefined() ? 1 : info[0]->NumberValue(); v8::Local<v8::Function> cons = Nan::New<v8::Function>(constructor); const int argc = 1; v8::Local<v8::Value> argv[argc] = { Nan::New(obj->value_ * multiple) }; info.GetReturnValue().Set(cons->NewInstance(argc, argv));}//addon.cc#include <nan.h>#include "myobject.h"void InitAll(v8::Local<v8::Object> exports) { MyObject::Init(exports);}NODE_MODULE(addon, InitAll)4.binding.gyp{ "targets" : [ { "target_name": "addon", "sources":["addon.cc", "myobject.cc"], "include_dirs":[ "<!(node -e /"require('nan')/")" ] } ]}5.js源码var addon = require('bindings')('addon');var obj = new addon.MyObject(10);console.log(obj.plusOne());console.log(obj.plusOne());console.log(obj.plusOne());console.log(obj.multiply().value());console.log(obj.multiply(10).value());var newobj = obj.multiply(-1);console.log(newobj.value());console.log(obj === newobj);6.编译addoncd到源码目录下
node-gyp configure build 7.执行cd 到源码目录下
node hello.js
新闻热点
疑难解答
图片精选