2011-02-24 6 views
9

Je travaille sur un projet qui essaie de charger une bibliothèque externe via DexClassLoader. Cela a fonctionné assez bien en 2.3:DexClassLoader sur Android Honeycomb

public class FormularDisplayLoader { 
public final static String PATH ="/data/data/at.mSystem.client/files/mSystem_Client_FormularLibrary.jar"; 
     private DexClassLoader classLoader; 

      public FormularDisplayLoader(Context context){ 
        this.context = context; 
        this.classLoader = new DexClassLoader("/data/data/at.mSystem.client/ 
    files/mSystem_Client_FormularLibrary.jar", 
         context.getFilesDir().getAbsolutePath(), 
         null, 
         FormularDisplayLoader.class.getClassLoader()); 
      } 

      public View getDisplay(String className) throws ErrorCodeException{ 
        try { 
          Class c = classLoader.loadClass(className); 
          Method m = c.getMethod("getDisplay", Context.class); 
          View ret = (View) m.invoke(c.newInstance(), context); 
          return ret; 
        } catch (Exception e) { 
          e.printStackTrace(); 
          throw new 
    ErrorCodeException(FormularErrorCode.NO_DISPLAY_AVAILABLE_FOR_FORMULAR); 
        } 
      } 

    } 

Malheureusement, en essayant de le port cette application pour Honeycomb (parce que la cible réelle de cette application sont comprimés) le DexClassLoader lance une exception :

02-23 09:30:58.221: ERROR/dalvikvm(8022): Can't open dex cache '/data/ 
dalvik-cache/ 
[email protected]@[email protected]@[email protected]': 
No such file or directory 
02-23 09:30:58.221: INFO/dalvikvm(8022): Unable to open or create 
cache for /data/data/at.mSystem.client/files/ 
mSystem_Client_FormularLibrary.jar (/data/dalvik-cache/ 
[email protected]@[email protected]@[email protected]) 
02-23 09:30:58.231: WARN/System.err(8022): 
java.lang.ClassNotFoundException: 
at.mSystem.client.formular.contract.ContractListFormularDisplay in 
loader [email protected] 
02-23 09:30:58.241: WARN/System.err(8022):  at 
dalvik.system.DexClassLoader.findClass(DexClassLoader.java:240) 
02-23 09:30:58.241: WARN/System.err(8022):  at 
java.lang.ClassLoader.loadClass(ClassLoader.java:548) 
02-23 09:30:58.261: WARN/System.err(8022):  at 
java.lang.ClassLoader.loadClass(ClassLoader.java:508) 
02-23 09:30:58.261: WARN/System.err(8022):  at 
at.mSystem.client.system.formularmodule.formular.FormularDisplayLoader.getDisplay(FormularDisplayLoader.java: 
35) 

Il semble que le DexClassLoader ignore le 2ème paramètre (dexOutputDir), comme la valeur de context.getFilesDir(). GetAbsolutePath() dans mon exemple est "/ data/data/ at.mSystem.client/files".

Avez-vous des idées pour résoudre ce problème? Ou est-ce une sorte de bug de nid d'abeilles ?

Merci,

Roland

+0

Je n'ai pas de réponse, mais je voulais juste vous faire savoir que je suis confronté au même problème. – gotosleep

+0

J'ai ouvert un ticket sur le tracker d'Android: http://code.google.com/p/android/issues/detail?id=15893 – gotosleep

+0

Le jour même où vous l'avez déposé, quelqu'un de google a dit "Yup, bug interne 3439372. Prévu pour une prochaine version de maintenance de Honeycomb " –

Répondre

2

En regardant l'historique des modifications, ce qui devrait être fixé dans Android 3.1.

3

Je sais que c'est un vieux message, mais j'ai récemment eu besoin d'une réponse à cela sans mettre à jour vers Android 3.1, alors j'ai pensé que je partagerais ma solution.

J'ai utilisé la classe "DexFile" au lieu du "DexClassLoader", car cela m'a permis de passer le fichier de sortie, ce qui m'a permis de contourner le problème en ignorant le répertoire de sortie.

Voici mon code:

final File dexClasses = new File("/sdcard/dexcontainer.zip"); 
DexFile dexFile = DexFile.loadDex(dexClasses.getAbsolutePath(), getFilesDir().getAbsolutePath() + "/outputdexcontainer.dex", 0); 

Enumeration<String> classFileNames = dexFile.entries(); 
while (classFileNames.hasMoreElements()) 
{ 
    String className = classFileNames.nextElement(); 
    dexFile.loadClass(className, classLoader); 
} 

Hope this helps quelqu'un.

Questions connexes