簡體   English   中英

通過Nodejs / V8擴展中的Javascript將C ++對象傳遞給C ++函數

[英]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文檔以及制作插件的繁瑣/冗長的語法,我自己對此沒有多大的運氣。

需要

  • 能夠用Javascript創建C ++對象
  • 能夠通過Javascript將這些對象傳遞給需要它們的方法或靜態函數

另外,還有什么比v8-juice / cvv8更好的嘗試簡化包裝C ++庫的過程,以便可以通過node.js對其進行訪問?

node-canvas在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();
}

另一個例子是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM