用C++为nodejs 写组件,提高node处理效率
2015-07-08 17:30
721 查看
昨天研究了下如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。首先,先来看看node 是如何和C++交互吧。前提:需要安装nodejs 环境,安装node-gyp 包。采用npm 方式安装,这个太方便了,修改本文件夹下面的package.json 依赖选项,然后执行npm install 就可以了。1.以hello world 为例来说明:1)建立一个文件夹hello,在这个文件夹里依次添加3个文件,hello.cc, binding.gyp,test.js (其中hello.cc 是c++的源程序文件,binding.gyp 是编译模块的配置文件,这个文件被node-gyp程序编译,test.js是nodejs的调用程序。)文件下结构如下:
hello.cc 代码如下:
binding.gyp如下:
test.js 为:
binding.gyp:
test.js:
hello.cc 代码如下:
#include <node.h>#include <v8.h>using namespace v8; Handle<Value> Method(const Arguments& args) { HandleScope scope; return scope.Close(String::New("hello,world")); }void init(Handle<Object> exports) { exports->Set(String::NewSymbol("hello"), FunctionTemplate::New(Method)->GetFunction()); } NODE_MODULE(hello, init)
binding.gyp如下:
{ "targets": [ { "target_name": "hello", "sources": [ "hello.cc" ] } ] }
test.js 为:
var addon = require('./build/Release/hello'); console.log(addon.hello());2) 直接执行 node-gyp configure build 就直接编译了。3) 运行 node test.js 就输出结果。好了,就这么简单。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++的写的程序了。OK,一个简单的node与C++程序就写完了。现在这样node就可以和C++写的程序交互了,直接去调用C++写的程序了。如果觉得node处理不过来,都可以通过C++来处理。2.node 通过callback 回调的方式,调用C++处理后的结果返回给node1)按照上面的方式,首先建立3个文件 callback.cc, binding.gyp,test.jscallback.cc:
#define BUILDING_NODE_EXTENSION #include <node.h>using namespace v8; Handle<Value> RunCallback(const Arguments& args) { HandleScope scope; Local<Function> cb = Local<Function>::Cast(args[0]); const unsigned argc = 1; Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) }; cb->Call(Context::GetCurrent()->Global(), argc, argv); return scope.Close(Undefined()); }void Init(Handle<Object> exports, Handle<Object> module) { module->Set(String::NewSymbol("exports"), FunctionTemplate::New(RunCallback)->GetFunction()); } NODE_MODULE(callback, Init)
binding.gyp:
{ "targets": [ { "target_name": "callback", "sources": [ "callback.cc" ] } ] }
test.js:
var addon = require('./build/Release/callback'); addon(function(msg){ console.log(msg); // 'hello world'});2)编译,在终端输入:node-gyp configure build ,会在当前目录下生成一个build 的新文件下3)测试,node test.js 输出 //hello world注意:如果有多个.cc 的文件,一定要将他们都包含在binding.gyp中,不然编译是通过了,但是node调用会报错。测试代码地址:https://github.com/yupeng528/node-addon-test
相关文章推荐
- SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException
- Node.js的DES加解密和MD5加密
- 【nodejs】json value出现 undefined 将会无法解析 问题来了
- nodejs npm常用命令
- Node.js入门
- Node.js入门
- [leedcode 24] Swap Nodes in Pairs
- Remove Nth Node From End of List
- nodejs
- Count Complete Tree Nodes
- (转)heX——基于 HTML5 和 Node.JS 开发桌面应用
- (转)在Windows平台上安装Node.js及NPM模块管理
- 公司项目NODEJS实践0.3[ mongo / session ...]
- LeetCode Valid Parentheses Remove Nth Node From End of List
- [LeetCode] Remove Nth Node From End of List
- RCP: JDT 根据org.eclipse.jdt.core.IJavaElement对象获取org.eclipse.jdt.core.dom.ASTNode对象
- nodejs 客户端证书设置。
- leetcode #222 Count Complete Tree Nodes
- SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: xxx
- Eclipse安装nodeclipse插件