我的理解是,Google 不喜欢 Oracle 在 Java ME 中使用 JRE 的许可政策,所以它只是使用自己的 JVM 规范重写了它,该规范模仿了 JRE,但行为略有不同,尤其是在提高效率和更安全。
所以,如果我的理解是正确的,这意味着当javac
在一些 Java 源代码上运行并编译成“二进制”字节码时,兼容的 JVM 会解释不同于 Dalvik 的字节码(在某些情况下)。这是 Dalvik 与其他(兼容的)JVM 之间的内在差异。
如果到目前为止我所说的任何内容都不正确,请先纠正我!
现在,如果 Android 带有自己的编译器(它可能),并以不同的(Dalvik 兼容)方式编译 Java 源代码javac
,那么我可以理解某些代码(未使用 Android SDK 编译)如何无法在安卓设备:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app
但是,看起来你javac
是用来编译 Android 应用程序的!?!?所以看起来我们有这个:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)
如果javac
是用来将所有源码编译成字节码,那为什么Dalvik不能运行某些类型的Java代码呢?
昨天我问了一个非常相似的问题,虽然它在技术上得到了回答(在重新阅读我的问题后,我发现我根本不够具体)没有人能够解释 Dalvik 固有的导致无法运行 Java 代码的原因来自 Google Guice 或 Apache Camel 等项目。有人告诉我,为了让 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 时不会运行。
编辑:在之前“但 Camel 3.0 将在 Android 上运行! ”我知道——不是我的问题!