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++是你想要的吗?这个问题:节点缓冲区到字符数组为双向转换提供了代码。