2012-06-27 18 views
5

私は私ではない答えとして、質問と尋ねるように頼まれて、そのために答えされる2つの他の質問があることが分かったAndroid Jasper Reportingに対する答えを見つけようとしている間;):JavaコンパイラとDEXコンバータをAndroidアプリに実装する方法は?

私の質問は今、次のとおりです。デバイスを応援せずに、このような実行方法」「デバイス上で直接使用するための任意のコンパイラがあります」と。 誰が私に私はそれを本当に感謝ヒントを与えることができれば...


私が少し見えました今後このアプローチを進めていく予定であり、Android搭載端末にAPKを直接作成することが可能なアプリを発見しました。

彼らは日食と移植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のが見つかり、それが100%の使用率と私のプロセッサを加熱しながら、何もしない立ち往生othertimesすることができなかったことを

を投げました。現時点では、何が起こっているのか、なぜそれが分からないのか分かりません。そして、私はこの部分を行うための他の仕事が少し待たなければならないという理由で。

+1

あなたの質問は[tag:compiler-construction]とは関係ありません。あなたはコンパイラを構築していません。無差別にタグを付けないでください。 – EJP

答えて

1

JavaIDEdroidのソースからインスピレーションを得て、私が愚かであることに気づいたのは成功しました。(私は、コンパイラをデバイス上でデクシアブルなフレームワーククラスで使用しようとしましたが、これはうまく動作しませんでした。
私のTest.javaをADTのアンドロイドジャーナルのコピーでsdcardにコンパイルできたら、DexClassLoaderでクラスをロードするだけでした。
私は、コードのこの作品を書くために、少なくとも私にインスピレーションを得た、この素晴らしい記事Custom Class Loading in Dalvikを見つけたことを行う方法についてmyselftを知らせるながら:

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

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が唯一の方法が含まれています

実行するには、jars jdt-compiler-xxxjar(eclipseのpluginsディレクトリにあります)とdxが必要です。瓶(AndroidのSDKのディレクトリプラットフォームのツール/ libにあります)そうでもないハード


;)
そして今、私はそれが私たちの最愛のAndroidデバイス上で動作得るためのJasperReportsのソースに変更するために何かを見つけるでしょう: D

関連する問題