Android: javac vs Dalvik
我的理解是,谷歌不喜欢Oracle在Java ME中使用JRE的许可政策,所以它只是使用自己的JVM规范重写了它,该规范模仿JRE,但行为略有不同,特别是在使事情变得更高效,更安全时。
因此,如果我的理解是正确的,这意味着当在一些Java源代码上运行并编译成“二进制”byetcode时,兼容的JVM将解释与Dalvik不同的字节码(在某些情况下)。这是Dalvik与其他(兼容的)JVM之间的固有区别。javac
如果到目前为止我所说的任何话都是不正确的,请从纠正我开始!
现在,如果Android带有自己的编译器(它可能会),并以与不同(符合Dalvik标准)的方式编译Java源代码,那么我可以理解为什么一些代码(未使用Android SDK编译)无法在Android设备上运行:javac
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app
但是,看起来您用于编译Android应用程序!?!?所以看起来我们有这个:javac
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)
如果用于将所有源代码编译为字节码,那么为什么Dalvik不能运行某些类型的Java代码?javac
我昨天问了一个非常相似的问题,尽管在技术上得到了答案(在重新阅读了我的问题之后,我发现我只是不够具体),但没有人能够解释Dalvik固有的是什么,使得不可能从Google Guice或Apache Camel等项目运行Java代码。我被告知,为了让Camel在Dalvik上运行,我必须获得Camel的源代码,然后它必须“用Android SDK构建”,但我无法弄清楚这意味着什么或暗示什么。
例如,对于Camel,您有这个(简化):
RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> JVM --> running Camel ESB
RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> Dalvik JVM --> doesn't work !!! (???)
显然,Dalvik JVM内部发生了一些事情,阻止它运行某些类型的Java代码。我试图了解哪些类型的Java代码在“馈送到”Dalvik JVM时不会运行。
编辑:在“但骆驼3.0将在Android上运行!我知道 - 不是我的问题!