DexClassLoader的使用

DexClassLoader此处用于从一个应用调用另外一个插件apk的用法:

在插件apk中定义方法:

public classPluginClass {

    public PluginClass() {
        Log.i("Plugin", "PluginClass client initialized");
    }

    public int testfunction(int a, int b) {
        return a + b;
    }
}
插件apk中的mainfest:
<activity  android:name=".MainActivity"  android:label="@string/app_name" >
    <intent-filter>
        <action android:name="cn.edu.uestc.plugin.client" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

然后在另外的apk中调用:

public void useDexClassLoader() {
    Intent intent = new Intent("cn.edu.uestc.plugin.client", null);//此处是插件apk的action的name
    PackageManager pm = getPackageManager();
    final List<ResolveInfo> plugins = pm.queryIntentActivities(intent, 0);
    ResolveInfo rinfo = plugins.get(0);
    ActivityInfo ainfo = rinfo.activityInfo;

    String div = System.getProperty("path.separator");
    String packageName = ainfo.packageName;
    String dexPath = ainfo.applicationInfo.sourceDir;
    String dexOutputDir = getApplicationInfo().dataDir;
    String libPath = ainfo.applicationInfo.nativeLibraryDir;

    DexClassLoader cl = new DexClassLoader(dexPath,
            dexOutputDir, libPath, this.getClass().getClassLoader());

    try {
        Class<?> clazz = cl.loadClass(packageName + ".PluginClass");
        Object obj = clazz.newInstance();//调用PluginClass的构造方法
        Class[] params = new Class[2];//方法的参数
        params[0] = Integer.TYPE;
        params[1] = Integer.TYPE;
        Method action = clazz.getMethod("testfunction",params);//获取方法
        Integer ret = (Integer)action.invoke(obj, 12, 34);//使用反射来调用方法
        Log.i("Host", "return value is " + ret);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
    }

}

你可能感兴趣的:(DexClassLoader)