node.js调用C++开发的模块实例


Posted in Javascript onJuly 03, 2015

如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。先回顾一下正统的用 C++ 开发 native 模块的方法

#include <node.h> 
#include <v8.h> 
using namespace v8; 
 
// 这里是 hello 函数的 C++ 实现部分 
Handle<Value> Method(const Arguments& args) { 
 HandleScope scope; 
 return scope.Close(String::New("world")); 
} 
 
// 这里是模块的初始化函数,必须有 
void init(Handle<Object> exports) { 
 exports->Set(String::NewSymbol("hello"), 
   FunctionTemplate::New(Method)->GetFunction()); 
} 
 
// 这里定义本模块的名字和初始化函数 
NODE_MODULE(hello, init)

这个模块用Node 写的话,是这样的:

exports.hello = function() { 
 return 'world'; 
};


为了编译 C++ 这个模块,还需要一个 JSON 格式的 binding.gyp 文件,来定义编译的细节。 
{ 
 "targets": [ 
  { 
   "target_name": "hello", 
   "sources": [ "hello.cpp" ] 
  } 
 ] 
}

执行 node-gyp configure build  就直接编译了。

node test.js: 
var addon = require('./build/Release/hello'); 

console.log(addon.hello());

 就输出结果。

如此node就可以直接调用C++编写的程序。

对上面程序的解释:在hello.cc 中,我们首先创建了一个函数Method, 此函数返回一个"hello,world"的字符串,后面我们又创建了一个init的函数,作为一个初始化函数,我们去调用了一个函数

最后面,我们将这个模块绑定为:NODE_MODULE(hello, init)

在官网中指出,所有的node的插件必须输出一个初始化的函数,也就是说如下代码是在每个模块都必须有的,固定格式。

void Initialize (Handle<Object> exports); 
NODE_MODULE(module_name, Initialize)

其中 module_name 必须对应上binding.gyp中的 target_name 就可以了。

经过了node-gyp configure build 编译以后会在当前文件下生成一个build 的新的文件夹。我们通过在test.js中去引用这个build的结果,就可以调用C++的写的程序了。

Javascript 相关文章推荐
js getBoundingClientRect() 来获取页面元素的位置
Nov 25 Javascript
jquery json 实例代码
Dec 02 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
详解jQuery事件
Jan 13 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
Oct 08 Javascript
springmvc接收jquery提交的数组数据代码分享
Oct 28 jQuery
基于angular6.0实现的一个组件懒加载功能示例
Apr 12 Javascript
了解重排与重绘
May 29 Javascript
详解vue高级特性
Jun 09 Javascript
原生js+canvas实现下雪效果
Aug 02 Javascript
全面解析Vue中的$nextTick
Dec 24 Vue.js
使用jspdf生成pdf报表
Jul 03 #Javascript
JSON相关知识汇总
Jul 03 #Javascript
javascript表格的渲染组件
Jul 03 #Javascript
解决jquery实现的radio重新选中的问题
Jul 03 #Javascript
移动端JQ插件hammer使用详解
Jul 03 #Javascript
jQuery+AJAX实现无刷新下拉加载更多
Jul 03 #Javascript
Javascript实现字数统计
Jul 03 #Javascript
You might like
也谈截取首页新闻 - 范例
2006/10/09 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
php给数组赋值的实例方法
2019/09/26 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
django的登录注册系统的示例代码
2018/05/14 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
python3排序的实例方法
2020/10/20 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
大学生怎样写好自荐信
2014/02/25 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript