理解J2ME平台

Sun凭借最新的Java技术试图将其进一步实现为开发者的目标平台,然而Java平台自身却分成了三种平台:Standard版、Enterprise 版和Micro版。Micro版,也就是所谓的J2ME,从问世伊始就专门设计为供内存量小和处理能力较低的移动设备作为Java开发平台使用。

从表面上看,这样做对那些希望提升应用程序的移动计算能力的开发者来说是一件好事。然而,“移动设备”这个术语却涵盖了相当广泛的领域,包括传统的个人数字助理(PDA)、所谓的智能电话、传呼机乃至GPS单元等,它们都具有各不相同的硬件配置。同样的,这类设备的市场也支离破碎,同一供应商的两种设备之间都还存在兼容性问题,更别说不同供应商的设备产品了,在很多情况下简直就是乱七八糟。 
给这些五花八门的移动设备提供一种普遍适用的开发平台看来多半是不可能的了。所以J2ME定义了两种类型的规范,它们携手提供一种移动Java平台,这两种规范就是configurations 和 profiles。Configuration和profile规范提出了相当多的技术术语,下面我们就来讨论一些。

Configuration 

J2ME 通过对Configuration的抽象来处理大量千差万别的移动设备硬件功能。J2ME configuration定义了特定设备可用的虚拟机和低级 API,同时提供相应的开发基础。目前可用的Configuration有两种,它们是连接设备配置CDC (Connected Device Configuration)和连接有限设备配置CLDC (Connected Limited Device Configuration)。

连接设备配置

CDC 应用于相对内存量较大、更强处理器的移动设备。CDC规范采用了内存优化的虚拟机,也就是所谓的CVM,通过它提供等同标准JVM的特性。按照Sun的文档说明, CDC针对新型PDA、智能通讯设备和机顶盒之类的高端设备。为了能够受到CDC支持,移动设备必须至少具备以下条件:

用于CVM和Java API库的2 MB内存。 
32位微处理器或者控制器。 
可用网络连接,最好是高带宽连接。 
连结有限设备配置
CDC的要求有利于昂贵的移动电话、IR扫描仪或类似产品。CLDC则主要针对那些更轻便、更便宜、不能满足CDC要求的设备。

CLDC采用了更轻型的虚拟机,设计为在较低内存环境下运行。这种JVM的参考实现也就是所谓的KVM,为什么要叫KVM呢?这是因为这种虚拟机的大小是以千字节度量的。CLDC 的设备需求如下:

最低160KB的内存,其中128KB用于KVM和运行时库
最低16位25-MHz处理器
有限的用户界面功能
没有(或者间歇的)低带宽网络连接
由于受到严格的内存容量限制,KVM因此缺乏一些完整JVM所提供的特性,这就是说,你可能得改变自己的编程风格了。KVM在如此低内存要求下不得不在浮点数学计算、反应和对finalizers类的支持等方面对性能折中。使用CLDC的开发者在编译程序之后必须预先采用J2ME开发工具包所提供的一种检查工具对他们的源代码进行校验。

profile

如果说配置为应用程序提供了基础,那么profile则提供了应用程序的框架。profile定义了一整套J2ME应用程序可用的API类而且专门针对给定配置创建。Sun推出了2种可用的参考J2ME profile:基础(Foundation)和移动信息设备profileMIDP(Mobile information Device Profile)。

基础profile主要用于CDC配置,因而其虚拟机几乎等同于标准的虚拟机。这意味着,使用基础profile的开发人员必须访问完整实现的J2SE特性集。

MIDP连同功能较低的CLDC配置一道为开发今天的移动设备应用程序提供了你最可能用到的Java平台。MIDP支持J2SE类库的有限子集而且为在CLDC配置上使用定义了定制的用户接口和输入/输出类。

编写一次到处可行?

兼容性如何呢?J2SE应用程序能在J2ME平台上运行吗?这些问题的答案主要取决于配置和profile的具体应用了。J2SE代码无须或者很少修改即可采用CDC和基础profile运行。然而,正如我们在这里所讨论的那样,由于主机硬件受到限制,CLDC和MIDP profile只提供了很有限的功能集合。因此它J2SE应用程序不大可能在不加修改的情况下就运行在这类平台上,除非它把自己限制在两种平台的API交集之内(严重地限制了其功能)。因为CIDC的要求对应了今天大多数手持设备的功能,所以任何J2SE应用软件想不经修改就运行在给定的设备上是值得怀疑的。你多半得修改需要移植到 J2ME的应用软件。但也别紧张。从保住饭碗的角度看这未尝不是好事。