2012-06-27 33 views
5

Trong khi cố gắng tìm câu trả lời cho Android Jasper Reporting Tôi phát hiện ra rằng có hai câu hỏi khác cần được trả lời, mà tôi được yêu cầu đặt câu hỏi, không phải là câu trả lời;):Làm cách nào để triển khai trình biên dịch Java và trình chuyển đổi DEX thành ứng dụng Android?

Câu hỏi của tôi bây giờ là: "có bất kỳ trình biên dịch để sử dụng trực tiếp trên thiết bị" VÀ "làm thế nào để thực hiện như vậy mà không cổ vũ thiết bị. Nếu ai có thể cho tôi một gợi ý tôi thực sự sẽ đánh giá cao nó ...


tôi nhìn một chút thời gian chuyển tiếp về phương pháp này và tìm thấy các ứng dụng giúp bạn có thể tạo APK trực tiếp trên thiết bị Android KHÔNG bắt nguồn từ:

Hình như họ đang sử dụng trình biên dịch từ nhật thực và phần mềm convert dex được chuyển. Bây giờ tôi đang cố gắng tìm ra cách để làm tương tự.

Chắc chắn: lấy mã nguồn và xem mã nguồn. Nhưng trong khi tôi đang có vấn đề tò mò để có được một kết nối đến các máy chủ và cố gắng giải quyết nó, tôi làm theo lời cầu xin để đặt câu hỏi này ở đây. Hy vọng cả hai để giúp đỡ người khác với nó và cũng nhận được một câu trả lời cho bản thân mình;)


Tôi đã org.eclipse.jdt.core_3.7.3.v20120119-1537.jar từ thư mục plugin của chàm của tôi và cố gắng đoạn mã sau:

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

Đôi khi các ngoại lệ được ném ra rằng java.lang.Object không thể tìm được và othertimes nó bị mắc kẹt không làm gì cả trong khi nóng lên bộ vi xử lý của tôi với việc sử dụng 100% ... ...

Tại thời điểm này tôi không thể tìm ra những gì đang xảy ra và tại sao. Và trong nguyên nhân tôi có công việc khác để làm phần này phải đợi một chút.

+1

Câu hỏi của bạn không liên quan gì đến [tag: compiler-construction]. Bạn không xây dựng trình biên dịch. Đừng gắn thẻ bừa bãi. – EJP

Trả lời

1

Tôi đã thành công sau khi lấy cảm hứng từ nguồn của JavaIDEdroid và nhận ra rằng tôi câm (trong một thời gian tôi đã cố gắng sử dụng trình biên dịch với các lớp khuôn khổ được giải thích trên thiết bị - mà không thể làm việc được).
Sau khi tôi đã biên dịch xong Test.java của mình với một bản sao ADTs android-jar trên sdcard, tôi chỉ phải tải các lớp với DexClassLoader.
Trong khi thông báo cho myselft về làm thế nào để làm điều đó tôi thấy thoải mái bài viết này Custom Class Loading in Dalvik mà cảm hứng cho tôi ít nhất phải viết đoạn mã này:

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

Các Test.java chỉ chứa một phương pháp:

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

Để có được nó chạy bạn cần các jdt-compiler-xxxjar jars (tìm thấy trong thư mục plugins của nhật thực) và dx.jar (tìm thấy trong thư mục nền tảng công cụ/lib của Android SDK)


Không thực sự khó khăn;)
Và bây giờ tôi sẽ tìm ra những gì để thay đổi trong mã nguồn của JasperReports để có được nó hoạt động trên các thiết bị Android yêu quý của chúng tôi: D

Các vấn đề liên quan