[英]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时可以找到的最好的博客文章 。 它进入更深入的细节,并使用代码片段将其分解为更小的步骤。 请注意:代码片段几乎没有任何不一致之处,我需要读几遍才能理解。 事先阅读我的简短摘要可能会有所帮助:
new
)连接到C ++构造函数。 new
运算符并调用C ++类构造函数。 然后它通过调用在步骤1.2中创建的wrapObject()方法来包装对象。 现在,必须在某个时间delete
步骤2.2中分配的内存。 更新:下一篇博文“ Persistent Handles ”详细介绍了这一点。
wrapPoint()
在博客方法实际上是类似于unwrap()
中的实际代码方法; 不 wrap()
SetInternalFieldCount(0
, constructorCall
这是一个帮助我,我写了一段时间,使得暴露和处理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.