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 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
jQuery 插件 将this下的div轮番显示
Apr 09 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
JQuery复制DOM节点的方法
Jun 11 Javascript
Bootstrap自定义文件上传下载样式
May 26 Javascript
使用javascript函数编写简单银行取钱存钱流程
May 26 Javascript
socket在egg中的使用实例代码详解
May 30 Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 Javascript
vue页面更新patch的实现示例
Mar 25 Javascript
基于PHP pthreads实现多线程代码实例
Jun 24 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
vue使用echarts图表自适应的几种解决方案
Dec 04 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
咖啡知识大全
2021/03/03 新手入门
php empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
python实现ipsec开权限实例
2014/11/11 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
用 Python 制作地球仪的方法
2020/04/24 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
公司股东出资证明书
2014/11/01 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python