我需要在我的C代码中使用V8执行Javascript。我的C应用程序访问Web服务器链接并获取html数据,图像和javascript。例如,我有2个JavaScript,分别是js1.js和js2.js,如下所示。
function js_add_elements(var1, var2)
{
var var3 = parseInt(var1) + parseInt(var2);
var result = 'Addition of ' + var1 + ' and ' + var2 + ' results ' + var3;
return result;
}
js_add_elements(2, 3);
通常,我们在V8中只需很少的对象即可运行javascript。我在全局数据结构中保留了一些上下文,我称之为实例。
Instance level contexts
std::unique_ptr<v8::Platform> platform;
v8::Isolate::CreateParams create_params;
v8::Isolate *isolate;
v8::Isolate::Scope *isolate_scope;
并且我在下面的函数中保留了一些本地成员上下文。
Local contexts in a function
v8::HandleScope handle_scope;
v8::Local<v8::Context> context;
v8::Context::Scope context_scope;
v8::Local<v8::String> source;
v8::Local<v8::Script> script;
保持上下文不变,我可以运行js1.js和js2.js并获得期望的结果。说一段时间后,我从服务器获取js3.js,文件外观如下。
js_add_elements(5, 6);
js_add_elements(7, 8);
现在问题开始了。我将尝试执行js3.js。到此时,本地功能中声明的上下文将被删除(由垃圾回收器删除)。当我尝试执行js3.js时,上下文将被重新分配并且没有js1.js,因此结果为 undefined 。
我希望应该有一些方法可以使上下文在一定时间内保持活动状态。我只是不明白。
有人可以帮忙学习如何在特定时间之前保持上下文(例如会话的生命周期)。
答案 0 :(得分:1)
与您存储v8::Isolate
的位置相邻,您应该能够将上下文存储在v8::Global
中(也就是v8::Global<v8::Context>
)。
有关示例,请参见以下Chromium代码。