昨天研究了下如何用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 代码如下:

#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++处理后的结果返回给node

1)按照上面的方式,首先建立3个文件 callback.cc, binding.gyp,test.js

callback.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

最新文章

  1. cin的使用问题
  2. ROS学习笔记(七)——节点
  3. webpack +vue开发(1)
  4. 通过反射向将EF的实体映射配置加入到实体模型中
  5. rnn lstm
  6. HDU 3853LOOPS(简单概率DP)
  7. -_-#【Canvas】转成黑白
  8. performSelector的方法
  9. css hr 设置
  10. [VirtualBox] - Install Oracle Linux 7 on Oracle VirtualBox
  11. 【转】常用Maven插件
  12. R+tmcn笔记︱tmcn包的基本内容以及李舰老师R语言大会展示内容摘录
  13. python/基础输出输入用法
  14. ●CodeChef Sereja and Game
  15. C#实现.ini文件读写操作
  16. Java运行时数据区概述
  17. Shell脚本统计文件行数
  18. Android APK安装过程学习笔记
  19. CCS3怎么实现border边框渐变效果
  20. SSM框架整合的其它方式

热门文章

  1. php Memcache/Memcached操作手册
  2. Linux内核分析之操作系统是如何工作的
  3. 如何评估ETL的数据加载时间
  4. 解决 yum安装时报错 Error: Protected multilib versions: 报错
  5. [C++] socket - 3 [线程简单例子 代码]
  6. EF Code First Migration总结
  7. Git 常用的命令总结(欢迎收藏备用)
  8. atitit.为什么java体系开发效率这样低的原因and解决
  9. java基础类和对象-题
  10. iOS开发---集成百度地图