在 Android 上运行 Java 字节码 - 基于 DalvikVM 的 Sun JVM

Posted

技术标签:

【中文标题】在 Android 上运行 Java 字节码 - 基于 DalvikVM 的 Sun JVM【英文标题】:Running Java bytecode on the Android - Sun JVM on top of DalvikVM 【发布时间】:2010-10-14 20:00:42 【问题描述】:

由于 java 实现 (OpenJDK) 和 android 的虚拟机 DalvikVM 都是开源的,因此必须可以在 Google 的 DalvikVM 上实现 Sun 的 JavaVM。这样就可以在 android 上开箱即用地运行基于 JVM 的应用程序和语言 (Clojure, Jython)。

是否正在努力生产这样的 Sun JVM 实现?

【问题讨论】:

你能在安卓手机上运行java字节码吗?如果是的话,你能列出步骤吗?? 【参考方案1】:

OpenJDK 使用本机代码,因此它将是一个重要的端口...至少有一个用 Java 编写的 VM (JikesRVM),不幸的是它不是一个完全可用的 Java 实现。

由于 DalvikVM 运行从 .class 文件转换而来的类,因此应该可以转换这些类。那么“唯一”的问题是当语言动态生成字节码时 - 因为它需要在程序在 DalvikVM 上运行时将生成的字节码转换为 DalvikVM 格式的额外步骤。

嗯.... 一种 JITT(即时翻译器),可在手机运行时将类文件转换为 DalvikVM 文件。我想知道那会有多慢。

【讨论】:

嗯。就像 1995 年在 jvm 内的 x86 emu 中运行 vista 一样? :) 一切都是新的 :-) 呃,但是 Android 可以运行 Linux 二进制文件【参考方案2】:

可以将 OpenJDK 移植到 Android 平台。有这样的努力:Shark、Zero 和 caciocavallo,它们极大地简化了端口过程(= 没有 ASM,简单的 AWT 对等体)。此外,Android 只不过是一个 linux 内核。唯一的问题是任何人什么时候完成?

顺便说一句,iphone 和 android 手机都配备了 Jazelle 兼容的处理器,非常欢迎具有非常强大的处理器黑客技能的人将 Jazelle 支持添加到 OpenJDK。 这样做,我们可以选择:非常轻的资源加速 (Jazelle) 和 JIT ;-)

关于 iPhone,也是一样的:端口是可能的。只有 Apple 在 iPhone 许可证中加入了明确禁止使用 VM 的部分。根据欧洲法律,对我来说,这个许可证部分是非法的。两个原因:您不能强制/链接购买您的两种产品。在这里,我调音和 Iphone 是链接的。你不能拒绝卖你能卖的东西。在这里,一旦为 iPhone 构建了 VM,如果它被拒绝放入 iTune 商店,那么这一点将适用。世界上有没有人想挑战苹果许可的合法性?我不这么认为,不开心的人会飞到 Android 或任何其他平台。

【讨论】:

【参考方案3】:

与此同时,我找到了一个可能的解决方案(仅限 JavaME):

“MicroEmulator 是 Java SE 中 Java ME 的纯 Java 实现。” Running Java ME applications on Android

【讨论】:

【参考方案4】:

从技术上讲,应该可以在 dalvik vm 上解释热点字节码或在热点上解释 dalvik 的字节码,但从长远来看,它永远不会是高效的(更不用说优雅的)设计。这样做的成本可能会变得非常高,尤其是在这样一个分裂的生态系统的未来演变中的维护方面。

我认为,从一开始,dalvik vm 就是权力/市场控制问题,而不是改进 Java 虚拟机生态系统的创新努力。 dalvik vm 和hotspot vm 是横跨同一条河流的两座高速公路桥,彼此平行,相距五米。它分裂并给Java技术生态系统带来混乱。

在我看来,谷歌绝对是在过去十年中做出创新贡献的技术领导者,使保守得多的预言机相形见绌,但在这个主题上,他们以几乎破坏性的方式动摇了 Java 生态系统。我们(程序员)应该为这个问题争取一个统一的解决方案。无论如何,这就是“虚拟机”概念背后的主要思想——它既不属于谷歌也不属于甲骨文。

【讨论】:

【参考方案5】:

尝试使用 debian Wheezy 的 GNURoot 应用程序(proot ptrace 容器); apt-get 更新 apt-get install openjdk-7-jre /usr/lib/jvm/java-7-openjdk-armel/jre/bin/java ... (包括长路径)

【讨论】:

【参考方案6】:

我认为问题不是技术问题。例如,理论上您可以将 OpenJDK 迁移到 iPhone,但存在法律限制。

【讨论】:

这里是安卓的许可协议:developer.android.com/sdk/…。我在这里没有看到任何法律障碍。 另外,Android 操作系统在 Apache 和 GPL 许可下:source.android.com/license。因此,没有任何法律限制。【参考方案7】:

请参阅http://davy.preuveneers.be/phoneme/,了解适用于 Android ARM apk 的 MIDP、Foundation 和 Personal Profile jvm。 (谢谢戴维!!!)

我已将 Foundation jvm 重新打包以供命令行使用,并将其托管在 vkfox.com/android/bin/foundation-jvm.bin 以供您取悦。可以使用 JavaIDEdroid 免费应用程序中的 eclipse 编译器,或带有此 jvm 的旧 kopi 或 kopisusu 编译器,以及来自 J2ME jdk 的存根 cdc + 基础 jar 文件,用于板载开发系统。使用 TerminalIDE 的功能——控制台和 sun 编译器——以及指定的 ref jar 也可以帮助您实现目标。这本质上等同于带有 MIDP 或 awt 图形可能性的无头 jdk1.4。

【讨论】:

以上是关于在 Android 上运行 Java 字节码 - 基于 DalvikVM 的 Sun JVM的主要内容,如果未能解决你的问题,请参考以下文章

Java 虚拟机原理动态字节码技术 | Dalvik & ART 虚拟机 | Android 字节码打包过程

将 Dalvik 字节码动态生成到正在运行的 Dalvik/Android 应用程序中

Android Gradle之Java字节码

Android 对动态语言不利

Java 虚拟机原理Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 )

从字节码层面看“HelloWorld”