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:
然后在另外的apk中调用:<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>
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 { } }