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 相关文章推荐
列表内容的选择
Jun 30 Javascript
利用JS自动打开页面上链接的实现代码
Sep 25 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
Jul 17 Javascript
js中的replace方法使用介绍
Oct 28 Javascript
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
js+CSS实现弹出居中背景半透明div层的方法
Feb 26 Javascript
javascript实现图片轮播效果
Jan 20 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
May 14 Javascript
基于vue中对鼠标划过事件的处理方式详解
Aug 22 Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 Javascript
js实现九宫格布局效果
May 28 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
php下获取http状态的实现代码
2014/05/09 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
33道php常见面试题及答案
2015/07/06 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
javascript数组详解
2014/10/22 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
js运动事件函数详解
2016/10/21 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
经理秘书岗位职责
2013/11/14 职场文书
三八节主持词
2014/03/17 职场文书
Python可视化神器pyecharts绘制水球图
2022/07/07 Python