J2ME的标准很多,这里我们只简要介绍几个基本而重要的标准。读者也可以直接去查标准的正式文档,在JCP网站可以找到所有J2ME标准和规范,包括还在提出和审核阶段,没有正式成为标准的提案。
虽然J2ME标准繁多,但只要把握住标准划分的原因就很容易掌握。在这个技术飞速发展的领域,我们不能把眼光局限于标准的字面含义,而要灵活掌握,把握其精神。比如,CLDC和CDC的定义中具体的最小内存需求仅仅是"最小的",随着硬件能力的飞速发展,很有可能一些界限会变得模糊。PDA本来应该属于CLDC的范围,但是Compaq的iPaq上却实现了CDC。以后的下一代PDA有64M内存并不意外,在其上实现CDC也是完全可能的。但是,从功能的角度,应该还是CLDC以及PDA Profile更适合于PDA的条件。到那时,具体的实现就要看厂商和开发者的选择了。还需要注意的是,由于Profile是建于Configuration之上,作为对Configuration的扩展,因此Profile必须Configuration的支持。有的文章在讲到MIDP的内存需求时,说MIDP需要最少256K,这是指MIDP本身。而有的文章说MIDP需要最少768K,那时因为把作为基础的CLDC所需要的512K算进去了
CLDC
CLDC(Connected, Limited Device Configuration)针对个人化的移动的有限连接信息设备,例如智能手机,双向呼机,PDA等等。其要求是:
512 KB 以下内存
有限能源供应(通常使用电池)
有限或非持续网络连接
简单的用户界面(甚至没有)
在如此严格的限制之下,CLDC 只包括四个包,其中三个来自标准 Java 规范并且作了缩减(java.lang、java.util 和 java.io),另一个专门针对CLDC (javax.microedition)。
包 描述 类和接口数目
java.io 系统输入输出 18
java.lang Java 编程语言的基本类 38
java.util 集合、日期和时间支持、各式实用工具类 10
javax.microedition 通用连接框架(Generic Connection Framework) 10
CLDC必须照顾最苛刻的硬件条件,因此去掉了许多重要的类和特征,只保留了最核心的一些基本类。例如RMI和映射因需要内存太多而被舍弃,错误处理要求的代价太高,也被删除了。许多设备不能支持浮点数,更不用说双精度类了。还有许多设备没有或不提供访问一个文件系统的功能或权限。不过请放心,对于那些能够支持更多特征的设备,它们所需要的这些功能或者超出标准J2SE要求的功能,都可以由针对此类设备的Profile来补充。
CLDC中唯一新增的javax.microedition包定义了一个通用连接框架(Generic Connection Framework,GCF)。通用连接框架把J2SE中的文件,sockets,HTTP请求和其他输入/输出机制的概念抽象为更简单的一套类。可以说,它提供了java.io和java.net的同样功能,却不需要设备的特殊能力。与底层操作系统无关是Configuration的基本要求。通用连接框架可以看成是构造通讯驱动的框架,这一点类似于J2SE中的JDBC,后者是一个构造数据库驱动的框架。通用连接框架并没有定义对任何特定协议的支持,但是在Sun的一个CLDC参考实现中确实包括了对一些通讯协议的支持,这点使许多人感到困惑。那些协议只是一些例子,协议的支持应该在Profile层或者专门针对某设备的扩展中定义。
由于虚拟机处于Configuration中定义平台的核心,Configuration和虚拟机是紧密相关的。既然CLDC的硬件要求如此苛刻,对其虚拟机也就有着非常高的要求。Sun提供的参考实现是KVM(K Virtual Machine)。KVM是完全从头开始编写的,其设计目标包括:
虚拟机的大小和类库为50到80KB左右
内存占用为几十K
在具有 16 位和 32 位处理器的设备上,有相当的性能
高度可移植和可扩展,特定于机器和/或平台的代码的总量很少
多线程和垃圾回收是独立于系统的
可以对虚拟机的组件进行配置,以适合于特定设备,从而增强了灵活性
KVM的实现是相当成功的。最早在1999年JavaOne大会的时候,作为Sun的Spotless计划派生结果,Sun分发了许多Palm V,提供了Palm OS上的第一个KVM版本和一个实验性的类库com.sun.kjava。这一KVM非常小而紧凑,只需要几十K内存。而com.sun.kjava类库提供了Palm的图形用户接口,Palm数据库访问,简单的集合类等等。将两者结合,开发者就可以开发Palm上的Java应用,因此它受到了开发者的广泛欢迎,网上也有了许多教程和示例代码。事实上,到目前为止,这都是在Palm上开发Java程序的唯一合理途径。CLDC没有定义用户界面等API,MIDP并不适合PDA,对应的最合适J2ME标准是PDA Profile,但是尚未完成。许多开发者强烈要求Sun在正式的J2ME标准中继续支持它,但是Sun已经放弃了这一技术,而且并不保证正式的PDA Profile与之的兼容性,因此不建议读者过多研究。
由于这一历史原因,造成了很多名词上的困扰。许多早期的文章把这一KVM与com.sun.kjava包合称为KVM,表示这一技术,而现在所说的KVM应该是单单指Sun的CLDC虚拟机参考实现。甚至还有人用K Java作为J2ME的代称,表示基于KVM的Java,这很容易和正式的J2ME标准以及早期的com.sun.kjava包相混淆,读者在看这类文章时需要注意文章的时间和背景,并采用严格的正式名称。
目前Sun还正在开发KVM的一个高性能版本--Project Monty虚拟机以用于下一代的移动信息处理设备。它采用了Hot Spot的技术,性能将比现有的KVM将近高一个数量级。
虽然KVM作为Sun的参考实现最经常被提到,不过并不等于一定要用KVM。其它公司的虚拟机只要满足相应的Configuration里的定义,通过兼容性测试,一样可以作为Configuration的虚拟机。目前IBM WebSphere Micro Environment,已经通过了"Java PoweredTM"认证,其J9虚拟机在相当多的平台上通过了J2ME兼容性测试:
MIDP
MIDP(Mobile Information Device Profile)定义了针对移动信息处理设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,无线电话网络连接之上的一些消息处理(例如短消息),安全等等API,并且考虑到了移动信息设备的屏幕和内存限制。类似于J2SE中的Applet框架,MIDP提供了基于javax.microedition.midlet 包的MIDlet应用程序框架
PDA Profile
PDA Profile将在CLDC的基础上,提供针对PDA的用户界面,数据存储等扩展API。用户界面部分适用于有限大小和色彩的显示,为了支持开发者已有的经验基础,将是AWT的一个子集,也有可能在AWT子集之上加入MIDP用户界面组件。而存储机制将是简单的,平台无关的,类似于MIDP中的存储,为应用程序、数据、配置/环境信息提供简单的数据存储。
CDC
CDC(Connected Device Configuration)针对有固定的不间断网络连接的共享连接信息设备,如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等。
CDC要求为Java提供至少2M的内存,这可以是ROM加上RAM,也就是说,Java虚拟机和核心类库很有可能放在ROM或者Flash里。事实上,下一代无线手持设备完全可以满足CDC的需求。
CDC是CLDC的完整超集,包含了所有的CLDC规范。另外,在相对充裕的条件下,它支持J2SE的标准 Java 虚拟机和一部分核心类库。
其次,CDC支持标准的J2SE虚拟机,这只是Java平台的基础,并不包括建筑于平台基础之上的各种类库。特定设备需要的特定类库由相应的Profile来定义。还是那个关键:Configuration定义的是一类设备的与设备无关的最小平台,因此,诸如用户界面之类的类都被分离,留在Profile中定义。
虽然CDC支持标准的J2SE虚拟机,但是标准的Java虚拟机显然无法适应有限的资源环境。为此需要专门定义一个虚拟机,称为CVM(开始的时候,CVM代表Compact Virtual Machine,但是后来Sun的工程师认为这有可能与KVM相混淆,因此现在C并不代表特定的含义)。CVM除了支持标准J2SE虚拟机的所有特性外,还支持许多嵌入系统需要的特性,更适合于在资源限制条件下运行,移植性很强。目前Sun提供了Linux和VxWorks之上的CVM参考实现(reference implementation)。
Foundation Profile
Foundation Profile提供除了用户界面以外CDC所缺少的几乎所有标准J2SE核心类库,作为其他所有Profiles的基础(我们看到,多个Profile可以共存,也可以叠加)。
Personal Profile
Personal Profile针对那些资源相对有限,但是需要高度的Internet和WEB连接支持的设备,例如Web-TV,汽车导航系统等等。它在Foundation Profile的基础上提供了网络特性以及支持Java applets的 GUI。
Personal Profile的前身是Personal Java,Personal Java是Sun为资源限制设备创建 Java 平台版本的早期尝试。Personal Profile将与Personal Java 1.1和1.2向后兼容。
RMI Profile
RMI Profile在Foundation Profile的基础上提供RMI支持,将允许网络设备与其它系统应用程序(不一定是J2ME的)交互操作。(