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 相关文章推荐
面向对象的编程思想在javascript中的运用上部
Nov 20 Javascript
JS小框架 fly javascript framework
Nov 26 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
Aug 02 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
jQuery实现自定义下拉列表
Jan 05 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
Javascript基础学习笔记(菜鸟必看篇)
Jul 22 Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
Mar 11 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入门源程序
2006/10/09 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
React Native预设占位placeholder的使用
2017/09/28 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
ktv总经理岗位职责
2014/02/17 职场文书
销售队伍口号
2014/06/11 职场文书
大四毕业生自荐书
2014/07/05 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
对讲机知识
2022/04/07 无线电
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL