gpt4 book ai didi

c++ - V8 - 将 args.Data() 转换回 void 指针

转载 作者:行者123 更新时间:2023-11-30 05:24:20 25 4
gpt4 key购买 nike

目前我正在使用以下方法绑定(bind)一个函数:

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

实现:

void V8Instance::js_print(const v8::FunctionCallbackInfo<v8::Value> &args) {
for (int i = 0; i < args.Length(); i++) {
v8::HandleScope handle_scope(args.GetIsolate());
v8::String::Utf8Value str(args[i]);
std::cout << *str << std::endl;
}
std::cout << std::endl;
}

但是我希望我的 js_print 函数能够访问属于 V8Instance 类成员的变量。 V8 是否有类似能够使用 boost::bind(&Class::function, this, ...) 的功能?这让我可以绑定(bind)成员函数,或者有什么方法可以通过引用/指针将我需要的变量传递给 js_print每次调用?

更新

我发现我可以使用 FunctionTemplate::New 的数据参数传递一个指向我的类的指针:

Local<External> self = External::New(isolate, (void *) this);
global->Set(String::NewFromUtf8(isolate, "print", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, V8Instance::js_print, self));

我可以在我的 js_print 中访问它功能使用args.Data()但这会返回 Local<Value>我不确定如何转换回 void * 的对象然后回到我的类指针,V8Instance * .有谁知道如何做到这一点?

最佳答案

您可以将 C++ 对象包装到相应的 v8::ObjectTemplate 中并为其设置访问器,如 V8 Embedder's Guide 中所述。 .

要包装一个 C++ 类(即从 JavaScript 使用此 C++ 类的许多 C++ 实例),您需要创建 V8 FunctionTemplate 作为包装类的 JS 构造函数,它将存储指向的指针V8 Object 实例中的 C++ 对象,并为该类中的所需成员函数设置 V8 函数回调。这些回调应该从 V8 对象中解包 C++ 对象,并为解包的对象调用适当的成员函数。

这种方法会导致编写大量样板代码。 Node.js 允许从 node::ObjectWrap 继承 C++ 类在 native 插件中。

我还创建了 v8pp以非侵入方式绑定(bind) C++ 类、函数和 lambda 的库,无需继承。

存在几个类似的库。但是,据我所知,它们已经过时并且不支持新的 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());
....
}

关于c++ - V8 - 将 args.Data() 转换回 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38706501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com