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实际应用:innerHTMl和确认提示的使用
Jun 22 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
jquery append()方法与html()方法的区别及使用介绍
Aug 01 Javascript
js选项卡的制作方法
Jan 23 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 Javascript
vue实现仿淘宝结账页面实例代码
Nov 08 Javascript
浅谈vuejs实现数据驱动视图原理
Feb 23 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 Javascript
vuex中store存储store.commit和store.dispatch的用法
Jul 24 Javascript
React 条件渲染最佳实践小结(7种)
Sep 27 Javascript
解读Vue组件注册方式
May 15 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导入导出excel实例
2013/10/25 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php图像验证码生成代码
2017/06/08 PHP
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
JS数组转字符串实现方法解析
2020/09/04 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
Python中if __name__ == &quot;__main__&quot;详细解释
2014/10/21 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
Python中字符串对齐方法介绍
2015/05/21 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
python爬虫容易学吗
2020/06/02 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
三个Unix的命令面试题
2015/04/12 面试题
教师实习自我鉴定
2013/12/14 职场文书
简历中个人自我评价范文
2013/12/26 职场文书
会务接待方案
2014/02/27 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
五一放假通知怎么写
2015/08/18 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android