DexClassLoader与类间互相调用

本文介绍两种在Android不同APK间调用指定方法的方式:通过DexClassLoader加载类并反射调用,以及使用接口实现跨APK调用。文章详细展示了如何实现这两种方式,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

两个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 类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值