轉載:https://www.cnblogs.com/guolixiucai/category/732385.htmlhtml
JS與Native交互是相對於比較困難的技術,在學習這門技術以前,咱們先了解下瀏覽器內核中的JS引擎與chromium內核的V8引擎相關知識。在瀏覽器應用中,JS與本地代碼互相調用,得益於瀏覽器內核對JS的支持。每個瀏覽器內核都有JS引擎,當咱們在瀏覽器上操做時,瀏覽器把偵聽到的事件進行分發,若是與JS相關,瀏覽器事件觸發線程會爲咱們把指定的事件處理程序添加到js引擎當中。各大瀏覽器的JS引擎以下:git
主要的網頁瀏覽器JavaScript引擎:github
1) Mozillachrome
2)Google瀏覽器
3)微軟安全
4)其它數據結構
JavaScript自己是一個解釋性腳本語言,其在本地執行須要解釋器進行處理。通常的JS解釋器就是將源代碼轉變成抽象語法樹,而後將抽象語法樹轉成中間表示(也就是字節碼),而後經過JIT技術轉成本地代碼。ide
因此一個JavaScript引擎不外乎包括如下部分:函數
第一,編譯器。主要工做是將源代碼編譯成抽象語法樹,而後在某些引擎中還包含將抽象語法樹轉換成字節碼。工具
第二,解釋器。在某些引擎中,解釋器主要是接受字節碼,解釋執行這個字節碼,而後也依賴來及回收機制等。
第三,JIT工具。一個可以可以JIT的工具,將字節碼或者抽象語法樹轉換成本地代碼,固然它也須要依賴牢記
第四,垃圾回收器和分析工具(profiler)。它們負責垃圾回收和收集引擎中的信息,幫助改善引擎的性能和功效。
CEF3是基於chromium內核,其所使用的JS引擎是V8。谷歌爲了性能,直接省去了轉換字節碼這一步,它甚至採用直接將JavaScript編譯成本地代碼的方式。v8 API不只提供了編譯和運行JavaScript代碼的功能,還提供了其餘與C++交互的功能,包括函數和數據結構的註冊,錯誤處理,安全檢查等。C++應用程序能夠將v8看成一個普通類庫使用,只需引用v8.h便可。
v8的上下文(Context)是獨立的JavaScript執行環境,經過使用上下文容許JavaScript應用程序跑在不一樣的v8實例上。執行一段JavaScript代碼必須顯示指定上下文。這是由於JavaScript提供了一系列內置輔助函數和全局對象,它們能夠被JavaScript代碼調用和修改。若是兩段不相關的JavaScript代碼同時修改全局對象,可能會致使用戶不但願看到的結果。根據v8的規範,執行JavaScript函數必須在Context以內,因此調用ExecuteFunction的前咱們必須進入Context,執行完畢後必須退出Context。 這個功能是由CefV8Context提供的,最重要的成員有Enter、Exist、Eval等。
下邊兩篇我將分別介紹CEF3和Trident內核應用中,JS與本地C++如何進行交互。其中CEF3中JS與C++交互主要是翻譯一篇CEF3的wiki。
參考資料:
理解WebKit和Chromium: JavaScript引擎簡介
http://blog.csdn.net/milado_nju/article/details/22101681
Chromium/content v8::Extension
https://github.com/fanfeilong/cefutil/blob/master/doc/content_register_v8_extension.md