• Native Abstractions for Node.js (nan)
  • nan方式的好处:使用nan方式,编写的c++插件接口,会自动兼容不同版本的nodejs
  • 因此,你的代码只需要随着 nan版本升级出现的改变而改变,至于Nodejs,nan会帮你兼容(前提是nan支持该版本的nodejs)

1、先安装node.js和python

2、新建一个demo项目: 创建demo目录,并进入其中,然后运行下面命令。

mkdir demo
cd  demo
npm init

运行npm init时,之后会生成一个package.json(具体内容与输入参数有关):

{"name": "demo","version": "1.0.0","description": "a demo for node call native functions","main": "demo.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": ["node"],"author": "Li XianJing","license": "ISC"
}

3、在项目路径下

npm install -g node-gyp (全局安装)
npm install nan    这个也可以用  npm install nan bindings --save 解释
node-gyp是C++扩展的编译工具;
nan和bindings包含了C++扩展需要的头文件;

4、用C++编写原生代码( 为了让目录结构整洁一点,我们把代码放到native只目录下)。

下面的文件(native/demo.cc),添加一个Add方法,计算两个数之和:

#include <nan.h>void Add(const Nan::FunctionCallbackInfo<v8::Value>& info) {if (info.Length() < 2) {Nan::ThrowTypeError("Wrong number of arguments");return;}if (!info[0]->IsNumber() || !info[1]->IsNumber()) {Nan::ThrowTypeError("Wrong arguments");return;}double arg0 = info[0]->NumberValue();double arg1 = info[1]->NumberValue();v8::Local<v8::Number> num = Nan::New(arg0 + arg1);info.GetReturnValue().Set(num);
}void Init(v8::Local<v8::Object> exports) {exports->Set(Nan::New("add").ToLocalChecked(),Nan::New<v8::FunctionTemplate>(Add)->GetFunction());
}NODE_MODULE(demo, Init)

5、写一个node-gyp的配置文件(文件名固定为binding.gyp),用来编译C++代码。

{"targets": [{"target_name": "demo","sources": [ "native/demo.cc" ],"include_dirs": ["<!(node -e \"require('nan')\")"]}]
}

6、编写一个JS文件(demo.js)),让它调用原生代码。

var demo = require('bindings')('demo.node')console.log('add(3, 5) => ', demo.add(3, 5))

7、运行配置脚本(如果没有增删文件,不需要每次运行)

node-gyp configure

8、编译C++程序。

node-gyp build
注意:有修改的时候最好用:node-gyp rebuild

9、运行JS代码,看看是否工作。

node demo.js

其他参考:

addon其实就是一个桥梁,利用V8提供的API,可以实现JavaScript和C++的互相调用,打通JavaScript和C++之间的接口。我们先编写一个小例子,大概了解js层和addon之间数据交换的过程。需要三个文件:binding.gyp:其实就是一个json文件,因为要使用node-gyp进行编译,该文件可以说是定义了一些编译规则。
addon.cc: 该文件就是我们需要编写的addon,node-gyp借助vs编译后最终会生成
addon.node二进制文件。
index.js: 该文件就是测试js,在js层可以加载addon,调用addon对外的函数。
void Foo(const v8::FunctionCallbackInfo<v8::Value> &args)
{// from v8 to cppv8::Isolate* isolate = args.GetIsolate();v8::String::Utf8Value str(isolate, args[0]);std::string cppStr(*str);// back to v8v8::Local<v8::String> v8String = v8::String::NewFromUtf8(isolate, cppStr.c_str(), v8::String::kNormalString);
}
1. npm 安装windows-build-toolscmd管理员模式打开,执行下面命令:npm install --global --production windows-build-tools等待执行完成,重启CMD2. windows下安装node-gypnode-gyp就是为node编译c++扩展的时候使用的编译工具。安装方法:npm install -g node-gyp3. 配置依赖npm config set python python2.7npm config set msvs_version 2015如果不出意外的话我们就可以用node-gyp进行构建了。如果出现问题可以参考node-gyp的github主页。
#include <nan.h>NAN_METHOD(multi)
{int result = 1;for (int i = 0; i < info.Length(); i++){result *= info[i]->NumberValue();}info.GetReturnValue().Set(Nan::New(result));
}NAN_METHOD(add)
{int result = 0;for (int i = 0; i < info.Length(); i++){result += info[i]->NumberValue();}info.GetReturnValue().Set(Nan::New(result));
}void init(v8::Local<v8::Object> exports)
{Nan::SetMethod(exports, "multi", multi);Nan::SetMethod(exports, "add", add);
}NODE_MODULE(demo, init); // demo-导出模块的名称

