LoginSignup
0
3

More than 3 years have passed since last update.

node-addon-apiについて

Last updated at Posted at 2020-05-29

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 
上にサンプルとドキュメントがあるので、色々できると思います。

0
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3