Merge change I9e28c4ce into eclair-mr2
* changes: Allow plugins to load java classes from their apk.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -65,7 +65,6 @@ ANPCanvasInterfaceV0 gCanvasI;
|
||||
ANPLogInterfaceV0 gLogI;
|
||||
ANPPaintInterfaceV0 gPaintI;
|
||||
ANPPathInterfaceV0 gPathI;
|
||||
ANPSystemInterfaceV0 gSystemI;
|
||||
ANPTypefaceInterfaceV0 gTypefaceI;
|
||||
ANPWindowInterfaceV0 gWindowI;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user