1

//接口类->打包到myinterface.jar

package com.example.my_interface;
import com.example.my_interface.point;

pubic abstract class MyInterface{
    publib Object obj;  
    public abstract Point newPoint(Point p);
}    

//--- and other class ----

package com.example.my_interface.point;
public abstract class Point{
    public int x;
    public int y;   
}

//项目1 - 包含myinterface.jar并打包到classA.apk

package com.testing.classa;
import com.example.my_interface.point;

public class ClsA extends MyInterface{  

    @Override
    public Point newPoint(Point p){
        Point newP;
        newP.x = p.x + 1;
        newP.y = p.y + 1;

        return newP;
    }
}

//主项目 // 包含 myinterface.jar // 从这个类 (ClassB),我想从 classA.apk 文件中的“ClsA”调用“newPoint”方法。

package com.testing;
import com.example.my_interface.point;

public class ClsB{

    Point p1;
    p1.x = 2;
    p1.y = 3;

    Point newP;

    String apkfilePath = '/data/data/com.testing/files/apps/classA.apk';
    final File optimizedDexOutputPath = cnt.getDir("outdex", Context.MODE_PRIVATE);

    DexClassLoader dLoader = new DexClassLoader(apkfilePath,
                    optimizedDexOutputPath.getAbsolutePath(),
                    null, ClassLoader.getSystemClassLoader().getParent());

    try{
        Class<?> loadedClass = dLoader.loadClass("com.testing.classa.ClsA");
        Object obj = (Object) loadedClass.newInstance();   // (*)

        Method m = loadedClass.getDeclaredMethod("newPoint", Point.class);
        m.setAccessible(true);

        newP = (Point) m.invoke(obj, p1);                   //(**)

    }catch(Exception ex){
        ex.printStackTrace();
    }

    Log.d("NewPoint x",Integer.toString(newP.x));
    Log.d("NewPoint y",Integer.toString(newP.xy));
}

问题 1. 在 (*):我不能将实例后返回的“obj”转换为 MyInterface 类,例如:

Object obj = (Object) loadedClass.newInstance();
MyInterface mi = (MyInterface) obj;

-> 错误:

Can not cast com.testing.classa.ClsA to com.example.my_interface.MyInterface`

为什么不?而在 com.testing.classa.ClsA 中扩展了 MyInterface ?

问题 2. 在 (**): ERROR,

java.lang.IllegalArgumentException: argument 1 should have type com.example.my_interface.point, got com.example.my_interface.point

我认为在主类中有接口myinterface.jar,而在classA.apk 上也有myinterface.jar,它们不能一起交谈。这个问题有什么解决方案?

p/s:我在谷歌上搜索过,有人建议从 .apk 中删除公共库(这里是 myinterface.jar),但是,如果删除它,那将无法构建,因为错误。

帮帮我,谢谢。

4

1 回答 1

0

你不能像你尝试的那样强制转换,因为你定义了两个接口。它们的名称相同,但在不同的 apk 中。这同样适用于Point,这就是你得到第二个错误的原因。

由于您已经在使用反射,因此您可以进行完全反射,并且根本不在包之间共享 jar。

另一种解决方案是使用AIDL,它是 Android 的接口定义语言

于 2015-08-13T09:55:18.937 回答