在寫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,在瀏覽器側的操作完成了以後,就會調用這個函數返回一些資訊。
//===================================