Android浏览器插件开发(二)

 

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

 

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

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值