[NodeJs] C++ Addon 하는 방법 (설치/속성/메서드/파라미터,리턴/callback/객체생성반환/함수생성/C++객체생성)
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에 객체 생성 코드 삽입.
'JavaScript BackEnd > Node.js, Express' 카테고리의 다른 글
[NodeJs] NodeJs 입력받기 - readline 모듈사용 (0) | 2021.04.30 |
---|---|
[NodeJs] 내장 모듈 사용하기 (os, url, querystring, util) (0) | 2021.04.30 |
[NodeJs] NodeJs 시작하기 (이클립스(Eclipse) 설치 및 개발환경 설정) (2/2) (0) | 2021.04.30 |
[NodeJs] NodeJs 시작하기 (특징/설치) (1/2) (0) | 2021.04.30 |
[NodeJs] NoSQL MongoDB 연동하기 (검색/추가/삭제/갱신) (0) | 2021.04.30 |
[NodeJs] MySQL 연동하기 (SELECT/INSERT/UPDATE/DELETE) (0) | 2021.04.30 |
[NodeJs] Socket.io를 이용해 간단한 채팅(Chatting) 만들기. (0) | 2021.04.30 |
[NodeJs] Socket.io를 WebSocket 구현하기. (0) | 2021.04.30 |