2012-06-27 12 views
5

Mientras trata de encontrar una respuesta a Android Jasper Reporting descubrí que hay otras dos preguntas que deben ser respondidas para ello, lo que me ha pedido que pregunte como una pregunta, no como una respuesta;):¿Cómo implementar un compilador Java y un convertidor DEX en una aplicación de Android?

Mis preguntas son ahora: "¿hay alguna compilador para utilizar directamente en el dispositivo" y "la forma de ejecutar este tipo sin enraizamiento del dispositivo. Si alguien me podría dar una pista realmente agradecería que ...


me parecía un poco Es hora de avanzar en este enfoque, y encontró aplicaciones que permiten crear APK directamente en un dispositivo Android que NO está rooteado:

parece que están usando el compilador de Eclipse y un convertidor de dex portado. Ahora estoy tratando de descubrir cómo hacer lo mismo.

Seguro: obtenga el código fuente y búsquelo. Pero mientras tengo problemas curiosos para conectarme con los servidores y tratar de resolverlo, sigo la súplica para hacer esta pregunta aquí. Con la esperanza tanto para ayudar a otros con ella y también obtener una respuesta por mí mismo;)


Tomé el org.eclipse.jdt.core_3.7.3.v20120119-1537.jar desde el directorio de plugins de mi añil y probé siguiente código:

 org.eclipse.jdt.internal.compiler.batch.Main ecjMain = new org.eclipse.jdt.internal.compiler.batch.Main(new PrintWriter(System.out), new PrintWriter(System.err), false/*noSystemExit*/, null, progress); 
    System.err.println("compiling..."); 
    ecjMain.compile(new String[] {"-classpath", "/system/framework", storage.getAbsolutePath()+"/Test.java"}); 
    ecjMain.compile(new String[] {storage.getAbsolutePath()+"/Test.java"}); 
    System.err.println("compile succeeded!!!"); 

a veces se emitió la excepción de que java.lang.Object no se pudo encontrar y othertimes se pegó sin hacer nada mientras se calienta mi procesador con 100% de uso ... ...

En este momento no pude entender qué está pasando y por qué. Y debido a que tengo otro trabajo para hacer esta parte, tengo que esperar un poco.

+1

Su pregunta no tiene nada que ver con [tag: compiler-construction]. No estás construyendo un compilador. No etiquetes indiscriminadamente. – EJP

Respuesta

1

Tuve éxito después de tomar inspiración de la fuente de JavaIDEdroid y dándome cuenta de que soy tonto (durante un tiempo intenté usar el compilador con las clases de marco dexificado en el dispositivo, lo que naturalmente no podía funcionar).
Después de haber logrado compilar mi Test.java con una copia de ADTs android-jar en sdcard, solo tuve que cargar las clases con DexClassLoader.
Mientras informar myselft acerca de cómo hacer que me encontré con este artículo agradable Custom Class Loading in Dalvik que me inspiró, al menos, para escribir esta pieza de código:

File storage = getDir("all41", Context.MODE_PRIVATE); 


    System.err.println("copying the android.jar from asssets to the internal storage to make it available to the compiler"); 
    BufferedInputStream bis = null; 
    OutputStream dexWriter = null; 
    int BUF_SIZE = 8 * 1024; 
    try { 
      bis = new BufferedInputStream(getAssets().open("android.jar")); 
      dexWriter = new BufferedOutputStream(
       new FileOutputStream(storage.getAbsolutePath() + "/android.jar")); 
      byte[] buf = new byte[BUF_SIZE]; 
      int len; 
      while((len = bis.read(buf, 0, BUF_SIZE)) > 0) { 
       dexWriter.write(buf, 0, len); 
      } 
      dexWriter.close(); 
      bis.close(); 

    } catch (Exception e) { 
     System.err.println("Error while copying from assets: " + e.getMessage()); 
     e.printStackTrace(); 
    } 


    System.err.println("instantiating the compiler and compiling the java file"); 
    org.eclipse.jdt.internal.compiler.batch.Main ecjMain = new org.eclipse.jdt.internal.compiler.batch.Main(new PrintWriter(System.out), new PrintWriter(System.err), false/*noSystemExit*/, null); 
    ecjMain.compile(new String[] {"-classpath", storage.getAbsolutePath()+"/android.jar", Environment.getExternalStorageDirectory().getAbsolutePath() + "/Test.java"}); 


    System.err.println("calling DEX and dexifying the test class"); 
    com.android.dx.command.Main.main(new String[] {"--dex", "--output=" + storage.getAbsolutePath() + "/Test.zip", Environment.getExternalStorageDirectory().getAbsolutePath() + "/./Test.class"}); 


    System.err.println("instantiating DexClassLoader, loading class and invoking toString()"); 
    DexClassLoader cl = new DexClassLoader(storage.getAbsolutePath() + "/Test.zip", storage.getAbsolutePath(), null, getClassLoader()); 
    try { 
     Class libProviderClazz = cl.loadClass("Test"); 
     Object instance = libProviderClazz.newInstance(); 
     System.err.println(instance.toString()); 
    } catch (Exception e) { 
     System.err.println("Error while instanciating object: " + e.getMessage()); 
     e.printStackTrace(); 
    } 

El Test.java sólo contiene un método:

public String toString() { 
    return "Hallo Welt!"; 
} 

Para que funcione, necesita los jars jdt-compiler-xxxjar (que se encuentran en el directorio de complementos de eclipse) y dx.jarra (que se encuentra en el directorio de la plataforma-tools/lib de Android SDK)


No

muy duro;)
Y ahora voy a averiguar qué hay que cambiar de fuente de JasperReports para conseguir que funcione en nuestros dispositivos Android queridos: D

Cuestiones relacionadas