V8 - 将非空 C++ 函数公开给 Javascript 代码

V8 - Exposing a non-void C++ function to the Javascript code

我已经成功地将 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 函数时,这个确切的模式工作得很好,但现在我要求它给出一个 return 值,我得到以下错误。

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(

2011 年的 samples from the V8 docs do not have any non-void examples. In fact, I only know that the return type should be Handle<Value> because of this 示例。它基本上使用与我添加全局函数相同的模式(我确实尝试将 Local<ObjectTemplate> 更改为 Handle<ObjectTemplate>,但这并没有修复它),所以我不确定为什么我的不工作。

我有点不知如何继续。任何帮助将不胜感激。

https://v8docs.nodesource.com/node-16.0/dd/d0d/classv8_1_1_function_callback_info.html

Returnvoid。您的 args 有一个 Return 值 属性。您可以在其中设置 return 值。

args.GetReturnValue().Set( 2 );

我发现 google 代码往往会大量更改 API,因此最好查看当前文档 and/or 源代码。