CEF3開發者系列之JS與C++交互之一


JS與Native交互是相對於比較困難的技術,在學習這門技術之前,我們先了解下瀏覽器內核中的JS引擎與chromium內核的V8引擎相關知識。在瀏覽器應用中,JS與本地代碼互相調用,得益於瀏覽器內核對JS的支持。每一個瀏覽器內核都有JS引擎,當我們在瀏覽器上操作時,瀏覽器把偵聽到的事件進行分發,如果與JS相關,瀏覽器事件觸發線程會為我們把指定的事件處理程序添加到js引擎當中。各大瀏覽器的JS引擎如下:

主要的網頁瀏覽器JavaScript引擎:

1) Mozilla

  • SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications時編寫,用於Mozilla Firefox 1.0~3.0版本。
  • JägerMonkey,(JägerMonkey,也有人拼寫成JagerMonkey)德文Jäger原意為獵人,結合追蹤 和組合碼技術大幅提高效能,部分技術借鑒了V8、JavaScriptCore,用於Mozilla Firefox 4.0以上版本。

2)Google

  • V8,開放源代碼,由Google丹麥開發,是Google Chrome的一部分。

3)微軟

  • Chakra,中文譯名為查克拉,用於Internet Explorer 9。
  • JScript 是由微軟公司開發的活動腳本語言,是微軟對ECMAScript規范的實現.IE 3.0-IE8.0使用的JS引擎

4)其它

  •  KJS,KDE的 ECMAScript/JavaScript引擎,最初由Harri Porten開發,用於KDE項目的

     JavaScript本身是一個解釋性腳本語言,其在本地執行需要解釋器進行處理。一般的JS解釋器就是將源代碼轉變成抽象語法樹,然后將抽象語法樹轉成中間表示(也就是字節碼),然后通過JIT技術轉成本地代碼。

所以一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM