Programming/웹프로그래밍

[NodeJs] C++ Addon 하는 방법 (설치/속성/메서드/파라미터,리턴/callback/객체생성반환/함수생성/C++객체생성)

쌍쌍바나나 2016. 3. 18. 17:01
반응형

NodeJs에서 없는 Module의 경우 C++의 코드를 NodeJs에서 호출이 가능하다. 

C++을 NodeJs로 Addon하는 방법이다. 

아래에 자세한 내용을 참고해서 기능은 추가할 수 있다. 로직만 추가하면...

https://nodejs.org/dist/latest-v4.x/docs/api/addons.html

https://v8docs.nodesource.com/node-4.2/


binding.gyp의 파일명은 항상 일치해야 한다. 


Pre-Installation

  • C++ Compiler (Visual Studio설치)
  • Python 설치
  • npm install -g node-gyp
    • Node.js native addon build tool


$ node-gyp configure


$ node-gyp build (.cc가 변경이 될때마다 build를 해줘야 해요.)






void Method 는 리턴값이 world

생성된 Method를 Set하기 위해서는 void init에서 NODE_SET_METHOD()를 해준다.


node.js의 코드에서 호출이 가능하다.

var addon = require('./build/Release/hello');


console.log(addon.prop);

console.log(addon);


console.log(addon.method());



  • 파라미터와 리턴값이 있는 함수를 생성

Add내의 함수에서 args.GetReturnValue().Set(num); 하면 나중에 꺼내서 가져갈 수 있음.

.cc파일
void Add( const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();

  if (args.Length() < 2) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Wrong number of arguments")));
    return;
  }

  if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Wrong arguments")));
    return;
  }

  double value = args[0]->NumberValue() + args[1]->NumberValue();
  Local<Number> num = Number::New(isolate, value);

  args.GetReturnValue().Set(num);
}

void int() {
NODE_SET_METHOD (exports, "add" , Add);
}

node.js에서 추가되는 함수
console.log(addon.add(3,5)); 하면 8이 출력된다.

  • callback 함수
.cpp 파일에서 추가 하는 함수
void RunCallback( const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();
  Local<Function> cb = Local<Function>::Cast(args[0]);
  const unsigned argc = 1;
  Local<Value> argv[argc] = { String::NewFromUtf8(isolate, "hello world") };
  cb->Call(Null(isolate), argc, argv);
}
void init() {
NODE_SET_METHOD(exports , "callback" , RunCallback);
}

node.js에서 추가하는 statement
addon.callback(function(msg){
    console.log(msg);
});

  • 객체 생성 반환

- .cc 파일

void CreateObject( const FunctionCallbackInfo<Value>& args) {

  Isolate* isolate = args.GetIsolate();


  Local<Object> obj = Object::New(isolate);

  obj->Set(String::NewFromUtf8(isolate, "msg"), args[0]->ToString());


  args.GetReturnValue().Set(obj);

}

void init(Local<Object> exports) {

        Isolate* isolate = exports->GetIsolate();


  NODE_SET_METHOD(exports, "createObject", CreateObject);

}

- node.js

var obj = addon.createObject("hello node" );

console.log(obj.msg);

  • 함수 생성 반환

void MyFunction( const FunctionCallbackInfo<Value>& args) {

  Isolate* isolate = args.GetIsolate();

  args.GetReturnValue().Set(String::NewFromUtf8(isolate, "native function"));

}

void CreateFunction( const FunctionCallbackInfo<Value>& args) {

  Isolate* isolate = args.GetIsolate();


  Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction);

  Local<Function> fn = tpl->GetFunction();


  fn->SetName(String::NewFromUtf8(isolate, "theFunction"));


  args.GetReturnValue().Set(fn);

}

void init() {

NODE_SET_METHOD(exports, "createFunction", CreateFunction);

}

node.js

var fn = addon.createFunction();

console.log(fn.name + ":" + fn ())


  • C++ 객체 생성

1. myobeject.hh, myobject.cc 코드 작성

2. binding.gyp에 myobject.cc 추가

3. $ node-gyp configure

4. $ node-gyp build

5. hello.js에 객체 생성 코드 삽입.






반응형