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 相关文章推荐
javascript之锁定表格栏位
Jun 29 Javascript
JavaScript 原型学习总结
Oct 29 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
jQuery 滑动方法slideDown向下滑动元素
Jan 16 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
Oct 16 Javascript
JS+CSS简单树形菜单实现方法
Sep 12 Javascript
AngularJS内建服务$location及其功能详解
Jul 01 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
Nov 22 Javascript
jQuery-ui插件sortable实现自由拖动排序
Dec 01 jQuery
JS精确判断数据类型代码实例
Dec 18 Javascript
使用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
PHP4实际应用经验篇(4)
2006/10/09 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
毕业生求职信的经典写法
2014/01/31 职场文书
高三学生评语大全
2014/04/25 职场文书
球队口号
2014/06/18 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
高考学习决心书
2015/02/04 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL