V8 C ++嵌入问题

时间:2014-03-06 22:43:35

标签: c++ v8 embedded-v8

我是V8嵌入的新手,刚刚开始用V8库替换我当前的脚本语言。但是我遇到了一些非常奇怪的问题(至少对我而言)。有点像我是唯一一个做我正在做的事情的人,我觉得我做的事情很愚蠢。

我已经创建了一个包装类来包装V8引擎函数,并在构造我的包装器时构造引擎(尝试忽略糟糕的变量名称或愚蠢的样式):

engine.h:

namespace JSEngine {

class Engine
{
    public:
        Engine();
        virtual ~Engine();
        v8::Isolate* isolate;
        v8::Handle<v8::Context> context;
};
}

engine.cpp(包括engine.h):

JSEngine::Engine::Engine()
{   
    v8::Locker locker();
    V8::Initialize();

    this->isolate = Isolate::GetCurrent();
    HandleScope scope(this->isolate);

    this->context = Context::New(this->isolate);
}

这段代码很好,花花公子,但是一旦我尝试这个:

Server::jsEngine = new JSEngine::Engine();
HandleScope scope(Server::jsEngine->isolate);
Context::Scope context_scope(Server::jsEngine->context);

Handle<String> source = String::NewFromUtf8(Server::jsEngine->isolate, "'Hello' + ', World!'");
Handle<Script> script = Script::Compile(source);
Handle<Value> result = script->Run();

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

我在这一行得到了SEGMENTATION FAULT:Context::Scope context_scope(Server::jsEngine->context);

我不知道我做错了什么,或者这种做法是否是最佳做法。你能帮我解决一下SEGMENTATION FAULT错误吗?

1 个答案:

答案 0 :(得分:1)

您的上下文成员变量是本地句柄,在本地作用域中创建,并且只要您的Engine构造函数完成就会无效,因为作用域已删除。您需要一个持久句柄来处理您的上下文。更改您的引擎声明以使用

v8::Persistent<v8::Context> context;

当您实际创建上下文时,请使用

this->context.Reset(this->isolate, Context::New(this->isolate));

在您的析构函数中,使用

this->context.Reset();