Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;范围和googlev8脚本上下文_C++_Scope_V8_Embedded V8_Libv8 - Fatal编程技术网

C++ C++;范围和googlev8脚本上下文

C++ C++;范围和googlev8脚本上下文,c++,scope,v8,embedded-v8,libv8,C++,Scope,V8,Embedded V8,Libv8,我有以下几乎是用c++编写的工作代码: [..] Handle<Object> jsGlobal; Handle<Function> jsUpdateFunc; void setupJs () { V8::Initialize(); Isolate* isolate = v8::Isolate::New(); Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(

我有以下几乎是用c++编写的工作代码:

[..]

Handle<Object> jsGlobal;
Handle<Function> jsUpdateFunc;

void setupJs () {
    V8::Initialize();
    Isolate* isolate = v8::Isolate::New();
    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);
    Local<Context> context = Context::New(isolate);
    Context::Scope context_scope(context);
    Local<String> source = String::NewFromUtf8(isolate, "var a = 0; function test() { a++; return a.toString(); }");
    Local<Script> script = Script::Compile(source);
    script->Run();

    jsGlobal = context->Global();
    Handle<Value> value = jsGlobal->Get(String::NewFromUtf8(isolate, "test"));
    jsUpdateFunc = Handle<Function>::Cast(value);
}

void callJs() {
    Handle<Value> args[0];
    Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
    js_result->ToString();

    String::Utf8Value utf8(js_result);
    printf("%s\n", *utf8);
}

[..]
[…]
处理全球事务;
处理jsUpdateFunc;
void setupJs(){
V8::Initialize();
隔离*隔离=v8::隔离::新建();
隔离::范围隔离\范围(隔离);
手柄镜手柄范围(隔离);
本地上下文=上下文::新建(隔离);
上下文::范围上下文\范围(上下文);
localsource=String::NewFromUtf8(隔离,“var a=0;函数测试(){a++;返回a.toString();}”);
本地脚本=脚本::编译(源代码);
脚本->运行();
jsGlobal=context->Global();
handlevalue=jsGlobal->Get(字符串::NewFromUtf8(隔离,“测试”);
jsUpdateFunc=Handle::Cast(值);
}
void callJs(){
句柄参数[0];
Handle js_result=jsUpdateFunc->Call(jsGlobal,0,args);
js_result->ToString();
字符串::utf8值utf8(js_结果);
printf(“%s\n”,*utf8);
}
[..]
我在v8环境中设置了setupJs()函数,callJs应该被多次调用(在工作时,javascript脚本每次将var a增加一个)

如果我把

Handle<Value> args[0];
Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
js_result->ToString();

String::Utf8Value utf8(js_result);
printf("%s\n", *utf8);
句柄参数[0];
Handle js_result=jsUpdateFunc->Call(jsGlobal,0,args);
js_result->ToString();
字符串::utf8值utf8(js_结果);
printf(“%s\n”,*utf8);
在setupJs中,我可以看到函数s的调用和“1”的打印方式。但是,如果我在函数调用中保留了一个不同的函数以供以后调用,那么在
Handle js_result=jsUpdateFunc->call(jsGlobal,0,args)行中会有一个Segfault


我已经检查过了,jsUpdateFunc和jsGlobal都不是空指针

您需要为
jsGlobal
jsUpdateFunc
使用持久句柄。当正常(本地)句柄的封闭
v8::HandleScope
被销毁时,该句柄将无效

您还需要一个全局变量用于
v8::Isolate
指针,另一个用于
v8::Context
的持久句柄

要稍后调用脚本函数,您需要:

  • 锁定隔离(您也应该在
    setupJs
    中执行此操作;请参阅
    v8::Locker
  • 输入隔离(请参见
    v8::isolate::Scope
  • 建立句柄作用域(请参见
    v8::HandleScope
  • 为上下文创建本地句柄
  • 输入上下文(请参见
    v8::context::Scope
  • jsGlobal
    jsUpdateFunc
    创建本地句柄
  • 如上所述调用脚本函数
  • 在v8头文件中查找
    v8::Persistent
    和相关模板