cómo entregar la matriz c ++ a node.js usando el complemento nativo v8

Implementé un módulo complementario c ++ que crea un poco de búfer utilizando una memoria de caracteres unsigned char(uint8_t) y lo entrega a node.js.

—- c ++ addon.cpp —-

 void get_frame_buffer(const FunctionCallbackInfo& 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 ext = External::New(isolate, buf); Local obj = ext->ToObject(); args.GetReturnValue().Set(obj); } void Init(Local exports) { NODE_SET_METHOD(exports, "GetFrameBuffer", get_frame_buffer); } NODE_MODULE(glAddonNode, Init) 

—- recibido.js en Node.js —-

 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); } 

La entrega del objeto a node.js es exitosa, y esperaba que los datos de la matriz existieran en el objeto recibido, pero ese objeto está vacío.

¿Qué pasa ?, ¿hay algún error en el código? ¿Cómo entregar una matriz c ++ a node.js usando v8::External Objeto v8::External ? O bien, ¿conoce otra forma de entregar c ++ array a node.js?

Además, quiero evitar las funciones de copia (memcpy (), node :: Buffer :: Copy () etc.)

La respuesta corta es: no puede usar v8::External s para exponer objetos C ++ a JavaScript.

El caso de uso previsto para External s es asociar objetos C ++ con objetos expuestos a JS almacenándolos en “campos internos”, a los que solo se puede acceder desde C ++. Por ejemplo, puede almacenar esa matriz uint8_t (envuelta en un External ) en el campo interno de algún objeto, y luego cuando ese objeto se entrega de JS a una de sus devoluciones de llamada de C ++, obtenga la External de su campo interno para recuperar la matriz uint8_t original . Pero no hay magia para exponer una matriz de C ++ directamente como propiedades de objeto a JavaScript.

Para compartir rápidamente los datos binarios entre C ++ y JavaScript, el node::Buffer s es probablemente lo que desea. Tal vez esta pregunta: ¿Qué es lo que está buscando? ¿Desea pasar Node.js Buffer a C ++ addon ? Esta pregunta: Node Buffer to char array proporciona código para las conversiones en ambas direcciones.