C++ V8-将args.Data()转换回无效指针

C++ V8-将args.Data()转换回无效指针,c++,v8,C++,V8,目前,我正在使用以下命令绑定函数: global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print)); 具有以下功能: static void js_print(const v8::FunctionCallbackInfo<v8::Valu

目前,我正在使用以下命令绑定函数:

global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print));
具有以下功能:

static void js_print(const v8::FunctionCallbackInfo<v8::Value> &args);

我可以使用
args.Data()
在我的
js_print
函数中访问它,但这将返回
Local
对象,我不确定如何将其强制转换回
void*
,然后返回到我的类指针
V8Instance*
。是否有人知道如何做到这一点?

< P>你可以把C++对象包装成相应的代码> V8::ObjistMedios/Cuff>并设置它的访问器,如

中所描述的。

为包装C++类(即使用JavaScript中的C++类的许多C++实例),需要创建V8<代码>函数模板< />代码>作为包装类的JS构造函数,它将存储指向V8<代码>对象< /Cube >实例中的C++对象的指针,并为该类中所需的成员函数设置V8函数回调。这些回调应该打开V8对象的C++对象,并为未包装对象调用适当的成员函数。 这种方法导致编写大量样板代码。No.js允许从本地ADDN继承C++类。 <>我也创建了一个库,它以非侵入的方式绑定C++类、函数和lambDas,没有继承。 存在几个类似的库。但是,据我所知,它们已经过时,不支持新的V8版本

更新。要从外部数据获取
V8Instance*
,需要将
args.data()
值转换为
v8::external
,然后从该外部值获取指针并将其转换为
V8Instance*
。大概是这样的:

void V8Instance::js_print(const v8::FunctionCallbackInfo<v8::Value> &args)
{
    v8::Local<v8::External> ext = args.Data().As<v8::External>();
    V8Instance* self = static_cast<V8Instance*>(ext->Value());
    ....
}
void V8Instance::js_print(const v8::FunctionCallbackInfo&args)
{
v8::Local ext=args.Data().As();
V8Instance*self=static_cast(ext->Value());
....
}

我在v8 google组中询问过,显然我可以在
FunctionTemplate
(第三个参数)中传递一个指向我的类的指针作为数据。我已经通过以下方法找到了实现方法:
Local self=External::New(隔离,(void*)this)
然后将
self
作为第三个参数传递,但我不知道如何将
args.Data()
(在
js_print
中)转换回
V8Instance*
谢谢,是的,这就是我想要的。标记更正代码中有一个小错误,顺便说一句,
应该是
ext.Value()
应该是
ext->Value()
谢谢,修复了答案。
Local<External> self = External::New(isolate, (void *) this);
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print, self));
void V8Instance::js_print(const v8::FunctionCallbackInfo<v8::Value> &args)
{
    v8::Local<v8::External> ext = args.Data().As<v8::External>();
    V8Instance* self = static_cast<V8Instance*>(ext->Value());
    ....
}