Передача объектов C ++ в функции C ++ через Javascript в расширении Nodejs / V8

Я пытаюсь обернуть функцию C ++, которая принимает объект в качестве входных данных, чтобы он был доступен через Nodejs. Вот тривиальный пример, чтобы показать, что я пытаюсь сделать.

Предположим, в C ++,

struct query {
string m_foo;
string m_bar;

query(string foo, string bar)
:m_foo(foo), m_bar(bar) {}
}

static string ExecuteQuery(query q); // Implemented somewhere

В Javascript (node.js) я хочу быть в состоянии сделать,

 var q = new plugin.query("foo", "bar");
var result = plugin.ExecuteQuery(q);

Все примеры плагинов C ++ для nodejs, которые я нашел, работают с простыми типами данных и довольно тривиальными примерами. Есть ли хорошие примеры или образцы для того, чтобы сделать что-то подобное? Из-за отсутствия документации v8 и громоздкого / многословного синтаксиса создания плагинов, мне не очень повезло с этим в одиночку.

Нужен,

  • Возможность создавать объекты C ++ в Javascript
  • Возможность передавать эти объекты в методы или статические функции, которые нуждаются в них через Javascript

Кроме того, есть ли что-то лучше, чем v8-juice / cvv8, для упрощения процесса упаковки библиотек C ++, чтобы они были доступны через node.js?

4

Решение

Узел-холст
В Узел-холст TJ Holowaychuk проделал большую работу, показав примеры обтекания объектов в C ++ для передачи назад и использования на стороне javascript.

Я приведу один пример ниже, чтобы поделиться с вами, как это делается.

От Image.h

class Image: public node::ObjectWrap {

От Image.cc

Persistent<FunctionTemplate> Image::constructor;
...
Handle<Value>
Image::New(const Arguments &args) {
HandleScope scope;
Image *img = new Image;
img->data_mode = DATA_IMAGE;
img->Wrap(args.This());
return args.This();
}

Другим примером является холст объект

class Canvas: public node::ObjectWrap {

и из Canvas.cc

Handle<Value>
Canvas::New(const Arguments &args) {
HandleScope scope;
int width = 0, height = 0;
canvas_type_t type = CANVAS_TYPE_IMAGE;
if (args[0]->IsNumber()) width = args[0]->Uint32Value();
if (args[1]->IsNumber()) height = args[1]->Uint32Value();
if (args[2]->IsString()) type = !strcmp("pdf", *String::AsciiValue(args[2]))
? CANVAS_TYPE_PDF
: CANVAS_TYPE_IMAGE;
Canvas *canvas = new Canvas(width, height, type);
canvas->Wrap(args.This());
return args.This();
}

Как только требуется модуль node-canvas, к нему так же легко получить доступ, как и к любому другому объекту javascript.

fs.readFile(__dirname + '/someFile.jpg', function(err, image_data){
var Canvas      = require('canvas');
var Image       = Canvas.Image;
var img = new Image;
img.onload = function() {
var canvas = new Canvas(img.width,img.height);
var ctx = canvas.getContext('2d');
// grab and modify pixel data etc
}
img.src = image_data;
}

Для объяснения ObjectWrap, см. nodejs аддон документы.

1

Другие решения

Это зависит от того, какой браузер вы используете, но с большинством из них взаимодействие между C ++ и JavaScript осуществляется через COM.

-8