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

news/2024/4/29 16:46:08/文章来源:https://blog.csdn.net/qq_41648043/article/details/128261909

环境准备

  • 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));

在这里插入图片描述

推荐阅读

  • 从暴力到NAN再到NAPI————Node.js 原生模块开发方式变迁
  • N-API官方文档

最后

关于如何在ts及react项目中引用尚在研究,umi脚手架中如何使用尚在研究(其中大概率会用到node-loader加载解析node文件)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_233624.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无需代理及注册在VsCode中使用ChatGPT

无需代理及注册在VsCode中使用ChatGPT 安装 要安装扩展&#xff0c;请按照下列步骤操作&#xff1a; 1.打开 Visual Studio Code 2.单击左侧栏中的扩展程序图标 3.搜索"ChatGPT中文版" 4.点击安装按钮安装扩展 5.重启VSCode 用法 开始使用 在编辑器中右键触发…

mac m1 安装docker docker 安装php 5.6 和 7.2 避坑指南

注意&#xff1a;这个docker一旦下载用起来&#xff0c;没事不要升级&#xff0c;容易导致APP挂载目录找不到&#xff0c;重装非常浪费时间 通过该link可以下载兼容mac m1核心的docker-desktop: Docker Desktop - Docker 所有基于amd64架构核心的都加上--platform linux/amd6…

IEEE 二进制浮点数的表示

今天&#xff0c;我来将 IEEE 二进制浮点数的表示方式进行一个简单的介绍。 浮点数 在 C 语言中&#xff0c;有两种存储浮点数的方式&#xff0c;分别是 float 和 double &#xff0c;当然了还有long double。这几种浮点型所容纳的长度不同&#xff0c;当然它们存储的精度也就…

springBoot中日志的使用

springBoot中日志的使用 日志基础 首先你需要知道日志门面&#xff0c;日志实现&#xff0c;日志桥接器。 基于日志实现&#xff0c;常用的有logback,log4j2&#xff0c;这两个日志实现是的创始人是同一个&#xff0c;概念差不多&#xff0c;这里以log4j2为例&#xff0c;有如…

经矩形窗截断的信号频谱泄露现象研究-附Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、频谱泄露现象✳️ 二、原因分析以及解决方法✳️ 三、Matlab程序获取与验证✳️ 一、频谱泄露现象 有一个余弦信号&#xff0c;信号频率30Hz&#xff0c;信号为x(t)cos(2π30t)&#xff0c;采样频率fs128Hz&#xff0c;样本长度分别取N128和N100&…

Android 使用 jni Demo示例

Android 使用 jni Demo示例简介1. NDK的介绍1.1 NDK 简介1.2 NDK 特点2. JNI介绍2.1 JNI 简介2.2 为什么要有 JNI&#xff1f;3. NDK 与 JNI 的关系NDK下载及环境配置1. 使用Android studio SDK Manager下载2.配置NDK2.1 配置环境变量2.2 Android studio配置NDK示例Demo流程1.版…

【云原生】devops之jenkins中pipeline语法(2)

前言&#xff1a; pipeline语法分类一般来说&#xff0c;有四种。分别是环境配置、阶段步骤、行为动作、逻辑判断。 二、阶段步骤 &#xff08;1&#xff09;post 根据pipeline块或者stage块&#xff08;阶段&#xff09;完成的状态来进行一个或者多个附加步骤&#xff08;取决…

Gaussian 计算静电云图确定吸附位点

计算背景&#xff1a; 利用高分子有机物等活性材料对有毒分子、原子、离子在真空、水溶液、有机溶液等环境下吸附&#xff0c;已是当今环境科学、矿物学、土壤化学等学科领域研究的热点。但如何确定最佳吸附位点以计算其吸附能就显得尤为重要。 现阶段多数物质的吸附均依据粒…

【通信基础】TTL、RS232、RS485

