0

我刚开始使用JavaScript V8并从Embedder's Guide编译了一个基本示例。现在我想将 C++ 函数绑定到 JavaScript 上下文。

现在我只有一个或多或少的空白类,稍后应该处理绑定。

class Manager
{
public:
    Manager()
    {
        context = Context::New();
    }
    void Bind(string Name, function<Handle<Value>(const Arguments&)> Function)
    {
        // bind the function to the given context
    }
private:
    Persistent<Context> context;
};

如何将std::function对象绑定到 JavaScript V8 上下文?

4

2 回答 2

3

我在我的引擎中使用的是一种相当复杂的方法,但我是第一个想到的。(遗憾的是,我从 V8 迁移到 LLVM,因此我没有对此进行优化。)

void ExposeFunctions(v8::Handle<v8::ObjectTemplate> engine) {
    /* ... */
    engine->Set(v8::String::New("Exit"), v8::FunctionTemplate::New(NativeExit));
    engine->Set(v8::String::New("Log"), v8::FunctionTemplate::New(NativeLog));
    /* ... */
}

int SpawnEngine() {
    v8::Locker locker;
    v8::HandleScope handleScope;
    v8::TryCatch exceptionManager;
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
    ExposeFunctions(global);
    v8::Persistent<v8::Context> context = v8::Context::New(nullptr, global);
    v8::Context::Scope scope(context);
    /* ... */
    context.Dispose();
    return 0;
}

这至少应该为您提供一个可能的解决方案,将本机函数绑定到解释器,您可以根据需要对其进行重新设计。

考虑到您使用函数对象的问题,可以尝试(只是在这里猜测)直接传递它,就像我对命名函数所做的那样,或者将它嵌套在传递给v8::FunctionTemplate::New. 但是自从我使用它以来已经有一段时间了。

于 2013-03-31T20:24:11.220 回答
0

InvocationCallback函数请求的参数类型Set是一个简单的typedef。

typedef Handle<Value> (*InvocationCallback)(Arguments const &);

因此我不得不将其转换std::function为原始函数指针。

void Register(string Name, function<Handle<Value>(Arguments const &)> Function)
{
    InvocationCallback* function = Function.target<InvocationCallback>();
    globals->Set(String::New(Name.c_str()), FunctionTemplate::New(*function));
}
于 2013-03-31T20:39:23.150 回答