您的位置:首页 > Web前端 > Node.js

nodejs调用c++ addon的简单例子(带参数)

2016-01-08 11:44 609 查看
{
"targets": [
{
"target_name": "loginfo",
"sources": [ "logparse.cc" ]
}
]
}

binding.gyp文件

target_name字段是最后产生的 build/Release/loginfo.node  node动态库的名字

sources字段是源代码文件名

var addon = require('./build/Release/loginfo');

/* each page pagesize line */
console.log(addon.log_get_linenum("2015-12-01", "2015-12-05"));
console.log(addon.log_get_page("2015-12-01", "2015-12-05", "1"));
console.log(addon.log_set_pagesize("10"));
console.log(addon.log_get_page("2015-12-01", "2015-12-05", "29"));test.js文件
require后面跟着的是binding.gyp文件target_name指定的node动态库名字

addon.log_get_linenum  就是调用c++的接口,这里有个映射关系

在logparse.cc里面 NODE_SET_METHOD(exports, "log_get_linenum", log_get_linenum);定义映射

js文件里的addon后面的函数对于第二个参数, 第三个参数为c++的函数

可以这样定义NODE_SET_METHOD(exports, "xxxxxxxx", log_get_linenum);

js这样调用  console.log(addon.xxxxxxxx("2015-12-01", "2015-12-05"));

#include <stdlib.h> /* atoi */
#include <iostream> /* cout */
#include <string> /* std::string */
#include <v8.h> /* v8::String etc. */
#include <node.h> /* NODE_MODULE etc. */
using namespace node;
using namespace v8;
using namespace std;

Handle<Value> log_get_linenum(const Arguments& args)
{
HandleScope scope;
v8::String::Utf8Value argv1(args[0]->ToString());
v8::String::Utf8Value argv2(args[0]->ToString());
std::string start(*argv1);
std::string end(*argv2);

/* return linenum */
int linenum = 123;

return scope.Close(v8::Number::New(linenum));
}

Handle<Value> log_set_pagesize(const Arguments& args)
{
HandleScope scope;
v8::String::Utf8Value argv1(args[0]->ToString());
std::string pagestr(*argv1);
int pagesize = atoi(pagestr.c_str());

/* set the pagesize */
cout << pagesize << endl;

return scope.Close(v8::Number::New(0));
}

Handle<Value> log_get_page(const Arguments& args)
{
HandleScope scope;
v8::String::Utf8Value argv1(args[0]->ToString());
v8::String::Utf8Value argv2(args[1]->ToString());
v8::String::Utf8Value argv3(args[2]->ToString());
std::string start(*argv1);
std::string end(*argv2);
std::string pageids(*argv3);
int pageid = atoi(pageids.c_str());

/*
* fetch the log page. and return it as json format
*/
cout << pageid << endl;
std::string jsonstr("{\"loginfo\": [{ \"logtime\":\"2015-12-24\", \"loglevel\":\"DEBUG\", \"logmsg\":\"hello\"},{...}...]}");

return scope.Close(v8::String::New(jsonstr.c_str()));
}

void init(Handle<Object> exports)
{
NODE_SET_METHOD(exports, "log_get_linenum", log_get_linenum);
NODE_SET_METHOD(exports, "log_set_pagesize", log_set_pagesize);
NODE_SET_METHOD(exports, "log_get_page", log_get_page);
}

NODE_MODULE(loginfo, init)logparse.cc文件
依照node开发框架开发

NODE_MODULE(loginfo, init)第一个参数为node动态库名字,也就是binding.gyp文件target_name指定的名字
第二个参数为初始化函数,初始化映射表

函数注意参数的转换

最后测试一下

bash# node-gyp configure build

bash# nodejs test.js

参数类型转换可以参考v8类,链接:http://izs.me/v8-docs/classv8_1_1Value.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: