2012-07-05 88 views
0

我正在尋找一個Java程序,它將以文本格式從網上下載Java源文件,編譯它,加載它,並將其用作正在運行的程序的一部分。我聽說這是可能的,但不知道如何編寫代碼來實現它。如果你能指出我這樣的文檔方向,那麼一個功能完整的示例或教程將非常棒。如何編寫將編譯,加載和使用網絡代碼的Java程序

一旦我瞭解瞭如何完成,我打算利用這些知識來構建一個Android應用程序,該應用程序可以使用Web上的代碼進行自定義。

+0

*「我正在尋找一個Java程序哪個..」*用於在Android上部署?使用J2SE會很棘手,並且在JDK中有'JavaComplier'。 – 2012-07-05 23:09:20

+0

嗨安德魯。是的,我打算使用這些知識來構建Android應用程序。 – 2012-07-05 23:13:07

+0

嵌入現有的腳本語言可能更容易 - Lua? - 或者根據您的應用程序設計自己的腳本語言,並用_that_擴展您的應用程序。將Java編譯爲字節碼以在內存和處理器受限的設備上運行它似乎是在推動界限。 – sarnold 2012-07-05 23:13:20

回答

1

桌面程序可以使用shell腳本來下載,編譯和運行Java程序。 Android沒有編譯器,添加一個並不重要。最簡單的方法是製作一個服務器程序。然後Android程序會通知服務器程序下載並編譯Java源代碼,然後將結果發送給Android程序,然後該程序將使用其ClassLoader加載它。

一個警告是,JDK編譯器爲標準Java虛擬機生成字節碼,而Android的JVM使用Dalvik VM,所以當您編譯Java類時,不能只使用JDK;您必須使用Android SDK來生成Android ClassLoader可以使用的兼容字節碼。

+0

我認爲這可能是解決方案。我需要了解如何在服務器上使用Android SDK,而不是JDK。 – 2012-07-05 23:22:43

+0

http://developer.android.com/tools/building/index.html – 2012-07-06 01:11:58

0

是的,在一般意義上可以做你想做的事。然而,在Android的特定情況下,沙箱可能會施加限制,這會使您嘗試做的事情變得困難或不可能。在一般的情況下做到這一點,你可以用這樣的方法:

  1. 使用你選擇的網絡庫(例如,HttpClient,或者HtmlUnit,或者簡單的任務,Java的內置URLConnection類是完全也可以接受)在本地下載Java文件。

  2. 使用System.exec()到餐桌一個javac過程編譯爲您下載的Java文件(或使用JavaCompiler實現這樣做)。請注意,如果下載的Java文件使用不在系統中的外部JAR /庫,這可能會有點棘手。

  3. Use the ClassLoader to load your compiled class。請注意,如果您的運行時類路徑還包含您要加載的代碼所依賴的任何外部JAR庫,則只能使用它。

但是,在Android設備上幾乎肯定不會有第2步。相反,您需要編譯Android兼容的類文件(如服務器上的Yusuf建議的那樣),然後從您的應用程序下載並加載已編譯的類文件。或者,如果您確實在尋找挑戰,也許您可​​以在應用程序中打包完整的Java編譯器,然後以此方式編譯Java文件。

-1

權限將是一個問題。您無法將文件寫入安裝應用程序的分區。也許你可以將應用程序移動到SD卡上。

另一種方法是創建自定義類加載器並使用它將類文件提供給運行時。我不知道你是否可以在Android上做到這一點。

正在編寫腳本選項嗎?我相信你可以找到Android的腳本解釋器。然後你可以在解釋器中下載並執行腳本。

+0

只要腳本可以完全訪問Android API,它就是一個選項。 – 2012-07-05 23:49:38

+0

通常情況下,解釋器可以讓你控制暴露你想要暴露給腳本的內容。 – 2012-07-05 23:54:13

+0

應用程序未安裝在/ system上。你不能寫入他們安裝的位置,但你不需要。如果你想安裝一個新的應用程序,你可以將平臺指向你臨時放置的位置,然後彈出一個用戶確認對話框,然後以可運行的形式安裝它。如果你想在你的應用中使用代碼,你可以使用一個類加載器,在你的私有存儲中保存它的位置。 – 2012-07-05 23:57:03

0

你所試圖做的是類似無論是JRuby-for-Android項目或AIDE這兩者的基礎上設備,但只有在創建應用程序的情況下要在Android上運行,而不是添加代碼的功能到當前正在運行的東西應用程序。儘管JRuby for Android更適用於腳本編寫,但它可以提供足夠的功能,因爲它是開源的,您可能可以對其進行修改以適應您的需求。

AIDE項目看起來更像是一項成就,因爲您可以使用Java編寫器件來編寫應用程序。功能包括Dropbox和git支持。 AIDE似乎是一個封閉的應用程序。

+0

這也是一個很好的潛在解決方案。謝謝! – 2012-07-07 20:58:04