V 8におけるC++とJSとのインタラクション

1724 ワード

一、JavaScriptスクリプト呼び出しのためにC++関数インタフェースを暴露する:##
プロセスは次のとおりです.Isolateは実行インスタンスを表し、同じ時点で1つのスレッドでしか実行できない仮想マシンと同様に理解できますが、Isolateは複数あります.Isolateインスタンスからグローバルなオブジェクトテンプレートを取得し、JavaScript呼び出しが必要なインタフェースをisolateに登録すると、このインスタンス実行コンテキスト環境でこの登録されたC++拡張インタフェースが認識されます.次のC++インタフェースがあるとします.
void Print(const v8::FunctionCallbackInfo<: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
"; v8::Local<:string> v_result = v8::String::NewFromUtf8(args.GetIsolate(), s_result, v8::NewStringType::kNormal).ToLocalChecked(); args.GetReturnValue().Set(v_result); } printf("
"); fflush(stdout); }

V 8エンジンの使用中に環境を初期化し、Isolate*isolateインスタンスを生成した後、コンテキスト環境contextを取得する前に次のコードを追加します.
v8::Local<: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 = v8::Context::New(isolate, NULL, global);

その後JSでprint関数を呼び出すとC++インタフェースのprint関数が呼び出されます.