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文件能成功生成但是无法使用,可能是缺少动态库文件,需要找到缺少的去进行安装