背景:Minecraft最初是由Java语言编写的,因此不需要重新编译就可以拥有良好的跨平台能力,也就是几乎所有支持Java SE的平台都可以运行Minecraft,现在我们知道运行Java程序的核心组件是被称作JVM虚拟机的东东,它可以解释编译后的Java二进制文件,使其转为目标平台的机器码运行,为了提高效率,JVM虚拟机是基于栈的,编译器产生的代码也是为栈优化的。众所周知安卓APP大部分是由Java代码编写的,当然目前也有Android NDK为c++提供了Android API,这涉及到Java代码对c语言的调用。偏题了......既然安卓APP是由Java编写的,那么可不可以在Android上直接运行Java程序呢?当然可以.....不过安卓运行Java程序的核心可是和标准的JRE不同,它采用了全新的解释器和编译器,其中解释器被称作DVM虚拟机,编译器就有很多了,著名的jar2dex就是一种。要想直接运行Java程序,首先要跨越过核心的门槛。.jar是一种Java封装的可执行程序,.class是Java二进制文件。但是DVM虚拟机这些都不认,它只认.dex后缀的二进制文件,它是基于寄存器的。好在Android系统提供了一个Dx的第三方库,可以在程序中调用它对.class进行转换。Boardwalk就采用了这种高大尚的方法实现了Minecraft的转换。现在已经得到了DVM虚拟机可以运行的Minecraft,但是这就可以了吗?没那么简单。Minecraft使用了著名的Lwjgl做游戏开发,liblwjgl.so是必不可少的文件,还需要使用lwjgl的开源项目编译arm架构的lwjgl。显示方面Minecraft使用了OpenGL接口,手机显卡肯定不支持OpenGL的,一般是支持OpenGL ES接口的居多,就是两个字母的差距,这也是不可逾越的鸿沟。好在github上的glshim项目又搞出了一个ARM架构上的OpenGL接口,这个是完全的软件接口,不提供硬件加速,也就是说使用它之后你的OpenGL图形性能完全和你的处理器性能挂钩,跟你的显卡屁关系没有。虽然鸡肋了点,但是至少能够提供OpenGL 1.5的支持。目前为止显示方面算是草草了事,再说说声音输出方面。Minecraft的声音输出得益于OpenAL,这个安卓是提供支持的,因此把OpenAL规则写进程序里就行了。万事具备,那么可以愉快的玩耍了吧。但是这么一运行就发现问题了—根本就不能运行Minecraft。这是怎么回事呢?原来JVM虚拟机和DVM虚拟机终究还是两种虚拟机,很多常量的名称,数值都不同。比如简单的获取屏幕分辨率操作,两者就不是通用的。这时,有一个Github上的项目jarjar和jarjarrules在绝境中提供了一线生机。这个项目为DVM虚拟机提供了一个常量指向,也就是让程序不要读区系统常量而是读区项目提供的常量模板,这其中重新定义了屏幕分辨率,内存,cpu等等一系列数值,这也算是有点黑客的味道了。