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' } ] }

おすすめ

転載: blog.csdn.net/weixin_43398820/article/details/105750657
おすすめ