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 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
javascript拓展DOM操作 prependChild insertAfert
Nov 17 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 Javascript
Javascript中的delete操作符详细介绍
Jun 06 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
Mar 03 Javascript
javascript实现获取字符串hash值
May 10 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 Javascript
Vue+Node实现的商城用户管理功能示例
Dec 23 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
使用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
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
js 控制图片大小核心讲解
2013/10/09 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
angular-tree-component的使用详解
2018/07/30 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
对python中dict和json的区别详解
2018/12/18 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
Python安装依赖(包)模块方法详解
2020/02/14 Python
python中操作文件的模块的方法总结
2021/02/04 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
大学生简历的个人自我评价
2013/12/04 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
希特勒的演讲稿
2014/05/23 职场文书
质检员岗位职责
2015/02/03 职场文书
html中两种获取标签内的值的方法
2022/06/16 jQuery