在今天的生活中,个性化的智能信息用品已经是必须品。这些用品包括移动电话、机顶盒、双向寻呼机、智能卡和掌上电脑等。在几年前开发人员很难想像能够用一种统一的开发方式来开发运行在这些设备上的程序,也很难想像在这些设备上开发兼容的程序,而现在借助 Java 的能力这些都成为可能。
Sun 公司将 J2ME (Java 2 Micro Edition,Java 2微型版)定义为“一种以广泛的消费性产品为目标的、高度优化的 Java 运行时环境”。自从 1999 年 6 月在 JavaOne Developer Conference 上声明之后,J2ME 进入了小型设备开发的行列。通过 Java 的特性,遵循 J2ME 规范开发的 Java 程序可以运行在各种不同的小型设备上。
Sun 公司希望借助J2ME 这把利剑对嵌入式设备这个混乱的领域进行统一,让Java 的范围扩展到所有的电子设备开发上,按照现在的发展速度,J2ME 很快将被广泛应用于消费和嵌入式设备中。
与以前 Sun 公司推出的J2EE (Java 2 Enterprise Edition,Java 2企业版)、J2SE (Java 2 Standard Edition,Java 2标准版)规范相比,J2ME 不是一个单独的技术规范,而是一系列技术规范总称。这些规范定义了 Java 技术在资源限制的设备中的表现形式。J2ME 主要适用于小型嵌入式设备,这些设备与PC或是服务器设备相比没有统一的硬件标准、外观与操作方式,其功用也是千差万别。但是J2ME 在适用于这些设备的同时也保留了 Java 的传统特性,即任何时间和任何地点的代码具有可移植性、部署灵活性、安全的网络传输性,以及代码稳定性。正是因为如此,开发人员才可以借助J2ME 力量让编写的程序能够运行在其他型号或厂商的设备上。
Java 程序是以边解释边执行的方式运行的,所有的Java 程序都会被编译成为二进制代码并运行在Java虚拟机上( J2EE、J2SE 中的Java 虚拟机简称为 JVM)。而J2ME针对的设备主要是嵌入式和消费类的设备,因为这些设备内存和处理器的限制,所以J2ME 所包含的类库也比较小一些,相对于J2SE的类库来说作了一些剪裁,虚拟机的功能也相对简单。
在 J2ME 中有两类虚拟机:CVM (C Virtual Machine,C虚拟机)与 KVM (K Virtual Machine,K虚拟机)。KVM 和 CVM均可被看作是一种 Java 虚拟机,是 JVM 的子集,在功能上都是 JVM 的缩减版。这两类虚拟机的适用范围并不相同,简单地说,CVM 的功能比KVM 功能更为强大。在读者阅读完1.1.3、1.1.4节后,将会更清楚地了解这两种虚拟机的具体适用范围。
运行在J2ME 上的程序大致分为两种:
l J2ME Application :运行在CVM之上。
l MIDlet (Mobile Information Devices let,移动信息设备小程序):程序运行在KVM之上,MIDlet 程序的开发也就是本书要讲述的内容。
J2ME面对的是大量各种不同的小型嵌入式设备,它们在外观和功能上均各不相同。J2ME将这些设备进行分类,将一些共性提取出来形成适合于某个范畴中设备可用的规范,称为“配置”。读者也可以将配置理解成为对硬件的描述,所以通过定义配置的方法就能够清楚地描述硬件功能。
在 J2ME 中配置可以分为两类:
l CDC (Connected Device Configuration,连接设备配置),运行在这一配置上的程序称为J2ME Application,在CVM上进行解释。
l CLDC(Connected Limited Device Configuration,连接限制设备配置),运行在这一配置上的程序称为MIDlet ,在KVM上进行解释。
从设备的硬件功能角度来看, CDC主要针对32位的处理器主频通常在75MHz以上,内存可能在1~4MB;而CLDC主要针对16位、32位主频在 16MHz以上的处理器,设备的内存比较少,可能只有512KB,甚至更少。因为 CDC 与CLDC 针对的设备CPU 处理能力和内存是不一样的,所以它们所使用的虚拟机和核心类库也不相同,CDC的核心类库也比CLDC的核心类库要大。CDC用的虚拟机是CVM,而CLDC用的是KVM,CVM 比KVM 包含更多的功能和支持更多的特性。
从设备的用途和功能的角度来看,CDC 针对的设备主要是数字电视、机顶盒、网络电话、车载计算设备等。这些设备的特点是有线连接、电源稳定、设备资源比较受限。而 CLDC 针对的设备主要是移动手持设备,例如 PDA、POS 机和智能手机。这些设备的特点是无线连接、没有稳定的电源供应(通常使用电池)、设备资源极少。目前在国内外用得比较广泛的CLDC是在智能手机上的应用。
J2ME 使用配置(CDC或CLDC)和简表(Profile)定制JRE(Java Runtime Environment, Java 运行时环境)。一个完整的 JRE由配置和简表组成,配置决定了所使用的 JVM(可能是CVM 或 KVM),而简表通过定义特定的类来为应用程序提供功能上的支持,一个简表定义了设备所提供的 API 集合。
对比前面简表的定义可以知道,MIDP (Mobile Information Devices Profile,移动信息设备简表)是简表的一种,定义了移动信息设备的类型和提供相关的API (Application Programming Interface,应用程序编程接口)集合, MIDP 所定义的功能更加面向用户,而且比 CLDC 更高级。
具体地讲,在进行MIDlet程序开发时所使用的API 来自于:
l CLDC v1.0规范中定义的4个包 java.io、java.lang、java.util 与javax.microedition.io ,提供Java语言和CLDC 设备所支持的基本功能。
l MIDP 所定义的其他包有javax.microedition.midlet 、 javax.microedition.lcdui 、 javax.microedition.lcdui.game、javax.microedition.rms 等,提供诸如程序生命周期控制、用户界面、游戏、持久存储这样的功能。
为了理解虚拟机、配置和简表之间的关系,图1.1 将这3个概念进行对比。在对比J2ME 内的不同虚拟机、配置和简表的同时,也将J2ME 结构和J2SE 结构进行了对比。
1.1.4.1.1 图1.1 不同虚拟机,配置与简表之间的关系
在图1.1 中出现了 KJava 这个字眼,这对于了解过手机程序开发的朋友一定不陌生,曾经有一段时间KJava 程序开发几乎等同于手机上的 Java 程序开发。在这里,为了纠正一下这个看法有必要解释清楚 KJava 所代表的含义。KJava 是Sun 公司开发的一种简表,它包含了 KJava API。KJava并不作为一种完整的、功能齐全的简表,Sun 公司最初推出 KJava 时只是作为一种示范简表,即用于演示简表如何与 CLDC 一起工作。由于 KJava 出现较早,因此早期的部分手机设备都选择支持KJava 所定义的API。因此,如果把手机上的Java编程都称为KJava编程说法那是不正确的,把KJava程序开发和MIDP 程序开发等同也是不正确的。由于历史原因,到目前为止 KJava 已经被广泛使用,但是作者相信 MIDP 将会逐渐取代KJava的地位,毕竟MIDP 是一个更为开放的标准。
MIDP 和 KJava 一样,也是建立在 CLDC 之上的,并且提供一个标准的运行时环境,允许在终端用户设备上动态地部署新的应用程序和服务。与KJava不同点在于,MIDP 是一个公共的、为移动设备设计的工业标准简表,它不依赖某个特定的商家。对于移动应用程序开发来说,它是一个完整的、受支持的基础。因此现在新的智能手机设备,如果支持J2ME 都会选择支持MIDP ,而不是KJava 。
除MIDP简表外,目前还存在其他类型的简表,例如:
l Foundation Profile(基础简表):提供除了用户界面以外 J2SE 所能够提供的标准类库。
l Personal Profile(个人简表):针对那些资源相对有限,但是对网络访问要求很高的设备,例如Web-TV、汽车导航系统等。
相信在以后随着J2ME 更广泛地推广和应用,会逐渐出现其他类型的简表。
在功能方面,MIDP v1.0规范中包括:
l 应用的下载。
l 应用的生命周期。
l 端到端的传输协议,例如HTTP (Hyper Text Transmission Protocol ,超文本传输协议)。
l 网络连接。
l 持续性存储。
l 定时器。
l 用户界面。
现在MIDP最新的规范为 v2.0,MIDP v2.0新增加了以下内容:
l 应用程序的下载和计费。
l 在 HTTP 的基础上提供了端到端的SHTTP(Secure Hyper Text Transmission Protocol ,安全超文本传输协议)安全传输。
l 应用程序的数字签名和域的安全模式。
l MIDlet 的 push 注册。
在安全方面,J2SE 中Java 程序是运行在沙箱机制下的,为了限制程序对资源的访问,资源被分为两类:受限资源和非受限资源。当程序运行时,只有那些被信任的程序才能够访问受限资源与调用相关的 API。在 J2ME 中为了达到安全的目的也继承了沙箱机制,此外,MIDP v2.0引入了信任的 MIDlet 的新概念。当无线信息设备检测到一个程序是被信任的程序时,则此程序允许访问安全机制所规定的API。例如,这些API 可以访问手机内地址本,或者可能是允许访问无线网络。
J2ME / CLDC / MIDP架构是专为移动通讯设备而设计的。有了前面的介绍,下面再用图1.2 说明MIDP和CLDC之间的关系。
1.1.5.1.1 图1.2 CLDC 与 MIDP之间的关系
在图1.2中,读者可以看出:
l MIDP 建立在 CLDC 功能的基础之上。
l J2ME 规范允许设备制造商提供与自己设备相对应的 API 供程序调用,一般来说,设备厂商都会提供一些自己的API 供开发人员使用,这些功能都是有针对性的,因此在不同的设备之间可能无法移植。一般来说,这部分API能够提供额外的功能或者在运行性能上有所提高。
此外,在图1.2中可以看出CLDC 之上有两类API:
l MIDP API:这些API 正是MIDP 规范所要定义的API 。
l OEM Specific API:MIDP规范所涉及的无线通讯设备多种多样,因此它不可能涉及所有设备的需求。因此这一类的API是由 OEM 厂商提供的,以便访问特定设备的特定功能。但基于这些API 的应用可能不在其他的MIDP设备上运行。关于这一部分,各个手机厂商都提供了自己的开发包,读者可以到手机厂商网站下载。
这里需要澄清一个概念,无线通信设备并不等同于移动信息设备。尽管就目前的实际情况来讲,MIDP 规范主要是在无线通信设备中得到了广泛的应用。
用Java编写程序的最大好处莫过于一次编写,随处运行。但是由于J2ME/CLDC/MIDP架构的限制,同一个Java程序只能在相同的MIDP支持下运行。要完整地定义所有的移动设备是非常困难的,但是随着MIDP的标准化和各个设备厂家对MIDP的支持,在标准的MIDP下开发的Java应用程序能够在支持标准MIDP的设备上运行。目前市面上大多数的智能手机都能够支持MIDP v1.0,而且已经开始出现支持MIDP v2.0 的手机,例如Nokia 的 S90系列, SonyEricsson 的P900系列。
有一点必须要提醒读者注意,CLDC和MIDP是J2ME 中两个不同的规范,在 CLDC v1.0 和MIDP 1.0 规范下,这两个部分是没有交叉的,但是当MIDP 2.0 发布时,除了在 MIDP 所提供的 API 中进行了改动,还在 CLDC 所提供的 API 中增加了部分功能。例如 javax.microedition.io是由CLDC 规范所定义的,但在 MIDP 2.0 发布时 javax.microedition.io 包中增加了对套接字,串口等的支持。读者在学习时需要注意这一点,当查看某个 API 时,可以从帮助文档中发现此 API 是属于哪个规范定义的,避免引起理解上的混乱。
J2SE 为桌面开发和低端商务应用提供了可行的解决方案,J2EE为了各种企业应用的开发提供了解决方案,而J2ME则希望让自己成为小型设备和嵌入式设备的开发人员的最佳选择。
图1.3 描述了Java体系结构中 J2EE、J2SE 与 J2ME 对于设备的应用范围。
1.1.6.1.1 图1.3 J2EE、J2SE和J2ME 的应用范围
l J2SE:是为桌面 PC而设计的,主要运行在 Unix 、 Linux、 Microsoft Windows等操作系统上。
l J2EE:是一个适合分布式的、多用户、企业级应用系统运转的平台。它以J2SE为基础,增加了处理服务器端计算的功能。
l J2ME:和J2SE不同,它并不是一个单一的规范。准确地说,J2ME是为了支持像小型嵌入式设备或移动设备而制定的一系列的技术和规范的总称。在提供类似的类库的同时也对 J2SE 中的类库进行了裁剪