c++作用域和Google V8脚本上下文
C++ scope and Google V8 script context
我用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("%sn", *utf8);
}
[..]
我有函数setupJs()设置v8环境和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("%sn", *utf8);
在setupJs中,我可以看到函数是如何被调用和"1"被打印出来的。但是,如果我在稍后调用的不同函数中离开函数调用,则在Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
我已经检查过了,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
和相关模板
相关文章:
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 如何通过cpp程序运行shell脚本
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 在程序中编写脚本来编写和编译代码
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何在c++中使用system()来运行包含空格的python脚本
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 在cygwin中运行c++脚本时发生错误
- 如何将真正的字符串从python c-api转换为python脚本
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 在原子中使用犰狳与脚本
- 我适合在我的构建系统中使用 shell 脚本而不是AX_CHECK_COMPILE_FLAG吗?
- CANoe - 无法在 CAPL 脚本中打开.dll
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- c++作用域和Google V8脚本上下文