1, 安装nodejs
安装python。
2,安装node-gyp: sudo npm install -g node-gyp
3,写代码:
新建一个目录,创建hello.cc文件,然后创建binding.gyp文件:
- hello.cc
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
binding.gyp文件:
+ ?
1 2 3 4 5 6 7 8 |
|
test.js 调用二进制。
?
1 2 3 |
|
4,运行node-gyp
configure,下载依赖头文件,库。
gyp info it worked if it ends with
ok
gyp info using [email protected]
gyp info using
[email protected] | linux | ia32
gyp http GET
http://nodejs.org/dist/v0.10.28/node-v0.10.28.tar.gz
gyp http 200
http://nodejs.org/dist/v0.10.28/node-v0.10.28.tar.gz
5,node-gyp build
如果报找不到binding.gyp的错误,只要把binding.gyp拷贝到build文件目录下即可。
最后生成了hello.node二进制文件。
6,运行 node test.js 会输出
world
好了,就这么简单。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
target_name 就可以了。
必须对应上binding.gyp中的
经过了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
参考: http://blog.whattoc.com/2013/09/05/nodejs_api_addon_1/ 入门
http://deadhorse.me/nodejs/2012/10/09/c_addon_in_nodejs_object.html
js与c++对象转换等等。。