C/C++實現nodejs擴展接口 node-addon-api


軟件准備

實例

新建一個文件夾

  1. 新建package.json
{
  "name": "test-cpp-module",
  "version": "0.1.0",
  "private": true,
  "gypfile": true,
  "dependencies": {
    "node-addon-api": "^2.0.0"
  }
}
  1. 新建binding.gyp
{
  "targets": [
    {
      "target_name": "democpp",
      "sources": [
        "democpp.cc"
      ],
      "include_dirs": [
        "<!@(node -p \"require('node-addon-api').include\")"
      ],
      "libraries": [ 
        
      ],
      "dependencies": [
        "<!(node -p \"require('node-addon-api').gyp\")"
      ],
      "cflags!": ["-fno-exceptions"],
      "cflags_cc!": ["-fno-exceptions"],
      "defines": ["NAPI_CPP_EXCEPTIONS"],
      "xcode_settings": {
        "GCC_ENABLE_CPP_EXCEPTIONS": "YES"
      }
    }
  ]
}

文件中首先使用target_name指定了編譯之后模塊的名稱。

sources指明c++的源文件,如果有多個文件,需要用逗號隔開,放到同一個數組中。

include_dirs是編譯時使用的頭文件引入路徑,這里使用node -p執行node-addon-api模塊中的預置變量。

dependencies是必須的,不要改變。

后面部分,cflags!/cflags_cc!/defines三行指定如果c++程序碰到意外錯誤的時候,由NAPI接口來處理,而不是通常的由c++程序自己處理。這防止因為c++部分程序碰到意外直接就退出了程序,而是由nodejs程序來捕獲處理。如果是在Linux中編譯使用,有這三行就夠了。

但如果是在macOS上編譯使用,則還要需要最后一項xcode-settings設置,意思相同,就是關閉macOS編譯器的意外處理功能。

  1. democpp.cc
#include <napi.h>

using namespace Napi;

String Hello(const CallbackInfo& info) {
	return String::New(info.Env(), "world");
}

Napi::Object  Init(Env env, Object exports) {
	exports.Set("hello", Function::New(env, Hello));
	return exports;
}
NODE_API_MODULE(addon, Init)

程序中引入napi.h頭文件,使用Napi的namespace還有最后的NODE_API_MODULE(addon,Init)都是模板化的,照抄過來不用動。
Init函數中,使用exports.Set()引出要暴露給nodejs調用的函數。如果有多個需要引出的函數,就寫多行。
Hello函數是我們主要完成工作的部分,本例中很簡單,只是用字符串的方式返回一個“world”。

democpp.cc/binding.gyp/package.json三個文件都創建好,在當前文件夾開啟命令行,保持網絡暢通,運行npm install,順利編譯,此時在得到輸出文件.\build\Release\democpp.node,下一步,在node中調用hello()

E:\WorkSpace\Code\node-addon-cplus>node
Welcome to Node.js v12.16.1.
Type ".help" for more information.
> testapp=require('./build/Release/democpp.node')
{ hello: [Function] }
> testapp.hello()
'world'
>

提供上述實例源文件鏈接

注意事項

  • 使用nodejs12、python3和Visual Studio 15可以編譯上述接口,但是生成出來democpp.node的文件大小有500+KB,作為一個接口模塊而言有些體積損耗。如果使用nodejs10.xx環境,僅僅安裝npm install -g windows-build-tools(其中windows-build-tools會自動安裝python2.7以及vs2017編譯工具),使用npm install進行編譯,可以大大減少democpp.node的文件大小。

  • 編譯時nodejs的32位(64位)決定了democpp.node32位(64位)

參考文章

[1] 簡單上手nodejs調用c++(c++和js的混合編程)

[2] node-addon-examples


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM