转载请注明出处:http://blog.youkuaiyun.com/awebkit
这一讲我们一起来编写一个简单的浏览器插件 - HelloPlugin
java部分:AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloplugin"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.webkit.permission.PLUGIN"/>
<uses-sdk android:minSdkVersion="3" />
<application android:icon="@drawable/hello_browser_plugin"
android:label="@string/hello_browser_plugin">
<service android:name=".HelloPlugin">
<intent-filter>
<action android:name="android.webkit.PLUGIN" />
</intent-filter>
<meta-data android:name="type" android:value="native" />
</service>
</application>
</manifest>
HelloPlugin.java代码package com.example.helloplugin;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class HelloPlugin extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
c代码部分。保留main.cpp, main.h, PluginObject.h, PluginObject.cpp,稍微作一些修改。
修改Android.mk,仿照原来的例子。
增加hello/HelloPlugin.h hello/HelloPlugin.cpp。这个函数要实现的API有两个
virtual bool supportsDrawingModel(ANPDrawingModel);
virtual int16 handleEvent(const ANPEvent* evt);
我简单实现的HelloPlugin.cpp代码如下
#include "HelloPlugin.h"
extern ANPLogInterfaceV0 gLogI;
extern ANPCanvasInterfaceV0 gCanvasI;
///
HelloPlugin::HelloPlugin(NPP inst) : SubPlugin(inst) {
//
gLogI.log(kDebug_ANPLogType, "HelloPlugin created...");
//register for touch events
ANPEventFlags flags = kTouch_ANPEventFlag;
NPError err = browser->setvalue(inst, kAcceptEvents_ANPSetValue, &flags);
if (err != NPERR_NO_ERROR) {
gLogI.log(kError_ANPLogType, "Error selecting input events.");
}
}
HelloPlugin::~HelloPlugin(){
//
}
bool HelloPlugin::supportsDrawingModel(ANPDrawingModel model) {
return (model == kBitmap_ANPDrawingModel);
}
void HelloPlugin::drawPlugin(const ANPBitmap& bitmap, const ANPRectI& clip) {
// create a canvas
ANPCanvas* canvas = gCanvasI.newCanvas(&bitmap);
// clip the canvas
ANPRectF clipR;
clipR.left = clip.left;
clipR.top = clip.top;
clipR.right = clip.right;
clipR.bottom = clip.bottom;
gCanvasI.clipRect(canvas, &clipR);
// paint the canvas (using the path API)
gCanvasI.drawColor(canvas, 0xFF0000FF);
// delete the canvas
gCanvasI.deleteCanvas(canvas);
}
int16 HelloPlugin::handleEvent(const ANPEvent* evt) {
NPP instance = this->inst();
switch (evt->eventType) {
case kDraw_ANPEventType:
switch (evt->data.draw.model) {
case kBitmap_ANPDrawingModel:
gLogI.log(kDebug_ANPLogType, "We should draw plugin !!!!!!!!");
drawPlugin(evt->data.draw.data.bitmap, evt->data.draw.clip);
return 1;
default:
break; // unknown drawing model
}
case kTouch_ANPEventType:
if (kDown_ANPTouchAction == evt->data.touch.action) {
gLogI.log(kDebug_ANPLogType, "touch event occurs!!!!!!!!");
}
return 1;
default:
break;
}
return 0; // unknown or unhandled event
}
是不是很简单?
插件的实现还是比较简单的,我们只要深入理解了NPAPI,然后在合适的时机实现需要的功能即可