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

{
  "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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值