【发布时间】:2021-06-17 03:19:07
【问题描述】:
我已经成功让 V8 运行任意 Javascript 文件。当我尝试公开一个 C++ 函数以便它可以由 Javascript 代码运行时,问题就来了。
我定义了以下简单的玩具函数,
v8::Handle<v8::Value> f(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
return v8::Number::New(isolate,2);
}
然后,我尝试将其添加到全局对象模板中,如下所示。
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
global->Set(isolate, "f",
v8::FunctionTemplate::New(isolate, f) );
v8::Local<v8::Context> context = v8::Context::New(isolate, nullptr, global);
当f 是void 函数时,这个确切的模式工作得非常好,但是现在我要求它给出一个返回值,我得到了以下错误。
cisco/test.cpp: In function ‘int main(int, char**)’:
cisco/test.cpp:52:61: error: invalid conversion from ‘v8::Handle<v8::Value> (*)(const v8::FunctionCallbackInfo<v8::Value>&) {aka v8::Local<v8::Value> (*)(const v8::FunctionCallbackInfo<v8::Value>&)}’ to ‘v8::FunctionCallback {aka void (*)(const v8::FunctionCallbackInfo<v8::Value>&)}’ [-fpermissive]
v8::FunctionTemplate::New(isolate, f) );
^
In file included from cisco/test.cpp:2:0:
./include/v8.h:6495:34: note: initializing argument 2 of ‘static v8::Local<v8::FunctionTemplate> v8::FunctionTemplate::New(v8::Isolate*, v8::FunctionCallback, v8::Local<v8::Value>, v8::Local<v8::Signature>, int, v8::ConstructorBehavior, v8::SideEffectType, const v8::CFunction*, uint8_t, uint8_t, uint8_t)’
static Local<FunctionTemplate> New(
V8 文档中的samples 没有任何非空示例。事实上,我只知道返回类型应该是Handle<Value>,因为2011年的this示例。它基本上使用了与我添加全局函数相同的模式(我确实尝试将Local<ObjectTemplate>更改为Handle<ObjectTemplate>,但这并没有解决问题),所以我不确定为什么我的不工作。
我不知道如何继续。任何帮助将不胜感激。
【问题讨论】:
标签: c++ binding v8 function-templates