30

公开 Point 类的官方示例似乎假设您的程序中将有固定数量的实例。当在 Javascript 中调用new时,尚不清楚如何在 C++ 代码中分配新实例。

你将如何公开一个可以有多个实例的类?例如,一个 Image 类:

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

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

3 回答 3

30

这是我能找到的关于将 C++ 对象暴露给 V8 Javascript 的最佳博文。它深入细节,并使用代码片段将其分解为更小的步骤。请注意:代码片段几乎没有不一致之处,我读了几遍才明白。事先阅读我的简短摘要可能会有所帮助:

  1. 对象必须包装在 V8 模板中。注意:Google 示例使用 ObjectTemplates,但作者解释了为什么他更喜欢 FunctionTemplates。
    1. 创建一个函数模板。此模板的实例有一个内部字段来存储 C++ 对象的内存地址。他们还获得了类的访问器方法。
    2. 创建一个函数 wrapObject(),它将在这些 FunctionTemplate 之一中包装一个 C++ 对象。
  2. 构造函数还必须包装在(不同的)V8 模板中。使用不同的模板来避免不必要的递归。(将两个模板合并为一个的方法在博文末尾描述。)
    1. 创建另一个 FunctionTemplate。该模板只是将 JavaScript 全局范围(new将从哪里调用)连接到 C++ 构造函数。
    2. 制作模板将调用的方法。该方法实际上使用了 C++new运算符,并调用了 C++ 类的构造函数。然后它通过调用在步骤 1.2 中创建的 wrapObject() 方法来包装对象。

现在,在步骤 2.2 中分配的内存必须delete'd 一些时间。更新:下一篇博文“ Persistent Handles ”详细介绍了这一点。

我对这些博客文章中提到的实际代码的注释:

  • 博客中的方法wrapPoint()其实和unwrap()实际代码中的方法是类似的;不是 wrap()
  • 要查找代码之间的其他共同点,请搜索SetInternalFieldCount(0constructorCall
  • 实际代码似乎通过使用 MakeWeak() 方法来设置执行清理的回调方法来进行内存管理。
于 2010-10-05T09:36:37.880 回答
3

这是我不久前写的一个帮助程序,它使在 v8 中暴露和处理上下文变得非常容易。希望能帮助到你。

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

于 2010-11-26T19:27:54.757 回答
-12

我不知道如何在 V8 Js 引擎中实现这一点,但就像在 Python 世界中一样,您可以按照以下方式进行操作。你的图像类:

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);
    };
};

现在你可以让你的代码工作了。另外,上面的代码没有考虑垃圾收集机制,所以要特别注意它。对不起我的英语蹩脚!

于 2010-06-18T08:58:03.150 回答