V8中C++与JS交互

一、暴露C++函数接口供JavaScript脚本调用:##

流程如下:
  Isolate代表一个运行实例,可以理解为类似于一个虚拟机,同一时刻只能被一个线程运行,但是Isolate可以有多个。从Isolate实例获取到全局的对象模板,然后把需要给JavaScript调用的接口注册到isolate中, 那么在这个实例运行上下文环境就可以识别到这个被注册的C++拓展接口。
  假设有如下C++接口:

void Print(const v8::FunctionCallbackInfo<v8::Value>& args) {  
  bool first = true;  
  for (int i = 0; i < args.Length(); i++) {  
    v8::HandleScope handle_scope(args.GetIsolate());  
    if (first) {  
      first = false;  
    } else {  
      printf(" ");  
    }  
    v8::String::Utf8Value str(args[i]);  
    const char* cstr = ToCString(str);  
    printf("%s", cstr);  
    const char* s_result = "print call succeed\n";  
    v8::Local<v8::String>  v_result = v8::String::NewFromUtf8(args.GetIsolate(), s_result,  
        v8::NewStringType::kNormal).ToLocalChecked();  
    args.GetReturnValue().Set(v_result);  
  }  
  printf("\n");  
  fflush(stdout);  
}  

在使用V8引擎的过程中,初始化环境,生成Isolate *isolate实例之后,获取上下文环境context之前加入如下代码:

v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);  
  // Bind the global 'print' function to the C++ Print callback.  
  global->Set(  
      v8::String::NewFromUtf8(isolate, "print", v8::NewStringType::kNormal)  
          .ToLocalChecked(),  
      v8::FunctionTemplate::New(isolate, Print));  

然后从该Isolate获取执行环境上下文:

Local<Context> context = v8::Context::New(isolate, NULL, global);

之后在JS中调用print函数的时候,C++接口的print函数就会被调用。

    原文作者:雲凌禹
    原文地址: https://www.jianshu.com/p/73903e25efef
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