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的开源工具PACKER2.0.2
Nov 04 Javascript
JavaScript asp.net 获取当前超链接中的文本
Apr 14 Javascript
JavaScript 无符号右移赋值操作
Apr 17 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
JavaScript数据类型学习笔记
Jan 25 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
各种选择框jQuery的选中方法(实例讲解)
Jun 27 jQuery
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
Nov 25 Javascript
React Native 混合开发多入口加载方式详解
Sep 23 Javascript
微信小程序实现电子签名并导出图片
May 27 Javascript
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
市场营销专业推荐信
2013/11/03 职场文书
自我评价的范文
2014/02/02 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
村党支部书记承诺书
2014/05/29 职场文书
医学检验专业自荐信
2014/09/18 职场文书
2015年电工工作总结
2015/04/10 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python
Python序列化模块JSON与Pickle
2022/06/05 Python