我是靠谱客的博主 羞涩白猫,最近开发中收集的这篇文章主要介绍DexClassLoader与类间互相调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

两个APK,其中一个APK叫做CallmeTest, 其中定义了一个类Callme, 类中定义了一个函数CallmeFunc()

public class CallmeTest {

    public CallmeTest() {

    }

    public int CallmeFunc(int a, int b) {

        return a+b;

    }

}

那么在另外一个APK中如何去调CallmeFunc, 可以使用如下方法

public

        Intent intent = new Intent("com.test.android.callme", null);
        PackageManager pm = getPackageManager();
        final List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
        ResolveInfo  rinfo    = list.get(0);
        ActivityInfo  ainfo    = rinfo.activityInfo;
        String div     = System.getProperty("path.separator");
        String packagename  = ainfo.packageName;
        String dexPath       = ainfo.applicationInfo.dataDir;
        String dexOutputDir  = getApplicationInfo().dataDir;
       
        DexClassLoader  loader = new DexClassLoader(dexPath, dexOutputDir,null,this.getClass().getClassLoader());
        {
         Class<?>  clazz = loader.loadClass(packagename + "Callme");
         Object obj = clazz.newInstance();
         Class[] params = new Class[2];
         params[0] = Integer.TYPE;
         params[1] = Integer.TYPE;
         Method action = clazz.getMethod("CallmeFunc", params);
         Integer ret = (Integer)action.invoke(obj, 1,2);
        } cache

 

另外一种方法是用接口去实现。

定义一个接口

public interface Plugin {

   public int CallmeFunc(int a, int b);

}

然后前面CallmeTest改为public class CallmeTest implements Plugin

在调用的APK中改为如下实现

try {

    Class<?>  clazz = loader.loadClass(packagename + "Callme");

    Plugin   plug = (Plugin)clazz.newInstance();

    Integer ret = plug.CallmeFunc(1,2)

查看JAVA class中函数签名

javap -s 类

最后

以上就是羞涩白猫为你收集整理的DexClassLoader与类间互相调用的全部内容,希望文章能够帮你解决DexClassLoader与类间互相调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部