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 keycode总结
Feb 04 Javascript
JQuery 获取和设置Select选项的代码
Feb 07 Javascript
jQuery 选择器理解
Mar 16 Javascript
js 金额文本框实现代码
Feb 14 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
js实现的黑背景灰色二级导航菜单效果代码
Aug 24 Javascript
angular2 ng2 @input和@output理解及示例
Oct 10 Javascript
Vue.set()实现数据动态响应的方法
Feb 07 Javascript
vue基于element的区间选择组件
Sep 07 Javascript
vue通过cookie获取用户登录信息的思路详解
Oct 30 Javascript
toString.call()通用的判断数据类型方法示例
Aug 28 Javascript
swiper实现导航滚动效果
Dec 13 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
PHP中函数内引用全局变量的方法
2008/10/20 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
Golang与python线程详解及简单实例
2017/04/27 Python
python中partial()基础用法说明
2018/12/30 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python文件操作的简单方法总结
2019/11/07 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
小学校本培训方案
2014/06/06 职场文书
激励员工的口号
2014/06/16 职场文书
婚宴父母致辞
2015/07/27 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
Python初学者必备的文件读写指南
2021/06/23 Python