我现在正在努力将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实例。但是,我不知道该如何解决。
先谢谢您。请帮我解决这个问题。