簡體   English   中英

如何在V8 Javascript引擎中公開C ++類,以便可以使用new創建它?

[英]How do you expose a C++ class in the V8 Javascript Engine so it can be created using new?

暴露Point類的官方示例似乎假設程序中將有固定數量的實例。 當在Javascript中調用new時,不清楚如何在C ++代碼中分配新實例。

你如何公開一個可以擁有多個實例的類? 例如,一個Image類:

var img1 = new Image( 640, 480 );
var img2 = new Image( 1024, 768 );

img1.clear( "red" );
img2.clear( "black" );

這是我在將C ++對象暴露給V8 Javascript時可以找到的最好的博客文章 它進入更深入的細節,並使用代碼片段將其分解為更小的步驟。 請注意:代碼片段幾乎沒有任何不一致之處,我需要讀幾遍才能理解。 事先閱讀我的簡短摘要可能會有所幫助:

  1. 對象必須包裝在V8模板中。 注意:Google示例使用ObjectTemplates,但作者解釋了為什么他更喜歡FunctionTemplates。
    1. 創建一個FunctionTemplate。 此模板的實例具有內部字段,用於存儲C ++對象的內存地址。 他們也獲得了類的訪問方法。
    2. 創建一個函數wrapObject(),它將C ++對象包裝在其中一個FunctionTemplates中。
  2. 構造函數也必須包裝在(不同的)V8模板中。 使用不同的模板來避免不必要的遞歸。 (在博客文章末尾描述了將兩個模板組合成一個模板的方法。)
    1. 創建另一個FunctionTemplate。 此模板只是將JavaScript全局范圍(將從中調用new )連接到C ++構造函數。
    2. 制作模板將調用的方法。 該方法實際上使用C ++ new運算符並調用C ++類構造函數。 然后它通過調用在步驟1.2中創建的wrapObject()方法來包裝對象。

現在,必須在某個時間delete步驟2.2中分配的內存。 更新:下一篇博文“ Persistent Handles ”詳細介紹了這一點。

在這些博文中提到了關於實際代碼的說明:

  • 所述wrapPoint()在博客方法實際上是類似於unwrap()中的實際代碼方法; wrap()
  • 要查找代碼之間的其他公共點,請搜索: SetInternalFieldCount(0constructorCall
  • 實際代碼似乎通過使用MakeWeak()方法來設置執行清理的回調方法來進行內存管理。

這是一個幫助我,我寫了一段時間,使得暴露和處理v8中的上下文非常容易。 希望能幫助到你。

https://gamedev.stackexchange.com/questions/2796/binding-c-and-v8-javascript-from-google/2797#2797

我不知道如何在V8 Js引擎中完全實現這一點,但是在Python世界中,你可以做到以下幾點。 你的Image類:

class Image
{
public:
    Image(int w, int h);
    int Width(void) const;
};

編寫一些包裝函數並將這些函數公開給Js世界:

Image* Image_New(int w, int h) { return new Image(w, h); }
void Image_Delete(Image* pImage) { delete pImage; }
int Image_Width(const Image* pImage) { return pImage->Width(); }

將以下代碼添加到您的js文件中:

var Image = function (w, h) {
    this.image = new Image(w, h);
    this.Width = function() {
        return Image_Width(this.image);
    };
};

現在你可以讓你的代碼工作。 此外,上面的代碼沒有考慮垃圾收集機制,所以要特別注意它。請為我的borken英語!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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