NodeJs C++ addon(插件nan方式)相关推荐

  1. nodejs c++ addon插件的应用场景

    高精度计算,如浮点数 多线程并行计算 直接操作硬件 在Nodejs里调用已有的C++的包,而Nodejs自身没有对应的包或者效率不如C++,如视频格式转换. 在多语言开发的项目中,需要用开发可被多种语 ...

  2. electron集成arm64架构的nodejs addon插件

    随着macos M1芯片的发布,当前的electron PC应用要适配arm64架构(虽然低版本electron应用也可以在arm64架构上面运行(转译)但是这严重影响电脑性能). 环境搭建 mac上 ...

  3. 安装您的Sbo Add-on插件

    Sbo Add-on插件开发完成了,就需要注册到Sbo主程序中,从而实现随着Sbo主程序启动而启动,退出而退出,达到Add-on插件程序同Sbo主程序之间的一致运行. 1.运行AddOnRegData ...

  4. CDR插件开发之Addon插件007 - Addon插件简介和案例演示

    本文讲解了Addon插件的概念和安装位置,介绍了Addon插件的组成结构,演示了如何通过手动拷贝的方式来安装一个Addon类型的CDR插件(力先插件). 如果你更喜欢观看视频教程,请点击下方链接查看视 ...

  5. Android Studio 三种添加插件的方式,androidstudio

    前几篇blog我们介绍了如何安装和配置Android Studio,这篇Blog我们来聊聊如何给Android Studio添加插件,添加插件的路径有三种,我把他们分类如下: 点击设置小按钮 点击[P ...

  6. CDR插件开发之Addon插件008 - 在VS中下载安装Addons插件模板并基于模板创建Addon插件工程

    本文介绍了Addons插件模板的由来,演示如何在VS 2022中安装Addon插件模板(扩展),并基于Addons模板创建CDR插件工程,演示了在CDR 2020中加载和运行自己创建的Addon插件. ...

  7. 关于Gradle新版插件依赖方式

    文章目录 一.前言 二.旧版依赖方式 三.新版的依赖方式 四.修改原因 五.为什么改成这种方式 六.其它插件地址 七.参考链接 一.前言 gradle在7.0后,具体不清楚哪一版,把依赖方式进行了修改 ...

  8. vite(vue-ts)项目vite-plugin-pages,vite-plugin-vue-layouts,vite-plugin-windicss等插件引入方式

    vite项目(vue-ts)搭建常用插件引入方式 vite-plugin-pages vite-plugin-vue-layouts vite-plugin-windicss unplugin-vue ...

  9. nodejs使用addon调用c/c++

    简介 本编文章编写与2019年3月,一直在个人笔记中未发布,以下部分技术可能已过时,可参考思路和步骤.本文详细介绍了nodejs依赖node-gyp使用c/c++的使用步骤. 查看详情 文档 安装和配 ...

最新文章

  1. Android分包方案multidex
  2. 让ModalPopupExtender的控制控件能响应服务器事件
  3. 2020春招机考汇总1(Python):农场养鸡、连续子序列最大值的期望
  4. char 转wchar_t 及wchar_t转char
  5. trufflesuite/truffle-hdwallet-provider
  6. autograd手动仿真手记
  7. 计算机网络-自顶向下方法(7th) 第五章 Problems 英文题目1-15+中文答案
  8. 数据分析和数据挖掘有什么区别
  9. 今天解决了价位没有同步更新的问题
  10. Ubuntu:conda的安装与使用
  11. vue2.x 父组件监听子组件事件并传回信息
  12. python网络安全面试题_网络安全经典面试题(二)
  13. 【Day4.5】走人行天桥去百丽宫海生馆
  14. linux硬盘分区的几种方式,硬盘分区的三种方式
  15. 我把3个镜头手机拍的照片发微信群,哥们说,现在手机摄像头越来越多,我有一个扫码就够了...
  16. 51单片机检测温湿度并且上传到阿里云
  17. 面向大数据的分布式调度
  18. python 获取一年中所有工作日列表来辅助计算工作时间内的时间差
  19. java单例模式几种常见实现方式
  20. mybatis源码学习------Invoker接口及其子类

热门文章

  1. JAVA虚拟机、Dalvik虚拟机和ART虚拟机
  2. 小菜鸟学浏览器之感悟
  3. 产品设计:产品设计中模块化设计的再认识与思考
  4. Adobe Reader Acrobat Pro XI在连网下打开几秒后,卡顿并自动退出问题解决措施
  5. Arduino 高级教程 01:基础篇
  6. leetcode146. LRU Cache
  7. Android仿制知乎滑动广告条
  8. PTA 7-59 二元一次方程的解
  9. 圣邦微电子2023校招笔试
  10. 一网统管网格化解决方案 PPT