在写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,在浏览器侧的操作完成了以后,就会调用这个函数返回一些信息。
//===================================