Android瀏覽器外掛程式開發(二)

來源:互聯網
上載者:User

 

在寫Android的browser plugin的時候,需要實現一系列的NPP函數,關於函數的具體說明還是推薦看一看這個網頁:https://developer.mozilla.org/en/Gecko_Plugin_API_Reference

下面說一說在這些函數中需要完成的任務

 

 

 

//===================================
NPError NP_Initialize(NPNetscapeFuncs*,

                                     NPPluginFuncs*,

                                     JNIEnv *java_environment,

                                     jobject application_context);
        Plugin初始化函數,瀏覽器會通過參數傳進一個瀏覽器側的NPAPI函數列表(NPN函數列表),plugin需要在這裡實現全域參數的初始化,並返回plugin側的NPAPI函數列表(NPP函數列表)。Android的Plugin可以通過NPN_GetValue擷取瀏覽器參數以及Android提供的各種操作介面(ANP Inerface),Android提供的操作介面可以查看原始碼的這一部分:external/webkit/WebKit/android/plugins。Android的NP_Initialize還提供了上層的java運行環境,可用於實現與java側的互動。

 

 

 //===================================

 

void NP_Shutdown();
        關閉Plugin,瀏覽器在銷毀了所有plugin執行個體以後就會調用這個函數,可以在這裡釋放一些全域的資源。

 

 

 //===================================

 

NPError NPP_New(NPMIMEType pluginType,

                                 NPP instance, uint16 mode,

                                 int16 argc, char *argn[],

                                 char *argv[], NPSavedData *saved);
        建立一個執行個體,瀏覽器每建立一個plugin的執行個體就會調用一次這個函數。在這裡主要就是根據傳進的參數列表進行執行個體的初始化,建立新的Plugin對象,並通過NPN_SetValue告知瀏覽器plugin對象的一些特性,其中包括了plugin對象能處理的事件(觸控事件和按鍵事件),以及plugin的渲染模式(bitmap模式或surface模式)。

 

 

 //===================================

 

NPError NPP_Destroy(NPP instance,

                                      NPSavedData** save);
        當瀏覽器需要銷毀一個plugin執行個體的時候調用,要在這裡完成這對應執行個體的資源釋放。

 

 

 //===================================

 

NPError NP_GetValue(NPP instance,

                                      NPPVariable variable,

                                      void *ret_value);
        瀏覽器通過此函數擷取plugin的一些全域參數,主要是plugin的名稱和描述。

 

 

 //===================================

 

NPError NPP_GetValue(NPP instance,

                                        NPPVariable variable,

                                        void *ret_value);
        瀏覽器通過此函數擷取plugin對象的一些參數,需要根據NPPVariable variable進行不同的處理,NPPVariable的定義可以參照external/webkit/Webcore/bridge/npapi.h和external/webkit/WebKit/android/plugins/android_npapi.h。

 

 

 //===================================

 

NPError NPP_SetValue(NPP instance,

                                        NPNVariable variable,

                                        void *value);
        瀏覽器通過此函數設定plugin對象的一些參數,和NPP_GetValue一樣,需要根據NPPVariable variable進行不同的處理,NPPVariable的定義可以參照external/webkit/Webcore/bridge/npapi.h和external/webkit/WebKit/android/plugins/android_npapi.h。

 

 

 //===================================

 

NPError NPP_SetWindow(NPP instance,

                                            NPWindow* window);
        瀏覽器通過該函數告知plugin對象其視窗參數,主要就是的plugin對象所佔畫面的大小。

 

 

 //===================================

 

NPError NPP_NewStream(NPP instance,

                                             NPMIMEType type,

                                             NPStream* stream,

                                             NPBool seekable,

                                             uint16* stype);
        如果需要向plugin傳輸一些流資料,瀏覽器會通過此函數告知plugin即將要傳輸的流,在參數NPStream* stream中包含了流的url,以後需要對根據此url對NPP_Write傳入的資料進行區分。

 

 

 //===================================

 

void NPP_StreamAsFile(NPP instance,

                                         NPStream* stream,

                                         const char* fname); 
        如果瀏覽器要傳輸的是本地檔案流,則會選擇調用這個參數通知plugin流的資訊。

 

 

 //===================================

 

NPError NPP_DestroyStream(NPP instance,

                                                  NPStream* stream,

                                                  NPReason reason);
        如果資料流傳輸結束或意外終止了,瀏覽器會調用此函數告知plugin登出這一資料流,可以通過NPReason reason判斷資料流是否為正常結束。

 

 

 //===================================

 

int32 NPP_WriteReady(NPP instance,

                                        NPStream* stream);
        瀏覽器在給plugin對象傳輸串流資料前,會先調用這一函數詢問plugin能接收的資料長度。

 

 

 //===================================

 

int32 NPP_Write(NPP instance,

                              NPStream* stream,

                              int32_t offset, int32_t len,

                              void* buffer);
        流資料的傳輸,根據 NPStream* stream裡的url可以判斷是哪個資料流,int32_t offset為void* buffer這段資料在資料流中的位移量,int32_t len為void* buffer的長度,傳回值是plugin對象實際接收的資料大小。

 

 

 //===================================

 

int16 NPP_HandleEvent(NPP instance,

                                          void* event);
        事件處理函數,在這裡plugin要完成各種事件的處理,包括繪製、按鍵、滑鼠、觸控等等,事件的參數都封裝在void* event裡,可以參照external/webkit/WebKit/android/plugins/android_npapi.h中ANPEvent結構體的定義。
 

 

 //===================================

void NPP_Print(NPP instance,

                           NPPrint* platformPrint)
        根據NPAPI的定義,瀏覽器會通過這個函數通知plugin進行輸出操作。

 

 

 //===================================

 

void NPP_URLNotify(NPP instance,

                                    const char* URL,

                                    NPReason reason,

                                    void* notifyData); 
        如果plugin調用了NPN_GetURLNotify或者NPN_PostURLNotify,在瀏覽器側的操作完成了以後,就會調用這個函數返回一些資訊。

 

 //===================================

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.