脈脈上的一些回答:
- 根本上來說是一種通信協(xié)議,通過最基本的數(shù)據(jù)類型映射到內(nèi)存地址短条。
- 簡單理解是大家都可以和 c++ 互調(diào)叶堆,用c++ 中轉(zhuǎn)干旧。給 window 中提供一個(gè)可操作對(duì)象,這個(gè)對(duì)象直接調(diào)用 c++ 層對(duì)象涕俗,c++ 層這個(gè)對(duì)象會(huì)和java層對(duì)象綁定罗丰,java 到 c++ 就是一個(gè)執(zhí)行注冊(cè)表。
- 互調(diào)方式不太相同再姑,一種實(shí)現(xiàn)方式舉例萌抵,安卓在初始化 webview 的時(shí)候可以向js 掛載方法和數(shù)據(jù)對(duì)象,屬于 BOM,和 alert 之類的方法一樣绍填,瀏覽器執(zhí)行棧執(zhí)行對(duì)應(yīng)方法時(shí)運(yùn)行瀏覽器 native code 方法霎桅。(BOM 瀏覽器對(duì)象模型,提供與瀏覽器交互的方法和接口讨永。)安卓調(diào)前端是因?yàn)榘沧坑性L問 js context 的能力滔驶,類似于在全局中
eval
一串js代碼字符串。
- webview 提供了js runtime卿闹,客戶端理論上可以在js runtime中掛載任意對(duì)象揭糕,前端調(diào)用掛載的對(duì)象,瀏覽器執(zhí)行棧執(zhí)行對(duì)應(yīng)方法時(shí)運(yùn)行客戶端 native 方法锻霎,經(jīng)js 引擎調(diào)到客戶端代碼著角。
- JNI Java Native Interface,是 java 提供的一個(gè)特性量窘,使得 C/C++ 等語言編寫的代碼可以運(yùn)行于 java虛擬機(jī) jvm 中的 java 代碼集成雇寇,如java中使用 以 C/C++ 等native 語言編寫的程序庫,JNI 能夠滿足在java代碼中訪問native模塊的需求蚌铜。framework層的webview實(shí)際上是jni調(diào)用chromium的代碼锨侯,chromium代碼是c++,解析完js冬殃,發(fā)現(xiàn)符合規(guī)范囚痴,直接調(diào)用上層的js bridge 的方法。
- 調(diào)用底層 jni 函數(shù)由 v8 內(nèi)核實(shí)現(xiàn)的审葬,最終在 c 層完成轉(zhuǎn)換深滚,到 c 層完成到 java 的轉(zhuǎn)換。
- 可以看看 chromium 項(xiàng)目頭文件涣觉,都是可以調(diào)用的痴荐,也可以給 web 注入 native 對(duì)象,js 調(diào)方法時(shí)會(huì)傳給 native proxy
- 其他的版本官册,客戶端調(diào)用 h5 接口生兆,需要支持當(dāng)前平臺(tái)的橋接代碼 + 需要調(diào)用的通用接口代碼,當(dāng)一個(gè)版本的客戶端調(diào)用 jsapi 時(shí)膝宁,輸入接口代碼鸦难,后臺(tái)會(huì)根據(jù) rpc 或者 http 請(qǐng)求來的 ua 匹配對(duì)應(yīng)的橋接代碼。接口代碼 + 橋接代碼可以正常實(shí)現(xiàn)功能员淫,早期沒有 jsbridge 的時(shí)候需要程序員根據(jù)終端版本選擇橋接代碼合蔽,現(xiàn)在只需要接口代碼。
Android在js上下文注入一個(gè)JavascriptInterface
介返,假設(shè)名為AndroidInterface
拴事,在前端可以直接以AndroidInterface.funName
的形式調(diào)用沃斤。
Android 通過 loadUrl
直接加載頁面鏈接
webview.loadUrl('https://www.google.com.hk/')
Android 通過loadUrl
執(zhí)行js的方法
webview.loadUrl('javascript: WebSpace.funName()')
url scheme是一種 url 形式,web端通過隱藏的iframe
加載src
挤聘,Android 通過 shouldOverrideUrlLoading
攔截Scheme
轰枝,返回false
,webview
處理鏈接url
组去,返回true
鞍陨,webview
依據(jù)程序執(zhí)行url
。
基本原理就是:H5 -> 觸發(fā)一個(gè)url(每一個(gè)功能代表的url都不同)-> Native端捕獲到url -> Native端分析屬于哪一個(gè)功能并執(zhí)行 -> Native端調(diào)用H5中的方法將執(zhí)行結(jié)果回調(diào)給H5