[英]Passing C++ objects to C++ functions via Javascript in Nodejs/V8 extension
我正在嘗試包裝一個將對象作為輸入的C ++函數,以便可以通過Node.js訪問它。 這是一個平凡的例子,展示了我正在嘗試做的事情。
假設在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);
我發現的所有nodejs C ++插件示例都在處理簡單數據類型和相當瑣碎的示例。 有沒有很好的例子或模式來做這樣的事情? 由於缺少v8文檔以及制作插件的繁瑣/冗長的語法,我自己對此沒有多大的運氣。
需要
另外,還有什么比v8-juice / cvv8更好的嘗試簡化包裝C ++庫的過程,以便可以通過node.js對其進行訪問?
node-canvas在TJ Holowaychuk的節點畫布中,他做了出色的工作,展示了用C ++編寫的對象包裝示例,以便在javascript端進行回傳和使用。
我將在下面摘錄一個示例,與您分享如何完成。
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();
}
另一個例子是Canvas對象
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();
}
一旦需要節點畫布模塊,就可以像訪問其他任何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 addon docs 。
這取決於您使用的瀏覽器,但是大多數情況下,C ++和JavaScript之間的互操作是通過COM完成的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.