From 9e28c4ce666f1b8c5e5355d739e37480856ef509 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Mon, 9 Nov 2009 14:45:58 -0500 Subject: [PATCH] Allow plugins to load java classes from their apk. Provide the functions to be called from native code that take the plugin's location and desired class name and then load that class from the plugin's apk if it is available. see http://b/2215696 --- core/java/android/webkit/PluginUtil.java | 20 +++++++++-------- core/java/android/webkit/WebViewCore.java | 27 +++++++++++++++++++++++ tests/BrowserTestPlugin/jni/main.cpp | 1 - 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/core/java/android/webkit/PluginUtil.java b/core/java/android/webkit/PluginUtil.java index 8fdbd672b544a..33ccf9d205fc9 100644 --- a/core/java/android/webkit/PluginUtil.java +++ b/core/java/android/webkit/PluginUtil.java @@ -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); + } } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index bfaa3535df102..5460a47b1bf0b 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -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) { diff --git a/tests/BrowserTestPlugin/jni/main.cpp b/tests/BrowserTestPlugin/jni/main.cpp index e3ad4a739c819..2f295f02b2c70 100644 --- a/tests/BrowserTestPlugin/jni/main.cpp +++ b/tests/BrowserTestPlugin/jni/main.cpp @@ -65,7 +65,6 @@ ANPCanvasInterfaceV0 gCanvasI; ANPLogInterfaceV0 gLogI; ANPPaintInterfaceV0 gPaintI; ANPPathInterfaceV0 gPathI; -ANPSystemInterfaceV0 gSystemI; ANPTypefaceInterfaceV0 gTypefaceI; ANPWindowInterfaceV0 gWindowI;