Node-addon-api について
node.jsから、CやC++のAPIを直接実行するためには、
N-APIを使用することになるが、非常に複雑で、コーディングが面倒になるので、
C++でN-APIをラップしたnode-addon-apiを使用したほうが良い。
ただ、Javascriptの知識と、C++の知識(メモリ管理等)が必要となりますが、
基本的に細かい制御はクラスライブラリがやってくれるので、
実装に集中できます。
ビルド方法
package.jsonの準備
まずは、package.json を準備する。
bindingsとnode-addon-apiをインストールします。
npm init # 初期設定
npm install bindings node-addon-api
binding.gypファイル
binding.gypファイルを作成して、C++のビルト環境を作成します。
{"targets":[{"target_name":"hello","cflags!":["-fno-exceptions"],"cflags_cc!":["-fno-exceptions"],"sources":["hello.cpp"],"include_dirs":["<!@(node -p \"require('node-addon-api').include\")"],'defines':['NAPI_DISABLE_CPP_EXCEPTIONS'],}]}
hellow.cpp
cpp ファイルを作成します。
#include <napi.h>
Napi::StringMethod(constNapi::CallbackInfo&info){Napi::Envenv=info.Env();returnNapi::String::New(env,"world");}Napi::ObjectInit(Napi::Envenv,Napi::Objectexports){exports.Set(Napi::String::New(env,"hello"),Napi::Function::New(env,Method));returnexports;}NODE_API_MODULE(hello,Init)
C++の説明
NODE_API_MODULE(hello, Init)
javascriptとの接続するためのマクロ
Init 関数内でエクスポートするファンクションを定義する。
exports.SetでhelloというjavascriptのメソッドをMethodというC++関数に割り当てている。
Method関数内で、worldという文字列を返している。
hello.js
varaddon=require('bindings')('hello');console.log(addon.hello());// 'world'
bindingsモジュールをロードして,
helloを呼び出します。
ビルド
npm install
を実行すると、C++のコンパイラが実行され、ビルドされます。
実行
node hello.js
を実行するとworldという文字列が表示されると思います。
終わりに
以下の例は、ほぼ node-addon-apiのサンプルを元にしました。
https://github.com/fore-vision/node-addon-api
上にサンプルとドキュメントがあるので、色々できると思います。