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' ],
}
]
}
hello.cpp
cpp ファイルを作成します。
#include <napi.h>
Napi::String Method(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
return Napi::String::New(env, "world");
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "hello"),
Napi::Function::New(env, Method));
return exports;
}
NODE_API_MODULE(hello, Init)
C++の説明
NODE_API_MODULE(hello, Init)
javascriptとの接続するためのマクロ
Init 関数内でエクスポートするファンクションを定義する。
exports.SetでhelloというjavascriptのメソッドをMethodというC++関数に割り当てている。
Method関数内で、worldという文字列を返している。
hello.js
var addon = 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
上にサンプルとドキュメントがあるので、色々できると思います。