2014-12-08 137 views
10

從版本2.4開始,Groovy支持Android。我想在我的Android應用程序中運行嵌入Java的Groovy腳本。在運行時爲Android執行嵌入Java中的Groovy腳本

本網站解釋說,這是可能的:http://melix.github.io/blog/2014/06/grooid2.html

一個適應Groovy語言的困難是,正如我們 說,Groovy是一個高度動態的語言。其功能之一是 在運行時執行腳本。那麼,如果我們想在設備上輸入Groovy 腳本,並直接在腳本上執行它呢?可能嗎? 事實上,是的,這是可能的,因爲你遵循這個過程:

你可以有一個應用程序,Groovy寫與否,但最終, 一旦應用程序運行時,你有Groovy的源代碼你想要執行的是 。然後它需要編譯這些類,直接在設備上調用dex ,將結果打包到本地文件系統的jar文件中,然後使用特殊的類加載器加載它。那麼爲什麼 這是可能的,這個過程是非常複雜的,不是直接的,但更重要的是,它顯着緩慢。

我很高興,無論速度如何,這確實是可能的。這裏有一個示例項目:https://github.com/melix/grooidshell-example

不幸的是我不太瞭解這個過程。我有這個相當小的項目,但我不確定在哪裏看到。

您可以指出我在正確的方向執行Groovy腳本,在運行時爲Android嵌入Java?

回答

5

更仔細https://github.com/melix/grooidshell-example/blob/master/GroovyDroid/src/main/java/me/champeau/groovydroid/GrooidShell.java

這是創建一個DexFile(線71)情況下,添加一個字節碼後處理器的編譯(線73)採取類的生成字節,並翻譯爲DEX格式(第76行),最後將其存儲在dexfile實例中(第77行)。然後獲取達爾維克字節碼(第91行),使用DexClasLoader(第136行)加載dalvik/dex類(第138行)。

+0

嗨,我目前正在嘗試實施你的步驟。我在第136行遇到問題:我不知道classLoader參數使用什麼值。在這個例子中,他在初始化他的程序時收到一個ClassLoader對象,但我不這樣做。我爲這個論點做了什麼? – Voldemort 2014-12-09 19:14:23

+0

類加載器來自該示例中的活動:https://github.com/melix/grooidshell-example/blob/master/GroovyDroid/src/main/java/me/champeau/groovydroid/GroovyActivity.groovy#L35 – blackdrag 2014-12-11 15:30:28