Я пытаюсь обернуть функцию 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 и громоздкого / многословного синтаксиса создания плагинов, мне не очень повезло с этим в одиночку.
Нужен,
Кроме того, есть ли что-то лучше, чем v8-juice / cvv8, для упрощения процесса упаковки библиотек C ++, чтобы они были доступны через node.js?
Узел-холст
В Узел-холст 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 аддон документы.
Это зависит от того, какой браузер вы используете, но с большинством из них взаимодействие между C ++ и JavaScript осуществляется через COM.