// Classe d'interface -> conditionnée à myinterface.jarComment jeter classe chargée de apk externe dans la classe d'interface
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;
}
// Projet 1 - inclus myinterface.jar et emballé à 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;
}
}
// projet principal // Inclus méthode // myinterface.jar de cette classe (classe B), je veux appeler "NewPoint" de "CLSA" dans le fichier classA.apk.
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));
}
Question 1. A (*): Je ne peux pas jeter "obj" retourné après exemple à la classe de MyInterface, comme:
Object obj = (Object) loadedClass.newInstance();
MyInterface mi = (MyInterface) obj;
-> Erreur:
Can not cast com.testing.classa.ClsA to com.example.my_interface.MyInterface`
Pourquoi pas? alors que dans com.testing.classa.ClsA avait étendu MyInterface?
Question 2. A (**): ERREUR,
java.lang.IllegalArgumentException: argument 1 should have type com.example.my_interface.point, got com.example.my_interface.point
Je pense que dans la classe principale avait myinterface.jar d'interface, et classA.apk avait myinterface.jar aussi, et eux ne peuvent pas parler ensemble. Quelle est la solution à ce problème?
p/s: J'ai cherché sur google, a quelqu'un suggérer supprimer lib commun de .apk (ici myinterface.jar), mais, si le supprimer ce ne sera pas possible de construire parce que les erreurs.
Aidez-moi, merci.
Merci, mais pourquoi avec l'interface de base de java, je peux utiliser 2 même ci-dessus dans la classe principale et peut créer newInstance une classe dans le fichier .jar (au lieu de .apk ici) après invoke dans la méthode. –
Cela peut être une différence entre la JVM et le bytecode Dalvik/ART. Ne demandez pas plus loin, mon knowlegde se termine ici;) – F43nd1r