2012-06-27 70 views
5

雖然試圖找到答案Android Jasper Reporting我發現有要回答爲此另外兩個問題,我已經問了問的一個問題,而不是一個答案):如何將Java編譯器和DEX轉換器實現爲Android應用程序?

我的問題,現在是: 「有沒有編譯器直接在設備上使用」和「如何在不生根的裝置執行這樣。 如果有人可以給我一個提示,我真的很感激......


我看着有點並且發現了一些應用程序,這些應用程序可以直接在未生根的Android設備上創建APK:

看起來他們正在使用Eclipse中的編譯器和移植DEX轉換器。現在我試圖弄清楚如何做同樣的事情。

好的:獲取源代碼並查看它。但是,當我遇到好奇的問題來獲得與服務器的連接並試圖解決它時,我會在這裏提出這個問題。希望既能幫助別人,並也越來越爲自己的答案;)


我把org.eclipse.jdt.core_3.7.3.v20120119-1537.jar從我的靛藍的插件目錄,並試圖下面的代碼:

 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!!!"); 

有時引發的異常是java.lang.Object中找不到和othertimes它堅持做什麼而升溫我的100%使用率處理器......

在這個時候,我無法弄清楚發生了什麼,爲什麼。因爲我有其他工作要做,所以這部分必須稍微等一下。

+1

你的問題與[tag:compiler-construction]無關。你沒有構建編譯器。不要盲目標籤。 – EJP

回答

1

我從JavaIDEdroid的源頭獲得靈感,並意識到我很愚蠢(一段時間以來,我試圖在設備上使用帶有dexified框架類的編譯器 - 這極有可能無法工作)。
當我成功編譯我的Test.java與ADT的副本android-jar在SD卡上我只需要加載與DexClassLoader的類。
同時通報myselft有關如何做到這一點,我發現這個好文章Custom Class Loading in Dalvik這啓發了我至少寫這段代碼:

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

的Test.java只包含一個方法:

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

爲了讓它運行,你需要jar jdt-compiler-xxxjar(在eclipse的plugins目錄中找到)和dx。罐子


並不困難(在目錄平臺工具的Android SDK的/ lib中找到);)
現在我會找出什麼在JasperReports的源改變讓它在我們心愛的Android設備的工作: D

相關問題