一、暴露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函数就会被调用。