TTL1、TTL简介RS2321、RS232基本概念2、DB9串口定义及接线参考3、RS232经典电路4、特点RS4851、RS485简介2、特点3、传输距离4、经典电路5、传输差分电平信号TTL 1、TTL简介 TTL的英文全称是Transisor-Transisor Logic. 翻译过来就是晶体管与晶体管之间的逻辑电路。 TTL电平信…

Java搭建宝塔部署实战毕设项目springboot销售培训考评系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目springboot销售培训考评系统源码。 技术架构 技术框架&#xff1a;jQuery MySQL5.7 mybatis shiro Layui HTML CSS JS jpa运行环境&#xff1a;jdk8 IntelliJ…

Python 可迭代对象(Iterable)、迭代器(Iterator)与生成器(generator)之间的相互关系

1、迭代 通过重复执行的代码处理相似的数据集的过程&#xff0c;并且本次迭代的处理数据要依赖上一次的结果继续往下做&#xff0c;上一次产生的结果为下一次产生结果的初始状态&#xff0c;如果中途有任何停顿&#xff0c;都不能算是迭代。 # 非迭代例子 n 0 while n < …

java之注解的定义和使用

初识注解&#xff1a; 注解的概念&#xff1a; 注解是从JDK5.0开始引入的新技术&#xff0c;它不是程序本身&#xff0c;但是和注释有相同的作用&#xff0c;都能够对程序做出一定的解释&#xff0c;并且注解能够被其他编译器所读取 注解的格式&#xff1a; 注解是以“注释…

平均月薪15k+?自动化测试工程师?3个月教你从“点工”蜕变为“码农”

前言 一、自动化测试工程师平均收入【看图&#xff08;来自职友集&#xff09;】 基本收入都在15k左右&#xff0c;随着技术的越来越牛逼工资也就会越来越高。 我的职业生涯开始和大多数测试人一样&#xff0c;刚开始接触都是纯功能界面测试。那时候在一家电商公司做测试&…

[附源码]计算机毕业设计基于人脸识别的社区防疫管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SSRF漏洞详解与利用

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是SSRF漏洞详解与利用。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

迭代器和生成器

文章目录迭代器和生成器图解迭代器和生成器的关系迭代器容器生成器yield函数生成器表达式总结迭代器和生成器 图解迭代器和生成器的关系 图1-1​ 不管是生成器还是我们的容器&#xff0c;最终都是迭代器&#xff0c;使用next方法进行有规律的获取元素&#xff0c;不需要将元素…

五问补盲(二) | 补盲激光雷达,角分辨率真的是越小越好吗?

HiEV消息&#xff08;文&#xff1a;爱LiDAR的小飞哥&#xff09; 如何简单地判断一款补盲激光雷达的成像效果&#xff1f; 业界通常有几个指标&#xff1a;视场角大小、测距范围&#xff0c;以及角分辨率。 一款优秀的补盲激光雷达&#xff0c;通俗来说&#xff1a;既要看得…

rtl8221b+mcu,2.5g光纤收发器的开发备份

1、rtl8221b是一款2.5g的光电转换的phy 系统的构建如下 为了省成本&#xff0c;不用mac来对接其中的gmii接口直接接光模块 2、mdio和mdc由mcu的gpio来模拟&#xff0c;在csdn上有很多的文章来参考 mdio的参数如下 不想看英文可以参考下面的文章 MDIO(clause 22 与 clause 4…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.2 流控模式【关联】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.2 流控模式【关联】31.2.1 流控模式31.2.2 流控模式 - 关联31.2.3 小结31 限流规则…

Python模块fileinput操作文件和目录操作总结

前言 之前介绍Python的 pathlib 模块可以有效的路径及文件查找等方便操作&#xff0c;本篇介绍一个相对 readlines() 获取文件内容更高效的用法 fileinput模块 对一个或者多个文件的内容迭代遍历&#xff08;类似文件操作的readlines()&#xff09;,但是返回的是迭代对象&…