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

2021. 4. 30. 02:04 JavaScript BackEnd/Node.js, Express

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);
}

 

  • 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에 객체 생성 코드 삽입.

 

출처 : ourcstory.tistory.com/31?category=664896