1

// 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.

Répondre

0

Vous ne pouvez pas lancer comme vous l'avez essayé, car vous avez défini deux interfaces. ils sont appelés pareil, mais dans différents apks. La même chose s'applique pour Point, c'est pourquoi vous obtenez cette deuxième erreur.

Étant donné que vous utilisez déjà la réflexion, vous pouvez opter pour une réflexion complète et ne pas partager de pot entre les paquets.

Une autre solution serait d'utiliser AIDL, qui est un langage de définition d'interface pour Android

+0

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. –

+0

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