2011-02-24 31 views
9

Estoy trabajando en un proyecto que intenta cargar una biblioteca externa a través de DexClassLoader. Esto funcionó bastante bien en 2.3:DexClassLoader en 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); 
        } 
      } 

    } 

Por desgracia, cuando se trata de puerto de esta aplicación para Honeycomb (porque el objetivo real para esta aplicación son las pastillas) la DexClassLoader lanza una excepción:

02-23 09:30:58.221: ERROR/dalvikvm(8022): Can't open dex cache '/data/ 
dalvik-cache/ 
[email protected]@[email protected]@[email protected]x': 
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) 

Parece que DexClassLoader ignora el 2º parámetro (dexOutputDir), como el valor de context.getFilesDir(). GetAbsolutePath() en mi ejemplo es "/ data/data/ at.mSystem.client/files".

¿Tiene alguna idea de cómo resolver eso? ¿O es esto un tipo de error de nido de abeja ?

Gracias,

Roland

+0

No tengo una respuesta, pero solo quería que supieras que estoy teniendo el mismo problema. – gotosleep

+0

Abrí un ticket en el rastreador de problemas de Android: http://code.google.com/p/android/issues/detail?id=15893 – gotosleep

+0

El mismo día que lo archivó, alguien de Google dijo "Sí, error interno 3439372. Programado para una próxima versión de mantenimiento de Honeycomb " –

Respuesta

2

Mirando el historial de cambios, que se debe colocar en Android 3.1.

3

Sé que esta es una publicación anterior, pero recientemente necesitaba una respuesta a esto sin actualizar a Android 3.1, así que pensé en compartir mi solución.

Utilicé la clase "DexFile" en lugar de "DexClassLoader", ya que me permitió pasar el archivo de salida, así solucioné el problema con el directorio de salida que se ignoraba.

Aquí está mi código:

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); 
} 

Espero que esto ayude a alguien.

Cuestiones relacionadas