版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十一章第十一章 Android瀏覽器擴(kuò)展瀏覽器擴(kuò)展Netscape Plugin Application Programming Interface是一個(gè)被許多瀏覽器遵循和采用的跨平臺(tái)的插件框架。 NPAPI的接口分為兩組,瀏覽器側(cè)的 NPN 接口和插件側(cè)的 NPP 接口:NPN 接口是瀏覽器側(cè)實(shí)現(xiàn),供插件調(diào)用的一系列功能接口;NPP 接口是插件側(cè)實(shí)現(xiàn),供瀏覽器獲取信息或進(jìn)行控制操作的接口。瀏覽器插件的核心,就是一個(gè)實(shí)現(xiàn)了 NPP 接口,并使用瀏覽器提供的 NPN APIs 進(jìn)行對(duì)外操作的動(dòng)態(tài)庫(kù)??紤]到 Android 系統(tǒng)在架構(gòu)上的特殊性,Google 的工程師對(duì) Android 瀏覽器的
2、 NPAPI接口作了一些修改,添加了一個(gè) Android 瀏覽器插件特有的結(jié)構(gòu):插件的 Java 層。這樣,瀏覽器插件就可以作為一個(gè)Android應(yīng)用,通過常規(guī)途徑安裝到Android設(shè)備中。(Android的所有應(yīng)用都必須通過Java 部分實(shí)現(xiàn)安裝)Android的源碼目錄下提供了Plugin的范例: development/samples/BrowserPlugin;通過這個(gè)版本的例子編譯生成的是完整的apk安裝包,可以在模擬器或者真機(jī)上安裝測(cè)試。jni目錄是插件的主體,Native C/C+寫的Shared Library,負(fù)責(zé)NPAPI中NPP側(cè)的實(shí)現(xiàn)。下有5種子插件目錄(animat
3、ion,audio,background,form,paint), Android.mk文件(Make文件) ,hello-jni.cpp文件 (注冊(cè)java本地接口,hello-world函數(shù),測(cè)試用),jni-bridge.cpp文件(注冊(cè)java本地接口,注冊(cè)的函數(shù)在SamplePluginStub.java中調(diào)用) ,main.cpp文件(實(shí)現(xiàn)NPP接口) ,main.h文件(定義 NPP接口變量) ,PluginObject.cpp文件(插件的基類),PluginObject.h文件 。res目錄,和一般的android工程一樣,存放資源的目錄。src目錄下有實(shí)現(xiàn)了一個(gè)android
4、的service類(其他大部分插件是實(shí)現(xiàn)activity類),并為插件提供繪制接口;有SamplePluginStub.java、SamplePlugin.java: 實(shí)現(xiàn)服務(wù)接口、Cube.java、CubeRenderer.java文件。AndroidManifest.xml,同樣是每個(gè)android的工程都會(huì)有文件,包含了apk的注冊(cè)信息,就在這里實(shí)現(xiàn)plugin的注冊(cè)。Android.mk,編譯配置文件。NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn, ch
5、ar* argv, NPSavedData* saved);新建一個(gè)實(shí)例,瀏覽器每創(chuàng)建一個(gè)plugin的實(shí)例就會(huì)調(diào)用一次這個(gè)函數(shù)。在這里主要就是根據(jù)傳進(jìn)的參數(shù)列表進(jìn)行實(shí)例的初始化,建立新的Plugin對(duì)象,并通過NPN_SetValue告知瀏覽器plugin對(duì)象的一些特性,其中包括了plugin對(duì)象能處理的事件(觸控事件和按鍵事件),以及plugin的渲染模式(bitmap模式或surface模式)。NPError NPP_Destroy(NPP instance, NPSavedData* save);當(dāng)瀏覽器需要銷毀一個(gè)plugin實(shí)例的時(shí)候調(diào)用,要在這里完成對(duì)應(yīng)實(shí)例的資源釋放。NPErr
6、or NPP_SetWindow(NPP instance, NPWindow* window);瀏覽器通過該函數(shù)告知plugin對(duì)象其窗口參數(shù),主要就是的plugin對(duì)象所占畫面的大小。NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype);如果需要向plugin傳輸一些流數(shù)據(jù),瀏覽器會(huì)通過此函數(shù)告知plugin即將要傳輸?shù)牧?,在參?shù)NPStream* stream中包含了流的url,以后需要對(duì)根據(jù)此url對(duì)NPP_Write傳入的數(shù)據(jù)進(jìn)行區(qū)分
7、。NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);如果數(shù)據(jù)流傳輸結(jié)束或意外終止了,瀏覽器會(huì)調(diào)用此函數(shù)告知plugin注銷這一數(shù)據(jù)流,可以通過NPReason reason判斷數(shù)據(jù)流是否為正常結(jié)束。int32 NPP_WriteReady(NPP instance, NPStream* stream);瀏覽器在給plugin對(duì)象傳輸流數(shù)據(jù)前,會(huì)先調(diào)用這一函數(shù)詢問plugin能接收的數(shù)據(jù)長(zhǎng)度。int32 NPP_Write(NPP instance, NPStream* stream, int32
8、 offset, int32 len,void* buffer);流數(shù)據(jù)的傳輸,根據(jù) NPStream* stream里的url可以判斷是哪個(gè)數(shù)據(jù)流,int32_t offset為void* buffer這段數(shù)據(jù)在數(shù)據(jù)流中的偏移量,int32_t len為void* buffer的長(zhǎng)度,返回值是plugin對(duì)象實(shí)際接收的數(shù)據(jù)大小。void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);如果瀏覽器要傳輸?shù)氖潜镜匚募?,則會(huì)選擇調(diào)用這個(gè)參數(shù)通知plugin流的信息。void NPP_Print(NPP ins
9、tance, NPPrint* platformPrint);根據(jù)NPAPI的定義,瀏覽器會(huì)通過這個(gè)函數(shù)通知plugin進(jìn)行輸出操作。int16 NPP_HandleEvent(NPP instance, void* event);事件處理函數(shù),在這里plugin要完成各種事件的處理,包括繪制、按鍵、鼠標(biāo)、觸控等等,事件的參數(shù)都包裝在void* event里,可以參照external/webkit/WebKit/android/plugins/android_npapi.h中ANPEvent結(jié)構(gòu)體的定義。void NPP_URLNotify(NPP instance, const char*
10、URL, NPReason reason, void* notifyData);如果plugin調(diào)用了NPN_GetURLNotify或者NPN_PostURLNotify,在瀏覽器側(cè)的操作完成了以后,就會(huì)調(diào)用這個(gè)函數(shù)返回一些信息。NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);瀏覽器通過此函數(shù)獲取plugin對(duì)象的一些參數(shù),需要根據(jù)NPPVariable variable進(jìn)行不同的處理,NPPVariable的定義可以參照external/webkit/Webcore/bridge/npapi.h和e
11、xternal/webkit/WebKit/android/plugins/android_npapi.h。NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);瀏覽器通過此函數(shù)設(shè)置plugin對(duì)象的一些參數(shù),和NPP_GetValue一樣,需要根據(jù)NPPVariable variable進(jìn)行不同的處理,NPPVariable的定義可以參照external/webkit/
12、Webcore/bridge/npapi.h和external/webkit/WebKit/android/plugins/android_npapi.h。為了彌補(bǔ)NPAPI在Android上的不足,Google在Android的瀏覽器上實(shí)現(xiàn)了ANPInterface這么一個(gè)東西。就是一系列的操作接口(函數(shù)),提供了一些NPAPI沒有的東西。插件可以在初始化的時(shí)候獲取這些ANPXXXInterface,并在運(yùn)行過程中使用。其實(shí)ANPInterface提供的接口,大多來(lái)自webkit的一些底層庫(kù)(external/webkit/WebKit/android/plugins)BrowserPlug
13、in中的ANPInterface列表如下:ANPAudioTrackInterfaceV0 gSoundI;ANPBitmapInterfaceV0 gBitmapI;ANPCanvasInterfaceV0 gCanvasI;ANPLogInterfaceV0 gLogI;ANPPaintInterfaceV0 gPaintI;ANPPathInterfaceV0 gPathI;ANPSurfaceInterfaceV0 gSurfaceI;ANPSystemInterfaceV0 gSystemI;ANPTypefaceInterfaceV0 gTypefaceI;ANPWindowInt
14、erfaceV0 gWindowI;Plugin初始化函數(shù),瀏覽器會(huì)通過參數(shù)傳進(jìn)一個(gè)瀏覽器側(cè)的NPAPI函數(shù)列表(NPN函數(shù)列表),plugin需要在這里實(shí)現(xiàn)全局參數(shù)的初始化,并返回plugin側(cè)的NPAPI函數(shù)列表(NPP函數(shù)列表)。Android的Plugin可以通過NPN_GetValue獲取瀏覽器參數(shù)以及Android提供的各種操作接口(ANP Inerface),Android提供的操作接口可以查看源代碼的這一部分:external/webkit/WebKit/android/plugins。Android的NP_Initialize還提供了上層的java運(yùn)行環(huán)境,可用于實(shí)現(xiàn)與jav
15、a側(cè)的交互。關(guān)閉Plugin,瀏覽器在銷毀了所有plugin實(shí)例以后就會(huì)調(diào)用這個(gè)函數(shù),可以在這里釋放一些全局的資源。修改jni/main.cpp文件之后編譯(主要是增加LOGCAT調(diào)試信息),以方便后面分析插件加載流程。進(jìn)入源碼根目錄下運(yùn)行make SampleBrowserPlugin運(yùn)行 “adb install apk_file” ,把編譯好的插件apk安裝到設(shè)備或模擬器中安裝成功后,你可以通過“Settings - Applications - Manage applications”管理插件用包含以下內(nèi)容的HTML頁(yè)面測(cè)試瀏覽器插件 用瀏覽器打開測(cè)試網(wǎng)頁(yè),將會(huì)打印類似以下log:D/
16、plugin ( 366): * NP_Initialize *D/plugin ( 366): * 0 x420f18 START NPP_New *D/plugin ( 366): - 0 x420f18 DrawingModel is 1D/plugin ( 366): Application data dir is /data/data/com.android.browser/app_pluginsE/plugin ( 366): - 0 x420f18 Testing Log ErrorW/plugin ( 366): - 0 x420f18 Testing Log WarningD
17、/plugin ( 366): - 0 x420f18 Testing Log DebugD/plugin ( 366): pixel format 0 unknown has no packingD/plugin ( 366): pixel format 1 8888 has packing ARGB 24 8 0 8 8 8 16 8D/plugin ( 366): pixel format 2 565 has packing ARGB 0 0 11 5 5 6 0 5D/plugin ( 366): - 0 x420f18 Testing DOM AccessD/plugin ( 366
18、): - 0 x420f18 Testing JavaScript AccessE/plugin ( 366): - 0 x420f18 Invalid Variant type for JS Return: 4,3D/plugin ( 366): - 0 x420f18 PluginType is 3D/plugin ( 366): * 0 x420f18 END NPP_New *D/plugin ( 366): * 0 x312a10 START NPP_New *D/plugin ( 366): - 0 x312a10 DrawingModel is 1D/plugin ( 366):
19、 Application data dir is /data/data/com.android.browser/app_pluginsD/plugin ( 366): - 0 x312a10 PluginType is 6D/plugin ( 366): * 0 x312a10 END NPP_New *D/plugin ( 366): * 0 x420f18 NPP_SetWindow *D/dalvikvm( 366): Trying to load lib /data/data/com.android.sampleplugin/lib/libsampleplugin.so 0 x43c2
20、e448D/dalvikvm( 366): Added shared lib /data/data/com.android.sampleplugin/lib/libsampleplugin.so 0 x43c2e448D/plugin ( 366): * 0 x312a10 NPP_SetWindow *D/plugin ( 366): - repeat timer 5D/plugin ( 366): - latency test: 1937207155 interval 421 expected 50, total 421 expected -1923890058, drift 192389
21、0479 avg 0D/plugin ( 366): - oneshot timerD/plugin ( 366): - repeat timer 4D/plugin ( 366): - latency test: 1937207156 interval 473 expected 50, total 894 expected -1923890008, drift 1923890902 avg 0E/plugin ( 366): -0 x312a10 Invalid Surface Dimensions (300,150):(120,60)D/plugin ( 366): - repeat ti
22、mer 3D/plugin ( 366): - latency test: 1937207157 interval 73 expected 50, total 967 expected -1923889958, drift 1923890925 avg 0D/plugin ( 366): - repeat timer 2D/plugin ( 366): - latency test: 1937207158 interval 130 expected 50, total 1097 expected -1923889908, drift 1923891005 avg 0D/plugin ( 366
23、): * 0 x420f18 NPP_HandleEvent *D/plugin ( 366): - 0 x420f18 the plugin received an onLoad eventD/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): - repeat timer 1D/plugin ( 366): - latency test: 1937207159 interval 90 expected 50, total 1187 expected -1923889858, drift 1923891045 avg 0D
24、/dalvikvm( 54): GC freed 8773 objects / 568952 bytes in 169msD/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): * 0 x420f18 NPP_HandleEvent *D/plugin ( 366): * 0 x420f18 NPP_HandleEvent *D/PowerMa
25、nagerService( 54): setPowerState: mPowerState=3 newState=7 noChangeLights=falseD/PowerManagerService( 54): oldKeyboardBright=false newKeyboardBright=falseD/PowerManagerService( 54): oldScreenBright=true newScreenBright=trueD/PowerManagerService( 54): oldButtonBright=false newButtonBright=trueD/PowerManagerService( 54): oldScreenOn=true newScreenOn=trueD/PowerManagerService( 54): oldBatteryLow=false newBatteryLow=falseW/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人住房維修基金擔(dān)保責(zé)任協(xié)議4篇
- 2025年金融機(jī)構(gòu)間協(xié)議存款風(fēng)險(xiǎn)管理合同3篇
- 二零二五版汽車分期付款及二手車交易及售后服務(wù)合同3篇
- 2025版學(xué)?;顒?dòng)中心租賃合同范本2篇
- 2025版出租車司機(jī)職業(yè)操守?fù)?dān)保合同2篇
- 2025版?zhèn)€人車輛抵押債權(quán)債務(wù)處理執(zhí)行條款4篇
- 2025年長(zhǎng)沙考貨運(yùn)從業(yè)資格證駕校
- 2025年綠色建筑項(xiàng)目施工連帶責(zé)任保證合同4篇
- 2025餐飲拆伙協(xié)議書退伙后品牌使用權(quán)及保密協(xié)議3篇
- 卸車事故緊急處理與賠償協(xié)議2025年度3篇
- 中華人民共和國(guó)保守國(guó)家秘密法實(shí)施條例培訓(xùn)課件
- 管道坡口技術(shù)培訓(xùn)
- 2024年全國(guó)統(tǒng)一高考英語(yǔ)試卷(新課標(biāo)Ⅰ卷)含答案
- 2024年認(rèn)證行業(yè)法律法規(guī)及認(rèn)證基礎(chǔ)知識(shí) CCAA年度確認(rèn) 試題與答案
- 皮膚儲(chǔ)存新技術(shù)及臨床應(yīng)用
- 外研版七年級(jí)英語(yǔ)上冊(cè)《閱讀理解》專項(xiàng)練習(xí)題(含答案)
- 2024年遼寧石化職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)必考題
- 上海市復(fù)旦大學(xué)附中2024屆高考沖刺模擬數(shù)學(xué)試題含解析
- 幼兒園公開課:大班健康《國(guó)王生病了》課件
- 小學(xué)六年級(jí)說明文閱讀題與答案大全
- 人教pep小學(xué)六年級(jí)上冊(cè)英語(yǔ)閱讀理解練習(xí)題大全含答案
評(píng)論
0/150
提交評(píng)論