Android瀏覽器外掛程式開發(三)——ANPInterface的介紹

來源:互聯網
上載者:User

 

今天講一下ANPInterface。

大概是為了彌補NPAPI在Android上的不足,Google在Android的瀏覽器上實現了ANPInterface這麼一個東西。說白了這玩意就是一系列的操作介面(函數),提供了一些NPAPI沒有的東西。外掛程式可以在初始化的時候擷取這些ANPXXXInterface,並在運行過程中使用。

關於這些介面的使用,大家可以看一看作為例子的BrowserPlugin是怎麼做的,

main.cpp中,聲明了一些ANPInterface的全域變數:

ANPAudioTrackInterfaceV0 gSoundI;<br />ANPBitmapInterfaceV0 gBitmapI;<br />ANPCanvasInterfaceV0 gCanvasI;<br />ANPEventInterfaceV0 gEventI;<br />ANPLogInterfaceV0 gLogI;<br />ANPPaintInterfaceV0 gPaintI;<br />ANPPathInterfaceV0 gPathI;<br />ANPSurfaceInterfaceV0 gSurfaceI;<br />ANPSystemInterfaceV0 gSystemI;<br />ANPTypefaceInterfaceV0 gTypefaceI;<br />ANPWindowInterfaceV0 gWindowI;

 

下面則是中NP_Initialize裡面的一段:

static const struct {<br /> NPNVariable v;<br /> uint32_t size;<br /> ANPInterface* i;<br /> } gPairs[] = {<br /> { kAudioTrackInterfaceV0_ANPGetValue, sizeof(gSoundI), &gSoundI },<br /> { kBitmapInterfaceV0_ANPGetValue, sizeof(gBitmapI), &gBitmapI },<br /> { kCanvasInterfaceV0_ANPGetValue, sizeof(gCanvasI), &gCanvasI },<br /> { kEventInterfaceV0_ANPGetValue, sizeof(gEventI), &gEventI },<br /> { kLogInterfaceV0_ANPGetValue, sizeof(gLogI), &gLogI },<br /> { kPaintInterfaceV0_ANPGetValue, sizeof(gPaintI), &gPaintI },<br /> { kPathInterfaceV0_ANPGetValue, sizeof(gPathI), &gPathI },<br /> { kSurfaceInterfaceV0_ANPGetValue, sizeof(gSurfaceI), &gSurfaceI },<br /> { kSystemInterfaceV0_ANPGetValue, sizeof(gSystemI), &gSystemI },<br /> { kTypefaceInterfaceV0_ANPGetValue, sizeof(gTypefaceI), &gTypefaceI },<br /> { kWindowInterfaceV0_ANPGetValue, sizeof(gWindowI), &gWindowI },<br /> };<br /> for (size_t i = 0; i < ARRAY_COUNT(gPairs); i++) {<br /> gPairs[i].i->inSize = gPairs[i].size;<br /> NPError err = browser->getvalue(NULL, gPairs[i].v, gPairs[i].i);<br /> if (err) {<br /> return err;<br /> }<br /> }

 

該段的目的就是通過瀏覽器NPN介面裡面的getvalue擷取一系列ANPInterface。由於定義為了全域變數,所以這些介面可以在隨時隨地使用,就像這樣:

gLogI.log(kDebug_ANPLogType, "------ %p DrawingModel is %d", instance, model);

 

 

下面就我所知道的情況說說這些介面都提供了哪些操作。
ANPAudioTrackInterface      這是一套音頻介面,提供了播放音軌的功能
ANPBitmapInterface          只有一個函數getPixelPacking,依照給定的格式設定PixelPacking的參數值
ANPCanvasInterface          提供了一系列ANPCanvas繪圖操作,其實就是把skia的Skcanvas相關介面作了一個封裝
ANPEventInterface           提供了一個postEvent函數,外掛程式可以用來向自己發送自訂的訊息(ANPEvent)。
ANPLogInterface             提供了logcat的輸出
ANPPaintInterface           封裝了skia的SkPaint的相關介面,如果要用ANPCanvas畫圖,那就可能需要用這些介面來設定ANPPaint參數
ANPMatrixInterface          提供了ANPMatrix(SkMatrix)的一些操作介面,用ANPCanvas畫圖時可能會用到
ANPPathInterface            提供了ANPPath(SkPath)的一些操作介面,用ANPCanvas畫圖時可能會用到
ANPSurfaceInterface         提供了從SurfaceView中擷取畫布ANPBitmap的介面lock,以及提交繪圖結果的介面unlock
ANPSystemInterface          getApplicationDataDirectory可以擷取一個叫做PluginSharedDataDirectory的地址,具體我也沒試過;2.2中新增了一個介面loadJavaClass,用於擷取Java Class的執行個體,這個主要是用在載入過程中View的執行個體化。
ANPTypefaceInterface        這個我不是太清楚,似乎又是skia中一些功能的封裝,大概和字型有關
ANPWindowInterface          一些視窗操作的介面,包括顯示軟鍵盤、全屏控制等等

 

 

具體定義可以看external/webkit/WebKit/android/plugins下的相關檔案
使用方法可以參考development/samples/BrowserPlugin這個例子。

可以看出,其實ANPInterface提供的介面,其實現大多來自webkit以外的一些底層庫。或許有人會問,這和直接連接這些庫有什麼區別?其實從結果上看,這兩種方法都是殊途同歸的,不過ANPInterface更多地體現為一種封裝,就算底層庫有了變動,只要ANPInterface不變,外掛程式的代碼就不需要修改。例如從Android 2.1到2.2,surfaceflinger有了較大的變化,但是ANPSurfaceInterface沒有改變,因此外掛程式也就不需要對這部分作什麼修改。不過實際使用過程中,還是根據自己的需要去選擇用ANPInterface還是直接連接外部庫吧,畢竟ANPInterface提供的介面還是很有限的。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.