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 源代码。
我已经成功地将 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 源代码。