node.js调用C++函数的方法示例


Posted in Javascript onSeptember 21, 2018

目前nodejs调用c++主流的有两种方法,分别是addons和ffi

addons是nodejs官方的c++扩展实现方案,但是由于需要使用模版,并且要对v8引擎有一定的了解,入门门槛较高。

ffi是nodejs直接调用so库的一种实现,可以调用纯c的接口。

要想node.js调用C++的函数等,须先将C++代码编译成二进制的.node文件。node.js官方文档https://nodejs.org/dist/latest-v8.x/docs/api/addons.html中的C++ addons介绍了如何将C++的代码编译为二进制的.node文件。

一、步骤:

1.首先在项目目录进行npm install -g node-gyp下载node-gyp模块,配置环境参考https://github.com/nodejs/node-gyp

2.这是node官方文档中的例子

// addon.cc
#include <node.h>
namespace demo {
using v8::Exception;
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Value;// This is the implementation of the "add" method// Input arguments are passed using the// const FunctionCallbackInfo<Value>& args struct
void Add(const FunctionCallbackInfo<Value>& args) {
 Isolate* isolate = args.GetIsolate();
 // Check the number of arguments passed.
 if (args.Length() < 2) {
 // Throw an Error that is passed back to JavaScript
 isolate->ThrowException(Exception::TypeError(
  String::NewFromUtf8(isolate, "Wrong number of arguments")));
 return;
 }
 // Check the argument types
 if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
 isolate->ThrowException(Exception::TypeError(
  String::NewFromUtf8(isolate, "Wrong arguments")));
 return;
 }
 // Perform the operation
 double value = args[0]->NumberValue() + args[1]->NumberValue();
 Local<Number> num = Number::New(isolate, value);
 // Set the return value (using the passed in
 // FunctionCallbackInfo<Value>&)
 args.GetReturnValue().Set(num);}
void Init(Local<Object> exports) {
 NODE_SET_METHOD(exports, "add", Add);}NODE_MODULE(NODE_GYP_MODULE_NAME, Init)
} // namespace demo

3.然后在项目目录下使用类似JSON的格式创建在项目顶层调用的文件binding.gyp文件,内容为

{
 "targets": [
 {
  "target_name": "addon",
  "sources": [ "addon.cc" ]
 }
 ]
}

4.在终端输入node-gyp configure命令生成一个build文件夹,然后输入node-gyp build命令生成编译addon.node文件

5.在node文件比如test.js文件中const addon=require(‘./build/Release/addon')调用生成的模块

// test.js
const addon = require('./build/Release/addon');
console.log('This should be eight:', addon.add(3, 5));//结果为8

二、实例

最近公司让我研究node调用C++,C++的代码是调用了GDAL库开发的功能。要在tile.cc文件中调用头文件

node.js调用C++函数的方法示例

这里#include调用的gdal_priv.h和ogrsf_frmts.h头文件在gdal/include文件夹中,所以要在binding.gyp文件中source后面添加

"include_dirs": [
  "./gdal/include"
  ],

然后如果现在就运行node-gyp configure build命令会报“无法解析的外部符号”的错误,这是因为还需要加入调用的链接库,需要在binding.gyp文件中加入

'libraries': [
   "../gdal/lib/gdal_i.lib",
  ],

这时的binding.gyp文件为

{
 "targets": [
 {
  "target_name": "addon",
  "sources": [
  "./C++_02/tile.cc"
  ],
  "include_dirs": [
  "./gdal/include"
  ],
  'libraries': [
   "../gdal/lib/gdal_i.lib",
  ],
 }
 ]
}

这时再进行node-gyp configure build命令就不会报错生成addon.node文件,但是当我运行test.js文件

const addon=require(‘./build/Release/addon')
var imagefile = "/vsicurl/http://sasmac.oss-cn-beijing.aliyuncs.com/cog.tif";
var x = 160;
var y = 83;
var l = 9;
console.log(addon.tileload(imagefile, x, y, l));

会报错'找不到指定的模块',但是我们在build/Release文件中能找到addon.node文件,这是因为缺少依赖也就是缺少.dll。下载 Dependency Walker,这个软件可以帮你确定一下缺少什么.dll,下载地址:http://www.dependencywalker.com/。我将addon.node文件添加到Dependency Walker发现缺少gdal/bin中的.dll。我将gdal/bin中的.dll文件复制到addon.node目录下,这时运行test.js文件就可以正常使用了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
避免 showModalDialog 弹出新窗体的原因分析
May 31 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
Apr 15 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
AngularJS 中的Promise --- $q服务详解
Sep 14 Javascript
jQuery中Nicescroll滚动条插件的用法
Nov 10 Javascript
详解AngularJS 模块化
Jun 14 Javascript
Vue-Access-Control 前端用户权限控制解决方案
Dec 01 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
Vue中父子组件的值传递与方法传递
Sep 28 Javascript
原生js实现自定义滚动条组件
Jan 20 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 #Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 #Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 #Javascript
vue中设置、获取、删除cookie的方法
Sep 21 #Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
Sep 21 #Javascript
vue富文本编辑器组件vue-quill-edit使用教程
Sep 21 #Javascript
React实现全局组件的Toast轻提示效果
Sep 21 #Javascript
You might like
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
javascript回调函数详解
2018/02/06 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python while循环使用else语句代码实例
2020/02/07 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
财务管理专业推荐信
2013/11/19 职场文书
财务会计自荐信范文
2014/02/21 职场文书
音乐教育感言
2014/03/05 职场文书
优秀党员申报材料
2014/12/18 职场文书
学校重阳节活动总结
2015/03/24 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
MySQL中order by的使用详情
2021/11/17 MySQL
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS