2014-12-08 298 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