V8中C++與JS交互

一、暴露C++函數(shù)接口供JavaScript腳本調(diào)用:##

流程如下:
  Isolate代表一個(gè)運(yùn)行實(shí)例,可以理解為類似于一個(gè)虛擬機(jī),同一時(shí)刻只能被一個(gè)線程運(yùn)行,但是Isolate可以有多個(gè)。從Isolate實(shí)例獲取到全局的對象模板,然后把需要給JavaScript調(diào)用的接口注冊到isolate中, 那么在這個(gè)實(shí)例運(yùn)行上下文環(huán)境就可以識別到這個(gè)被注冊的C++拓展接口。
  假設(shè)有如下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引擎的過程中,初始化環(huán)境,生成Isolate *isolate實(shí)例之后,獲取上下文環(huán)境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獲取執(zhí)行環(huán)境上下文:

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

之后在JS中調(diào)用print函數(shù)的時(shí)候,C++接口的print函數(shù)就會(huì)被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,510評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,874評論 1 10
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,358評論 0 6
  • 判斷字符串是否含有中文 計(jì)算字符串長度方法一 方法二 iOS 獲取漢字的拼音 1. 不可變字符串 NSStir...
    TenMios閱讀 1,107評論 0 0