




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章第十一章 Android浏览器扩展浏览器扩展Netscape Plugin Application Programming Interface是一个被许多浏览器遵循和采用的跨平台的插件框架。 NPAPI的接口分为两组,浏览器侧的 NPN 接口和插件侧的 NPP 接口:NPN 接口是浏览器侧实现,供插件调用的一系列功能接口;NPP 接口是插件侧实现,供浏览器获取信息或进行控制操作的接口。浏览器插件的核心,就是一个实现了 NPP 接口,并使用浏览器提供的 NPN APIs 进行对外操作的动态库。考虑到 Android 系统在架构上的特殊性,Google 的工程师对 Android 浏览器的
2、 NPAPI接口作了一些修改,添加了一个 Android 浏览器插件特有的结构:插件的 Java 层。这样,浏览器插件就可以作为一个Android应用,通过常规途径安装到Android设备中。(Android的所有应用都必须通过Java 部分实现安装)Android的源码目录下提供了Plugin的范例: development/samples/BrowserPlugin;通过这个版本的例子编译生成的是完整的apk安装包,可以在模拟器或者真机上安装测试。jni目录是插件的主体,Native C/C+写的Shared Library,负责NPAPI中NPP侧的实现。下有5种子插件目录(animat
3、ion,audio,background,form,paint), Android.mk文件(Make文件) ,hello-jni.cpp文件 (注册java本地接口,hello-world函数,测试用),jni-bridge.cpp文件(注册java本地接口,注册的函数在SamplePluginStub.java中调用) ,main.cpp文件(实现NPP接口) ,main.h文件(定义 NPP接口变量) ,PluginObject.cpp文件(插件的基类),PluginObject.h文件 。res目录,和一般的android工程一样,存放资源的目录。src目录下有实现了一个android
4、的service类(其他大部分插件是实现activity类),并为插件提供绘制接口;有SamplePluginStub.java、SamplePlugin.java: 实现服务接口、Cube.java、CubeRenderer.java文件。AndroidManifest.xml,同样是每个android的工程都会有文件,包含了apk的注册信息,就在这里实现plugin的注册。Android.mk,编译配置文件。NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn, ch
5、ar* argv, NPSavedData* saved);新建一个实例,浏览器每创建一个plugin的实例就会调用一次这个函数。在这里主要就是根据传进的参数列表进行实例的初始化,建立新的Plugin对象,并通过NPN_SetValue告知浏览器plugin对象的一些特性,其中包括了plugin对象能处理的事件(触控事件和按键事件),以及plugin的渲染模式(bitmap模式或surface模式)。NPError NPP_Destroy(NPP instance, NPSavedData* save);当浏览器需要销毁一个plugin实例的时候调用,要在这里完成对应实例的资源释放。NPErr
6、or 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传入的数据进行区分
7、。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
8、 offset, int32 len,void* buffer);流数据的传输,根据 NPStream* stream里的url可以判断是哪个数据流,int32_t offset为void* buffer这段数据在数据流中的偏移量,int32_t len为void* buffer的长度,返回值是plugin对象实际接收的数据大小。void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);如果浏览器要传输的是本地文件流,则会选择调用这个参数通知plugin流的信息。void NPP_Print(NPP ins
9、tance, NPPrint* platformPrint);根据NPAPI的定义,浏览器会通过这个函数通知plugin进行输出操作。int16 NPP_HandleEvent(NPP instance, void* event);事件处理函数,在这里plugin要完成各种事件的处理,包括绘制、按键、鼠标、触控等等,事件的参数都包装在void* event里,可以参照external/webkit/WebKit/android/plugins/android_npapi.h中ANPEvent结构体的定义。void NPP_URLNotify(NPP instance, const char*
10、URL, NPReason reason, void* notifyData);如果plugin调用了NPN_GetURLNotify或者NPN_PostURLNotify,在浏览器侧的操作完成了以后,就会调用这个函数返回一些信息。NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);浏览器通过此函数获取plugin对象的一些参数,需要根据NPPVariable variable进行不同的处理,NPPVariable的定义可以参照external/webkit/Webcore/bridge/npapi.h和e
11、xternal/webkit/WebKit/android/plugins/android_npapi.h。NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);浏览器通过此函数设置plugin对象的一些参数,和NPP_GetValue一样,需要根据NPPVariable variable进行不同的处理,NPPVariable的定义可以参照external/webkit/
12、Webcore/bridge/npapi.h和external/webkit/WebKit/android/plugins/android_npapi.h。为了弥补NPAPI在Android上的不足,Google在Android的浏览器上实现了ANPInterface这么一个东西。就是一系列的操作接口(函数),提供了一些NPAPI没有的东西。插件可以在初始化的时候获取这些ANPXXXInterface,并在运行过程中使用。其实ANPInterface提供的接口,大多来自webkit的一些底层库(external/webkit/WebKit/android/plugins)BrowserPlug
13、in中的ANPInterface列表如下:ANPAudioTrackInterfaceV0 gSoundI;ANPBitmapInterfaceV0 gBitmapI;ANPCanvasInterfaceV0 gCanvasI;ANPLogInterfaceV0 gLogI;ANPPaintInterfaceV0 gPaintI;ANPPathInterfaceV0 gPathI;ANPSurfaceInterfaceV0 gSurfaceI;ANPSystemInterfaceV0 gSystemI;ANPTypefaceInterfaceV0 gTypefaceI;ANPWindowInt
14、erfaceV0 gWindowI;Plugin初始化函数,浏览器会通过参数传进一个浏览器侧的NPAPI函数列表(NPN函数列表),plugin需要在这里实现全局参数的初始化,并返回plugin侧的NPAPI函数列表(NPP函数列表)。Android的Plugin可以通过NPN_GetValue获取浏览器参数以及Android提供的各种操作接口(ANP Inerface),Android提供的操作接口可以查看源代码的这一部分:external/webkit/WebKit/android/plugins。Android的NP_Initialize还提供了上层的java运行环境,可用于实现与jav
15、a侧的交互。关闭Plugin,浏览器在销毁了所有plugin实例以后就会调用这个函数,可以在这里释放一些全局的资源。修改jni/main.cpp文件之后编译(主要是增加LOGCAT调试信息),以方便后面分析插件加载流程。进入源码根目录下运行make SampleBrowserPlugin运行 “adb install apk_file” ,把编译好的插件apk安装到设备或模拟器中安装成功后,你可以通过“Settings - Applications - Manage applications”管理插件用包含以下内容的HTML页面测试浏览器插件 用浏览器打开测试网页,将会打印类似以下log:D/
16、plugin ( 366): * NP_Initialize *D/plugin ( 366): * 0 x420f18 START NPP_New *D/plugin ( 366): - 0 x420f18 DrawingModel is 1D/plugin ( 366): Application data dir is /data/data/com.android.browser/app_pluginsE/plugin ( 366): - 0 x420f18 Testing Log ErrorW/plugin ( 366): - 0 x420f18 Testing Log WarningD
17、/plugin ( 366): - 0 x420f18 Testing Log DebugD/plugin ( 366): pixel format 0 unknown has no packingD/plugin ( 366): pixel format 1 8888 has packing ARGB 24 8 0 8 8 8 16 8D/plugin ( 366): pixel format 2 565 has packing ARGB 0 0 11 5 5 6 0 5D/plugin ( 366): - 0 x420f18 Testing DOM AccessD/plugin ( 366
18、): - 0 x420f18 Testing JavaScript AccessE/plugin ( 366): - 0 x420f18 Invalid Variant type for JS Return: 4,3D/plugin ( 366): - 0 x420f18 PluginType is 3D/plugin ( 366): * 0 x420f18 END NPP_New *D/plugin ( 366): * 0 x312a10 START NPP_New *D/plugin ( 366): - 0 x312a10 DrawingModel is 1D/plugin ( 366):
19、 Application data dir is /data/data/com.android.browser/app_pluginsD/plugin ( 366): - 0 x312a10 PluginType is 6D/plugin ( 366): * 0 x312a10 END NPP_New *D/plugin ( 366): * 0 x420f18 NPP_SetWindow *D/dalvikvm( 366): Trying to load lib /data/data/com.android.sampleplugin/lib/libsampleplugin.so 0 x43c2
20、e448D/dalvikvm( 366): Added shared lib /data/data/com.android.sampleplugin/lib/libsampleplugin.so 0 x43c2e448D/plugin ( 366): * 0 x312a10 NPP_SetWindow *D/plugin ( 366): - repeat timer 5D/plugin ( 366): - latency test: 1937207155 interval 421 expected 50, total 421 expected -1923890058, drift 192389
21、0479 avg 0D/plugin ( 366): - oneshot timerD/plugin ( 366): - repeat timer 4D/plugin ( 366): - latency test: 1937207156 interval 473 expected 50, total 894 expected -1923890008, drift 1923890902 avg 0E/plugin ( 366): -0 x312a10 Invalid Surface Dimensions (300,150):(120,60)D/plugin ( 366): - repeat ti
22、mer 3D/plugin ( 366): - latency test: 1937207157 interval 73 expected 50, total 967 expected -1923889958, drift 1923890925 avg 0D/plugin ( 366): - repeat timer 2D/plugin ( 366): - latency test: 1937207158 interval 130 expected 50, total 1097 expected -1923889908, drift 1923891005 avg 0D/plugin ( 366
23、): * 0 x420f18 NPP_HandleEvent *D/plugin ( 366): - 0 x420f18 the plugin received an onLoad eventD/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): - repeat timer 1D/plugin ( 366): - latency test: 1937207159 interval 90 expected 50, total 1187 expected -1923889858, drift 1923891045 avg 0D
24、/dalvikvm( 54): GC freed 8773 objects / 568952 bytes in 169msD/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): * 0 x312a10 NPP_HandleEvent *D/plugin ( 366): * 0 x420f18 NPP_HandleEvent *D/plugin ( 366): * 0 x420f18 NPP_HandleEvent *D/PowerMa
25、nagerService( 54): setPowerState: mPowerState=3 newState=7 noChangeLights=falseD/PowerManagerService( 54): oldKeyboardBright=false newKeyboardBright=falseD/PowerManagerService( 54): oldScreenBright=true newScreenBright=trueD/PowerManagerService( 54): oldButtonBright=false newButtonBright=trueD/PowerManagerService( 54): oldScreenOn=true newScreenOn=trueD/PowerManagerService( 54): oldBatteryLow=false newBatteryLow=falseW/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 比赛活动承办协议书
- 案子终止执行协议书
- 教师责任安全协议书
- 消防合同纠纷协议书
- 死亡赔偿委托协议书
- 无偿提供车辆协议书
- 油茶基地改造协议书
- 海边山庄转让协议书
- 打架伤人谅解协议书
- 河道清洁承包协议书
- 智能水务一体化管理系统项目售后服务与培训方案
- 牛安全生产技术-牛常见心血管系统疾病的防治
- 2023新能源风电工程项目文档全过程控制与档案整理规定
- 口腔颌面颈部局部解剖-颈部局部解剖(口腔解剖生理学课件)
- (完整word版)口腔正畸案例分析
- 人教鄂版小学科学二年级下册10《自然世界与人工世界》
- 韩国语topik单词-初级+中级
- 血小板血浆(PRP)课件
- 互联网加大学生创新创业大赛项目计划书
- 华尔道夫酒店项目塔吊截臂施工方案
- GB/T 4852-2002压敏胶粘带初粘性试验方法(滚球法)
评论
0/150
提交评论