nodejs调用c++程序测试代码


          

运行环境:

Ubuntu 12.04

node-gyp v3.3.1

Python 2.7.3

gcc 4.6.3

make 3.81

node v0.10.37

binding.gyp(注意:不是building)

{  
  "targets": [  
    {  
      "target_name": "add",  
      "sources": [ "add.cc" ]  
    }  
  ]  
}  
add.cc
#define BUILDING_NODE_EXTENSION  
#include <node.h>  
  
using namespace v8;  
  
Handlehello(const Arguments& args) {  
  HandleScope scope;  
  return scope.Close(String::New("hello,world"));  
}  
  
HandlemyConcat(const Arguments& args) {  
  HandleScope scope;  
  
  if (args.Length() < 2 || !args[0]->IsString()) {  
    return ThrowException(Exception::TypeError(  
      String::New("Wrong arguments")));  
  }  
  
  Localcb = Local::Cast(args[1]);  
  const unsigned argc = 1;  
  Localargv[argc] = {  
    String::Concat(Local::Cast(args[0]), String::New(" myConcat"))  
  };  
  
  cb->Call(Context::GetCurrent()->Global(), argc, argv);  
  
  return scope.Close(Undefined());  
}  
  
Handleadd(const Arguments& args) {  
  HandleScope scope;  
  if (args.Length() < 2 || !args[0]->IsNumber() || !args[1]->IsNumber()) {  
    return ThrowException(Exception::TypeError(  
      String::New("Wrong arguments")));  
  }  
    
  int32_t sum = args[0]->ToInteger()->Value() + args[1]->ToInteger()->Value();  
  
  return scope.Close(Integer::New(sum));  
}  
  
void RegModule(Handletarget){  
  
  target->Set(String::NewSymbol("hello"),  
      FunctionTemplate::New(hello)->GetFunction());  
  
  target->Set(String::NewSymbol("myConcat"),  
      FunctionTemplate::New(myConcat)->GetFunction());  
  
  target->Set(String::NewSymbol("myAdd"),  
      FunctionTemplate::New(add)->GetFunction());  
}  
  
//moduleName, RegisterModuleFunctionName  
NODE_MODULE(add, RegModule); 
test.js
var test = require('./build/Release/add');  
  
var str = test.hello();  
console.log(str);  
  
test.myConcat('nodejs', function(data) {  
  console.log(data);  
});  
  
console.log("2+3="+test.myAdd(2,3)); 

编译运行:

node-gyp configure build

node test.js

结果:

hello,world
nodejs myConcat
2+3=5

注意有些版本代码则是这样的:

下面代码则在如下环境运行成功

Ubuntu 14.04.1 LTS

node-gyp v3.3.1

python 2.7.6

gcc 4.8.2

make 3.81

node v5.2.0

#include <node.h>
#include <v8.h> 
  
using namespace v8;  
  
// 传入了两个参数,args[0] 字符串,args[1] 回调函数  
void hello(const FunctionCallbackInfo& args) {  
  // 使用 HandleScope 来管理生命周期  
  Isolate* isolate = Isolate::GetCurrent();  
  HandleScope scope(isolate);  
  
  // 判断参数格式和格式  
  if (args.Length() < 2 || !args[0]->IsString()) {  
    isolate->ThrowException(Exception::TypeError(  
      String::NewFromUtf8(isolate, "Wrong arguments")));  
    return;  
  }  
  
  // callback, 使用Cast方法来转换  
  Localcallback = Local::Cast(args[1]);  
  Localargv[1] = {  
    // 拼接String  
    String::Concat(Local::Cast(args[0]), String::NewFromUtf8(isolate, " world"))  
  };  
  // 调用回调, 参数: 当前上下文,参数个数,参数列表  
  callback->Call(isolate->GetCurrentContext()->Global(), 1, argv);  
}  
  
// 相当于在 exports 对象中添加 { hello: hello }  
void init(Handleexports) {  
  NODE_SET_METHOD(exports, "hello", hello);  
}  
  
// 将 export 对象暴露出去  
// 原型 `NODE_MODULE(module_name, Initialize)`  
NODE_MODULE(test, init); 
类型判断
Localarg = args[0];
bool isArray = arg->IsArray();
bool isBoolean = arg->IsBoolean();
bool isNumber = arg->IsNumber();
bool isInt32 = arg->IsInt32();
类型转换
Localarg = args[0];
Local= arg->ToObject();
Local= arg->ToBoolean();
Local= arg->ToNumber();
Local= arg->ToInt32 ();
Localcallback = Local::Cast(args)