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 相关文章推荐
Prototype Object对象 学习
Jul 12 Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 Javascript
基于jQuery实现的文字按钮表单特效整理
Dec 07 Javascript
JavaScript中的对象序列化介绍
Dec 30 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
js实现图片无缝滚动特效
Mar 19 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 Javascript
JS使用正则表达式验证身份证号码
Jun 23 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
JS与SQL方式随机生成高强度密码示例
Dec 29 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
May 07 Javascript
在vue中使用Base64转码的案例
Aug 07 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
详解python调用cmd命令三种方法
2019/07/08 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
大学生应聘自荐信
2013/10/11 职场文书
入职担保书怎么写
2014/05/12 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
发票退票证明
2015/06/24 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers