J2ME基础知识
Java发展历史
相信熟悉Java 演进历史的人或多或少都听说过,Java 技术一开始并非就叫做 Java ,而是叫做OAK ,而且最早的时候就是为了嵌入式系统而设计的一项产品。後来因为网际网路的发达,而OAK 的诸多特性刚好又适合用在网路上(例如可移植性、编译後程序码很小),因为商标已被注册的关系,因此 OAK 被改名成Java ,从此因缘际会地成了网路上的闪亮巨星,并随著时间越来越成熟,也慢慢地产生了许多非原本预期中的相关运用。虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。
虽然从Java 1.0 发表之後,Java 就被广泛地使用在桌上型应用程序以及Applet 的开发上,但是,从Java 1.1 开始,Java又回到了它一开始的老路--也就是嵌入式系统方面的应用,在当时Sun Microsystems 发表了Embedded Java 与Personal Java(也有人简称为PJava)这两项规格。其中Embedded Java 是为了资源十分有限,而且没有显示设备的嵌入式装置而设计; Personal Java 则是为了在能够与网际网路连线、并拥有显示系统(例如彩色LCD)的消费性电子装置而设计。接著Java 的版本演进到Java 2 ,这时为了再明显区分各种Java 的应用,所以分割出了J2EE 、J2SE、以及 J2ME 三种版本。这三种版本的各种特性我们已经在前面已经详细地描述,在此不再赘述。不过请大家记住,由於 Java 2将Java 的应用区分成三大块,使得 Java 程序语言的发展不会再像Java 1.1时如树枝状般扩散出去,这么一来有助於大家对 Java 各种应用的澄清,而不会造成今後越发展下去越不可收拾的混乱局面。额外向大家一提的是,後来Personal Java 发展到1.2 版的时候,也采用了一些Java 2 平台上与安全性有关的设计。
J2ME
J2ME 在设计其规格的时候,遵循著「对於各种不同的装置而造出一个单一的开发系统是没有意义的事」这个基本原则。於是 J2ME 先将所有的嵌入式装置大体上区分为两种 :一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA 、手机);另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机上盒 (set-top box))。因为这两种型态的嵌入式装置,所以Java 引入了一个叫做Configuration 的概念,然後把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而另外一种装置则规范为 Connected Device Configuration(CDC)规格。也就是说, J2ME 先把所有的嵌入式装置利用Configuration 的概念区隔成两种抽象的型态。
其实在这里大家可以把Configuration 当作是J2ME 对於两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的 Java程序所能使用的类别函式库、这些规范之中所定义的类别函式库为 Java标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就CLDC 的规范来说,可以支援的核心类别函式库为java.lang.*、java.io.*、java.util.*,而支援的扩充类别函式库为 java.microedition.io.*。区分出两种主要的Configuration 之後,J2ME 接著在定义出Profile的概念。Profile 是架构在Configuration 之上的规格。之所以有Profile的概念,是为了要更明确地区分出各种嵌入式装置上Java 程序该如何开发以及它们应该具有哪些功能。因此Profile 之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而 Java 程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile 里头。Profile 之中所定义的扩充类别函式库是根据底层Configuration 内所定义的核心类别函式库所建立。
虽然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是针对少于512KB内存footprint的设备的配置。CLDC 采用的是KVM,它是高度优化的JVM方式,他针对的是16比特或32比特的微处理器,160到512 KB内存为基础的低端,网络连接,电池驱动的设备。典型的内存要求是128KB做有来存储KVM和相关的库。更多关于KVM的信息可以从Sun公司的 KVM白页中得到。
就网络化而言,CLDC针对的是有限的和间歇性的无线连接设备,所有在J2ME CLDC之上运行的应用软件都应能在其他任何高端的Java VM上运行。当然,这需要CLDC库的支持。CLDC配置关注于I/O,网络化,安全问题,国际化问题和核心Java库等相关的领域。
与事件处理,用户和应用程序的互动,应用程序生存期管理等内容相关的领域是由Profile来处理的。使用界面定义(对于特定的设备,如传呼机,移动电话和 PDA)也在Profile层的范围之内,它建立在顶端之上,并使用J2ME配置。Mobile Information Device Profile (MIDP)是一个J2ME profile,它定义了使用CLDC配置设备的用户界面相关的规范。
CLDC从 J2SE获得绝大多数的类,但一些针对小内存footprint设备的新类并不是从J2SE APIs获得的。关于类从J2SE 做继承和新CLDC类的具体信息,可参考CLDC规范1.0a版本的6.2和6.3中的内容。Java语言规范中的一些例外是没有浮点支持,没有类实例的完成化支持和有限的错误处理能力。
在这里提到CLDC HotSpot应用也是具有相关性的,它相当于使用CLDC配置的设备的KVM中Java VM的替换。根据Sun公司,CLDC HotSpot执行VM是一个高性能的JVM(32位,采用CLDC v1.0规范)。他在相同的内存footprint上运行时提供比KVM高出一个数量级的更佳的性能。
CDC:完全的Java平台
CDC是应用在具有较大内存,特别是2MB以上的设备上的,CDC针对有限和间歇的无线连接设备,CDC与CVM和Foundation profile共同定义了完全的J2ME环境。
CVM是为用户和嵌入设备设计的完全功能性JVM,它支持所有的Java 2 v1.3 VM安全防护,JNI, JVMDI, RMI,弱引用功能和库。本质上说,CVM具有所有一个驻留桌面系统的JVM所具有的功能。
CDC由J2SE中最小的Java数据包组成。Foundation profile由用户设备所需要的保持类库和APIs所组成。因此,如果你工作在一个以CDC为基础的J2ME环境下,你就需要更新你代码以使APIs更新换代。
CDC是CLDC的一个扩展集,所以在两种配置之间存在着向上的兼容性。CDC和Foundation profile也提供了对使用PersonalJava实时规范开发的应用程序的完全兼容。
J2ME 的平台无关性主要指的是设备的宿主操作系统平台。由于Java平台建筑于虚拟机之上,只要不同的操作系统上的虚拟机满足同样的规范和标准,对于虚拟机以上的层次是平台无关的。这使得针对某一Configuration或者Profile的应用可以运行于所有实现了这一Configuration或者 Profile的操作系统平台。举例来说,目前已经有网站开始收集基于MIDP的程序--MIDlet,提供下载和收费,各种支持MIDP的设备都可以使用,这包括数量巨大的智能手机和几乎所有的PDA(Palm OS和Pocket PC)。