node使用node-addon-api解析cpp

446 阅读1分钟

1.安装node-gyp和node-addon-api

npm install node-gyp node-addon-api

2.配置cpp

binding.gyp
{
  "targets": [
    {
      "target_name": "addon",
      "sources": [
             "cpp/addon.cpp",
             "cpp/parse_spo2_stage/stages.cpp",
             "cpp/data_parse_c/pars_EHR.c",
      ],
     "include_dirs": [
      "<!@(node -p \"require('node-addon-api').include\")",
      "cpp/",
      "cpp/parse_spo2_stage/SPP3",
      "cpp/parse_spo2_stage",
      "cpp/data_parse_c/",
      ],
      "conditions": [
          [ "OS=='linux'", {
              "libraries": ["-lfftw3f"], //可自定义添加需要的库文件
              "cflags+": [ "-std=c++14", "-fexceptions" ],
              "cflags_c+": [ "-std=c++14", "-fexceptions" ],
              "cflags_cc+": [ "-std=c++14", "-fexceptions" ],
          }],
          [ "OS=='freebsd'", {              "cflags+": [ "-std=c++14", "-fexceptions" ],
              "cflags_c+": [ "-std=c++14", "-fexceptions" ],
              "cflags_cc+": [ "-std=c++14", "-fexceptions" ],
          }],
          [ "OS=='mac'", {              "cflags+": [ "-stdlib=libc++" ],
              "libraries": ["-L/opt/homebrew/Cellar/fftw/3.3.10_1/lib","-lfftw3f"],
              "xcode_settings": {
                  "OTHER_CPLUSPLUSFLAGS" : [ "-std=c++14", "-stdlib=libc++", "-pthread" ],
                  "OTHER_LDFLAGS": [ "-stdlib=libc++" ],
                  "GCC_ENABLE_CPP_EXCEPTIONS": "YES",
                  "MACOSX_DEPLOYMENT_TARGET": "10.7",
                  "CLANG_CXX_LANGUAGE_STANDARD":"c++14",
                  "CLANG_CXX_LIBRARY": "libc++"
              },
          }],
          [          "OS=='win'", {            "cflags": [              "-Wall"            ],
            "defines": [
              "WIN"
            ],
            "msvs_settings": {
              "VCCLCompilerTool": {
                "ExceptionHandling": "2",
                "DisableSpecificWarnings": [
                  "4244"
                ],
              },
              "VCLinkerTool": {
                "LinkTimeCodeGeneration": 1,
                "OptimizeReferences": 2,
                "EnableCOMDATFolding": 2,
                "LinkIncremental": 1,
              }
            }
          }]
      ]
    }
  ]
}

3.编写npai和解析cpp

#include <napi.h>
#include <stages.h>
#include <xx.h> ##需要解析的cpp文件的头文件
Napi::Object xxx(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();
    Napi::Buffer<char> buffer = info[0].As<Napi::Buffer<char>>();
    size_t bufferLength = buffer.Length();
    接收传递的buffer文件
    构造空间
    // zg29daily_analysis_t cpp的接口
    zg29daily_analysis_t* res =(zg29daily_analysis_t*)malloc(sizeof(zg29daily_analysis_t));
    parse(buffer.Data(), bufferLength, res); 
    //调用其他你需要使用的cpp里的函数
    构造一个object来接受cpp吐出来的数据 
    Napi::Object obj = Napi::Object::New(env);
    obj.Set("a", Napi::Number::New(env, res->a));
    obj.Set("b", Napi::Number::New(env, res->b));
    //如果吐出来的还是使用了其他的接口可以使用c.d去获取
    obj.Set("lightsleepMinutes", Napi::Number::New(env, res->c.d));
    Napi::TypedArrayOf<unsigned char> pArray = Napi::TypedArrayOf<unsigned char>::New(
         env,
         res->arrlength
    );
    for (int i = 0; i < res->arrlength; ++i) {
         pArray[i] = res->arr[i];
    }
    obj.Set("pArray", pArray);
    //释放空间
    free(res);
    return obj;
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
  exports.Set("parse", Napi::Function::New(env, xxx));
  return exports;
}

NODE_API_MODULE(addon, Init)

4.转成node文件

node-gyp configure
node-gyp build

5.使用node文件

const addon = require('./build/Release/addon')
const fs = require('fs');
const filePath = './xxx';
fs.readFile(filePath, (err, data) => {
    if (err) {
        console.error('Error reading file:', err);
        return;
    }
    const parse = addon.parse(data);
    console.log(parse)

});

6.其他

1.安装node-gyp报错,可自行百度解决 2.如果node文件能成功生成但是无法使用,可能是缺少动态库文件,需要找到缺少的去进行安装