关于javascript:如何使用v8 native addon将c ++数组传递给node.js

how to deliver c++ array to node.js using v8 native addon

我实现了一个C++ ADDON模块,它使用EDCOX1×0内存创建一些缓冲区,并将其传递给NoDE.js。

--C++ADON.CPP------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void get_frame_buffer(const FunctionCallbackInfo<Value>& args){
Isolate* isolate = helper.get_current_isolate();

if (!args[0]->IsUint32()&& !args[1]->IsUint32())
{
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate,"Wrong arguments")));
    return;
}

int width = args[0]->Uint32Value();
int height = args[1]->Uint32Value();

uint8_t* buf = new uint8_t[width * height * 4];
int length = width * height;
memset(buf, 0, sizeof(buf));

for (int i = 0; i < length; i++)
{
    buf[i * 4 + 0] = 128;
    buf[i * 4 + 1] = 128;
    buf[i * 4 + 2] = 128;
    buf[i * 4 + 3] = 255;
}      

Local<External> ext = External::New(isolate, buf);
Local<Object> obj = ext->ToObject();
args.GetReturnValue().Set(obj);
}

void Init(Local<Object> exports)
{    
  NODE_SET_METHOD(exports,"GetFrameBuffer", get_frame_buffer);
}

NODE_MODULE(glAddonNode, Init)

----在node.js中接收到.js----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const module = require('./addon.js');
var Received = function()
{
   this._module = new module.Module;
}

Received.prototype.get_frame_buffer = function(width, height)
{
  var c++_buf = this._module.GetFrameBuffer(width, height);
  // c++_buf is received from c++ addon
  // but c++_buf is null

  console.log(c++_buf);
}

将对象传递到node.js是成功的,我希望数组数据存在于接收到的对象中,但该对象是空的。

发生了什么?,代码中有错误吗?如何使用EDCOX1×1对象传递C++数组到NoDE.js?或者,你知道将C++数组传递给NoDE.js的另一种方法吗?

另外,我希望避免复制函数(memcpy()、node::buffer::copy()等)。


简短的回答是:不能使用EDCOX1的0个s来将C++对象暴露给JavaScript。

EDCOX1(1)s的预期用例是将C++对象与JS暴露对象相关联,将它们存储在"内部字段"中,这些字段只能从C++访问。例如,您可以在某个对象的内部字段中存储EDCOX1×2×数组(包在EDCOX1×1)中,然后当该对象从JS传递到C++回调中的一个时,从其内部字段获取EDCOX1×1的引用,以检索原始EDCOX1×2数组。但是,将C++数组直接作为对象属性暴露给JavaScript并没有什么魔力。

为了在C++和JavaScript之间快速共享二进制数据,EDCOX1×6可能是你想要的。也许这个问题:Pass Node.js Buffer到C++是你想要的吗?这个问题:节点缓冲区到字符数组为双向转换提供了代码。