• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

windows下node.js通过N-API调用c++函数

武飞扬头像
夕阳与影
帮助1

环境准备

  • vscode安装(以下均在vscode中操作)
  • node.js安装,版本不要太老
  • c 工具链安装,安装Visual Studio2019社区版即可,或者执行 npm install --global windows-build-tools(这个我没试过,windows喜欢用vs2019)
  • 安装编译构建工具 npm install -g node-gyp

项目初始化

  1. 新建文件夹 c2js ,命令行进入所在文件夹,执行pnpm init或者npm init初始化
  2. 安装依赖pnpm add node-addon-apinpm install node-addon-api
  3. 按下ctrl shift P,搜索c ,添加c_cpp_properties.json文件
    学新通
  4. 创建文件binding.gyp,文件内容如下:
{
  "targets": [
    {
      "target_name": "napi_sample",
      "sources": [ "src/main.cpp"],
      "cflags!": [ "-fno-exceptions" ],
      "cflags_cc!": [ "-fno-exceptions" ],
      "defines": [ "NAPI_DISABLE_CPP_EXCEPTIONS" ],
      "include_dirs": [
        "<!@(node -p \"require('node-addon-api').include\")"
      ],
    }
  ]
}
  1. 命令行执行node-gyp configure,没有binding.gyp文件会失败;执行之后将Dnode_root_dir(下图红色框)添加到c_cpp_properties.json的includePath中。
    学新通

至此,准备工作完成。
以下是我的开发环境版本信息,index.js中只有一行代码console.log(process.versions)

学新通

示例实战

  1. 新建文件夹 src ,并在src文件夹下新建文件main.cpp,binding.gyp中的source即c 源文件
#include<napi.h>

int plus(int a, int b){
    return a   b;
}
// 调用函数(我把c  函数独立出来了,个人风格)
Napi::Value add(const Napi::CallbackInfo& info){
    Napi::Env env = info.Env();
    Napi::EscapableHandleScope scope(env);
    if (info.Length() < 2)
        return Napi::Boolean::New(env, false);
    int res = plus(info[0].As<Napi::Number>().Int64Value(), info[1].As<Napi::Number>().Int64Value());
    return Napi::Number::New(env, res);
}

// 导出此函数
Napi::Object Init(Napi::Env env, Napi::Object exports)
{
    // 第一个参数定义了导出的函数名
    exports.Set(Napi::String::New(env, "add"), Napi::Function::New(env, add));
    return exports;
}
// 第一个参数即为导出的模块名,与binding中的target_name对应
NODE_API_MODULE(napi_sample, Init);

学新通

在引入napi.h的时候可能会飘红,鼠标移到红色线,点击quick fix选择第一个增加includePath即可。
我的c_cpp_properties.json文件如下:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\Users\\11441\\AppData\\Local\\node-gyp\\Cache\\16.17.1",
                "C:/Users/11441/AppData/Local/node-gyp/Cache/16.17.1/include/node"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.19041.0",
            "compilerPath": "D:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe",
            "cStandard": "c17",
            "cppStandard": "c  17",
            "intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}
学新通
  1. 命令行执行node-gyp rebuild进行构建,不报错即大功告成,如下图所示。
    学新通
  2. 新建index.js文件,在命令行执行node index.js
// index.js
const {add} = require('./build/Release/napi_sample.node');

console.log(add(1, 2));

学新通

推荐阅读

最后

在webpack打包的项目中,直接使用require是无法正确引用node文件的。经过多次尝试,最终在bindings包中找到了答案

// https://github.com/webpack/webpack/issues/4175#issuecomment-342931035
  var requireFunc =
    typeof __webpack_require__ === 'function'
      ? __non_webpack_require__
      : require;

是的,就是使用如上所示的代码引入require函数。在umi项目中,我是将node文件放在public文件夹下。在electrone打包应用程序的时候,会把public文件夹下的内容也打包进去,但路径会变

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggaeeb
系列文章
更多 icon
同类精品
更多 icon
继续加载