如何从普通的旧c ++函数调用javascript(node.js)函数?

时间:2019-06-03 03:06:49

标签: javascript c++ c callback v8

我现在正在努力将C ++库(zserge / webview)与V8集成。该库旨在在我在Webview上运行某些javascript代码时调用C函数。

例如:

当您在下面运行此代码时(在zserge / webview创建的webview实例内部)

window.external.invoke('hello world');

然后,执行C函数。

void my_cb(struct webview *w, const char *arg){
   ...
}

正如我所说,我现在将其与V8集成在一起,因此我希望此函数“ my_cb”调用存储在变量中的javascript函数。

我将函数名称命名为“ SetCallback”,如下所示,并公开给节点,

void SetCallback(const FunctionCallbackInfo<v8::Value> & args){
Environment *env = Environment::GetCurrent(args);
Isolate *isolate = env->isolate();

auto cb = v8::Local<v8::Function>::Cast(args[0]);

//g_callback is defined like this-> v8::Persistent<v8::Function> g_callback;
g_callback = v8::Persistent<v8::Function>::New(cb);

}

我认为,如果在my_cb中插入一些代码,则可以调用存储在g_callback中的函数。

所以我的编码如下,

void my_cb(struct webview *w, const char *arg){
Isolate *isolate = Isolate::GetCurrent();
v8::HandleScope handle_scope(isolate);

v8::Local<v8::Function> cb = v8::Local<v8::Function>::New(isolate, g_callback);

v8::Local<v8::Value> argv[] = {};

cb->Call(isolate->GetCurrentContext()->Global(), 0, argv);
}

但是此代码不起作用。我认为my_cb在v8实例外部是不安全的,因为它不属于v8实例。但是,我不知道该如何解决。

先谢谢您。请帮我解决这个问题。

0 个答案:

没有答案