Merge change I9e28c4ce into eclair-mr2

* changes:
  Allow plugins to load java classes from their apk.
This commit is contained in:
Android (Google) Code Review
2009-11-09 12:42:35 -08:00
3 changed files with 38 additions and 10 deletions

View File

@@ -19,9 +19,6 @@ import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class PluginUtil {
private static final String LOGTAG = "PluginUtil";
@@ -35,12 +32,7 @@ class PluginUtil {
static PluginStub getPluginStub(Context context, String packageName,
String className) {
try {
Context pluginContext = context.createPackageContext(packageName,
Context.CONTEXT_INCLUDE_CODE |
Context.CONTEXT_IGNORE_SECURITY);
ClassLoader pluginCL = pluginContext.getClassLoader();
Class<?> stubClass = pluginCL.loadClass(className);
Class<?> stubClass = getPluginClass(context, packageName, className);
Object stubObject = stubClass.newInstance();
if (stubObject instanceof PluginStub) {
@@ -56,4 +48,14 @@ class PluginUtil {
}
return null;
}
/* package */
static Class<?> getPluginClass(Context context, String packageName,
String className) throws NameNotFoundException, ClassNotFoundException {
Context pluginContext = context.createPackageContext(packageName,
Context.CONTEXT_INCLUDE_CODE |
Context.CONTEXT_IGNORE_SECURITY);
ClassLoader pluginCL = pluginContext.getClassLoader();
return pluginCL.loadClass(className);
}
}

View File

@@ -18,6 +18,7 @@ package android.webkit;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.DrawFilter;
@@ -2167,6 +2168,32 @@ final class WebViewCore {
}
}
// called by JNI
private Class<?> getPluginClass(String libName, String clsName) {
if (mWebView == null) {
return null;
}
String pkgName = PluginManager.getInstance(null).getPluginsAPKName(libName);
if (pkgName == null) {
Log.w(LOGTAG, "Unable to resolve " + libName + " to a plugin APK");
return null;
}
Class<?> pluginClass = null;
try {
pluginClass = PluginUtil.getPluginClass(mWebView.getContext(), pkgName, clsName);
} catch (NameNotFoundException e) {
Log.e(LOGTAG, "Unable to find plugin classloader for the apk (" + pkgName + ")");
} catch (ClassNotFoundException e) {
Log.e(LOGTAG, "Unable to find plugin class (" + clsName +
") in the apk (" + pkgName + ")");
}
return pluginClass;
}
// called by JNI. PluginWidget function to launch an activity and overlays
// the activity with the View provided by the plugin class.
private void startFullScreenPluginActivity(String libName, String clsName, int npp) {

View File

@@ -65,7 +65,6 @@ ANPCanvasInterfaceV0 gCanvasI;
ANPLogInterfaceV0 gLogI;
ANPPaintInterfaceV0 gPaintI;
ANPPathInterfaceV0 gPathI;
ANPSystemInterfaceV0 gSystemI;
ANPTypefaceInterfaceV0 gTypefaceI;
ANPWindowInterfaceV0 gWindowI;