NAN api实现node.js和c++之间的参数传递 -- 对象,数组

背景

node.js和c++之间的参数传递,除了传递基本的数据类型Number,String外(基本类型)还可以传递对象和数组,下面提供一个实例具体实现了使用NAN api传递数组和对象的方式。

实例

创建一个目录demo

  1. demo目录下新建文件binding.gyp
{
    'targets': [
        {
            "target_name": "addon", 
            "sources": ["./addon.cc"],
            
            "include_dirs": [
                "<!(node -e \"require('nan')\")",
            ],            
        }
    ]  
}
  1. demo目录下安装nan模块
npm install nan
  1. demo目录下新建文件addon.cc
#include <iostream>
#include <string>

#include <v8.h>
#include <nan.h>

using namespace v8;

NAN_METHOD(get_numbers_msg)
{
  Isolate *isolate = Isolate::GetCurrent();
  Local<Context> context = isolate->GetCurrentContext();
  
  Local<Array> peoplesArray = Local<Array>::Cast(info[0]);

  char *name = NULL;
  char *sex = NULL;


  //nodejs --> c++传递对象数组
  std::cout<<"addon receive Array object: "<<std::endl;
  for (int i = 0; i < peoplesArray->Length(); i++)
  {
    Local<Object> people = Local<Object>::Cast(peoplesArray->Get(i));

    Local<String> name_value = Local<String>::Cast(people->Get(String::NewFromUtf8(isolate, "name")));
    String::Utf8Value name_str(name_value);
    name = *name_str;

    Local<String> age_value = Local<String>::Cast(people->Get(String::NewFromUtf8(isolate, "age")));
    String::Utf8Value age_str(age_value);
    char *age = *age_str;

    Local<String> sex_value = Local<String>::Cast(people->Get(String::NewFromUtf8(isolate, "sex")));
    String::Utf8Value sex_str(sex_value);
    sex = *sex_str;

    std::cout <<i<< ".  name is " << name << ",age is " << age << ",sex is " << sex << std::endl;
  }


  //c++ --> nodejs传递对象数组
  Local<Object> retObj = Nan::New<Object>();
  retObj->Set(context, Nan::New("count").ToLocalChecked(), Nan::New(5));
  Local<Array> numbersObjArray = Nan::New<Array>();

  for (int i = 0; i < 5; i++)
  {
    Local<Object> numberObj = Nan::New<Object>();
    numberObj->Set(context, Nan::New("name").ToLocalChecked(), Nan::New(name).ToLocalChecked());
    numberObj->Set(context, Nan::New("age").ToLocalChecked(), Nan::New(25));
    numberObj->Set(context, Nan::New("sex").ToLocalChecked(), Nan::New(sex).ToLocalChecked());
    numbersObjArray->Set(context, i, numberObj);
  }

  retObj->Set(context, Nan::New("numbers").ToLocalChecked(), numbersObjArray);
  info.GetReturnValue().Set(retObj);
}

NAN_MODULE_INIT(init)
{
  Nan::Export(target, "getNumbersMsg", get_numbers_msg);
}

NODE_MODULE(addon, init)
  1. 在demo目录下新建文件index.js
var addon = require('./build/Release/addon.node');  //加载node模块

function createArrayObj() {
  var peoplesArray = new Array();
  for (var i = 0; i < 5; i++) {
    var people = {};
    people.name = 'zl';
    people.age = '25';
    people.sex = 'man';
    peoplesArray[i] = people;
  }
  return peoplesArray;
}
var sendArrayMsg = createArrayObj();  //nodejs向c++传递的对象数组

//调用addon接口获取从js返回的对象数组
var numbersMsg = addon.getNumbersMsg(sendArrayMsg);

console.log("nodejs receive msg is ", numbersMsg);
  1. 执行命令
node-gyp rebuild
node index.js
  1. 输出结果为:
addon receive Array object:
0.  name is zl,age is 25,sex is man
1.  name is zl,age is 25,sex is man
2.  name is zl,age is 25,sex is man
3.  name is zl,age is 25,sex is man
4.  name is zl,age is 25,sex is man
-------------------------------------
nodejs receive msg is:  { count: 5,
  numbers:
   [ { name: 'zl', age: 25, sex: 'man' },
     { name: 'zl', age: 25, sex: 'man' },
     { name: 'zl', age: 25, sex: 'man' },
     { name: 'zl', age: 25, sex: 'man' },
     { name: 'zl', age: 25, sex: 'man' } ] }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值