我還沒有實踐成功,只是單純記錄下
參考文檔:
https://github.com/oceanlantern/chrome-blink
https://www.chromium.org/developers/web-idl-interfaces/
https://www.chromium.org/blink/webidl/
在Chromium裏的Blink中添加API
我的目標導出js的接口使得可以在頁面通過js調用C++的一些方法完成任務
前言
關於導出C++接口方法
1 在extension api導出接口方便extension調用
2 在Blink內核中導出接口
我使用方法2完成導出,閱讀一下內容可能需要了解Web IDL,Blink GC,Chromium Task等方面的知識,相關的一些資料在最後給出
環境
chroumium版本 70.0.3538.513
過程
在C++中定義Example類,該類會執行一個耗時操作,完成後調用回調將結果返回
在js裏需要構造Example類,添加一個回調函數,然後調用將結果輸出
添加目錄
在third_party/blink/renderer/modules添加example目錄,idl及對應的C++的實現統一放在這個目錄
編寫IDL文件
1 WebIDL是一種接口描述規範,可以用來生成一些C++和js之間的轉換代碼
2 inishedCallback爲回調限制的類型,編譯時會自動生成一個C++對象V8FinishedCallback與之對應
3 [Constructor]表明該interface可以再js中使用new構造,該屬性可以有參數,對應的C++方法爲static Example* Create(),Example實例被blink GC管理不需要對應的delete
4 Example需要編寫blink::Example與之對應
1
|
callback FinishedCallback = void(DOMString msg);
|
編寫C++代碼
1 繼承ScriptWrappable類可以提供類型描述,並且該類繼承GarbageCollectedFinalized,所以Example是一個blink GC對象.類Example聲明的方法與idl是對應的,除了構造函數比較特別以外.
2 #include “third_party/blink/renderer/bindings/modules/v8/v8_finished_callback.h”這個文件是根據idl裏面callback自動生成的文件,編譯後纔會有.
3 不要再別的線程裏調用js註冊的回調函數
以上說明在代碼註釋裏面也有對應
example.h
1
|
#ifndef __EXAMPLE_H__
|
example.cc
1
|
#include "example.h"
|
編寫編譯文件
修改的地方比較雜,但是不難理解
1 在third_party/blink/renderer/modules/example裏添加以下文件來說明example模塊編譯的規則
BUILD.gn
1
|
|
2 在third_party\blink\renderer\modules\BUILD.gn文件的deps變量裏添加以下內容確保example模塊被編譯
1
|
"//third_party/blink/renderer/modules/example",
|
3 在third_party\blink\renderer\modules\modules_idl_files.gni文件的modules_idl_files裏的get_path_info傳入參數中添加以下內容確保idl文件被編譯
1
|
"example/example.idl",
|
4 在third_party\blink\renderer\bindings\modules\v8\generated.gni文件的generated_modules_callback_function_files變量裏添加以下內容確保idl生成的C++文件被編譯
1
|
"$bindings_modules_v8_output_dir/v8_finished_callback.cc",
|
驗證
chromium編譯成功後在console輸入以下語句成功後會在10秒後彈出消息
1
|
example = new Example()
|
參考資料
https://heycam.github.io/webidl/#idl-types
https://www.chromium.org/developers/web-idl-interfaces
https://www.chromium.org/blink/webidl#TOC-Style