级别: 初级

董 向辉 (该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。), 中科院自动化所人工智能实验室博士生

2001 年 11 月 03 日

明天的计算将进入普 及计算时代。各种消费电子产品,包括智能手机,PDA,Web-TV,将来的信息家电等等将实现随时随地的计算。这是一个异常广阔和丰富多彩的领域,其设 备极度多样化而且都将在网络中,Java技术的跨平台性和网络功能在这里大有用武之地。这就是J2ME,这一丰富多彩的领域中生机勃勃的技术。但是,这一 领域的多样性和 J2ME标准的复杂性很容易让初次接触者困惑。如果他试图写一个能在自己的PDA上运行的程序,很有可能会遇到许多困难,因为已有的旧的技 术很有可能会被放弃,真正适合PDA的标准尚未完成,多种多样的标准和技术本身也在迅速发展变化。为此,本文的重点不在于具体的编码细节,而在于从概念上 更准确地表述J2ME的体系结构,帮助读者理解和把握这些复杂的标准。并且从宏观上描述平台和标准的发展,分析在移动信息设备上开发J2ME应用的现状和 前景,尽量让读者能够从全局上把握复杂的局势,为将来的发展做好准备。

在今天计算已经无处不在。越来越多的人开始认为,经过了许多人共用一台计算机的大型主机时代,一人一台计算机的个人PC时代之后,下一 个时代就是一人多台计算设备的普及计算时代(Ubiquitous Computing,IBM称之为Pervasive Computing)。计算设备将从单一的PC扩展到各种各样的大小和功能,从家庭消费电子产品,到个人随身携带,穿着,车载的各种移动信息处理设备,多 样化是这个领域的最大特点。

网络是这个领域最重要的增值特性。当手机可以随时随地无线上网,PDA可以和个人 PC同步,车载PC可以获得网上GPS地图数据时,这 些孤立的设备才能够发挥最大的作用。

而平台无关性和网络功能正是Java的设计目标和能力(事实上,Java最初的设计目标就是用于消费电子领域,但是后来在PC和服务器 上得到了发展)。"一次编写,到处运行"的平台无关性,对网络,多重设备间联网的机制(JINI)显然对这个领域是至关重要的软件条件。这个领域内的 Java标准就是J2ME。

J2ME 的由来

Java的最大目标和特点,就是"一次编写,到处运行"的平台无关性。但是,很自然的,正如Sun认识到的,"One size does'nt fit all",一套标准无法适应各种不同的需求。因此,Java技术目前共有三套,分别针对不同的平台和应用。

  • Standard Edition(J2SE,标准版):针对桌面端PC和工作站的个人和低端商务应用。
  • Enterprise Edition(J2EE,企业版):针对服务器端企业级应用,支持Servlets, JSP 和XML等等。
  • Micro Edition(J2ME,袖珍版,也有翻译为小型版或者移动版的。)针对有限内存,显示和处理能力的设 备,主要是消费电子和嵌入式设备领域(这实际正是Java语言设计最初的目标领域)。


在消费电子和嵌入式设备领域,内存从几百K到几十M,从没有屏幕到Web- TV,CPU从低功耗的嵌入式处理器到206MHz的 RISC处理器,硬件条件的差异是相当大的。这就使得J2ME的标准需要有不同的层次和类别来适应这个复杂的领域,因此相比之下J2ME就比J2SE和 J2EE的标准要复杂得多。关于J2ME标准的文章已经有了不少,但是很少有文章清晰扼要地讲清楚J2ME的体系结构划分的原因,而只有清楚了划分的根据 和为什么这么划分,才能够更好地理解标准。尤其是因为硬件发展速度是很快的,很有可能一段时间之后,如果还按最初标准的字面定义区划分设备就会陷于迷惘。 作者阅读和浏览了相当多的文章和介绍,但有些问题也还是最近才认识得比较清楚,在此和读者分享我的认识,也希望得到建议和指正。因此,下面的介绍尽量不去 重复其他文章中都已介绍过的一些具体细节,不去翻译规范的字面定义,而是分析规范制定的原因,类别划分的真正标准,从开发者的角度,让读者能够在这个复杂 而多变的领域中更准确地把握技术的区别和趋势脉搏,更好地为将来广阔的机会做好准备。





回页首


J2ME 体系结构――Configuration和Profiles

针对消费电子和嵌入式设备领域丰富多样的设备和彼此相差极大的计算能力及各种硬件条件,J2ME首先根据最基本的一些特征把它 们划分为两类。

  • 具备间断网络通讯能力的个人移动信息设备:如手机,双向呼机,PDA(Personal Digital Assistant,个人数字助理,也称掌上电脑)等等。
  • 有固定的不间断网络连接的共享连接信息设备:如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等等。

Sun的J2ME FAQ(常见问题集)里有一个很好的概括:J2ME技术有两个设计中心?D?D手持的设备,和可以插到墙上插座的设备。第一类设备往往是个人化的,移动 的,使用电池,体积和功耗都有限制,因此功能和计算能力有限。第二类设备一般是固定的,因此体积没有太大限制。由于固定,可以有持续电源供应,因此功耗没 有太大问题,计算能力相对充裕。

计算能力是这两类设备的主要区别,对其上可能的应用和环境显然有着本质影响,不同类别的设备不可能采用同样的Java平台,必须分别定 义。针对这两大类设备的平台规范就是Configuration(有译为配置的,不过我认为最好不译)。第一类设备的Configuration称为 CLDC(Connected, Limited Device Configuration),第二类称为CDC(Connected Device Configuration)。

属于同一类的设备计算能力是相似的,但是其他功能和条件还有非常大的区别。作为Java平台必须保证相容性,这就必须舍弃所有的设备特 殊性。因此,Configuration就是支持一组通用设备的最小Java平台,作为这些设备的最小公分母来保证不同设备间的平台相容性。这里的 Java 平台主要是指Java虚拟机(JVM)和核心库。

在Configuration中舍弃了设备的特殊性来保证Java平台的相容性,但是仅仅有Configuration显然是不够的, 特殊的具体设备其独有的功能和硬件条件都没有得到支持。为此,在Configuration的基础上,根据设备具体功能再进行一次划分,比如智能手 机,PDA等等。功能的划分也就是其他硬件条件的划分,比如屏幕大小,内存,计算能力,电力供应等等都是从属于功能的,因此同功能的设备的硬件条件都是非 常相似的。Profile(译为简表或者简档)就是针对每一类功能设备的特殊性定义的与设备特性相关的API,建筑于Configuration之上,作 为Configuration的扩展和补充。例如MIDP(Mobile Information Device Profile,移动信息设备Profile)就定义了关于移动信息设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处 理,持久性存储,短消息等等的API,并且考虑到了移动信息设备的屏幕和内存限制。而正在制定中的 PDA Profile则定义了针对PDA的API,其屏幕,内存条件都要大于MIDP,但是网络方面的要求则显然和手机有所不同。如下图所示,同属于一个 Configuration的设备根据功能不同由不同的Profile来支持,Profile体现设备的特殊性,但是都建筑在一个共同的基础 Configuration平台之上。



关于J2ME的体系结构,我们可以这样总结:

Configuration的分类是根据计算能力的不同来划分的,同类设备的计算能力相近。Configuration是一个规 范,定义了这类设备的共同Java平台,定义与设备无关的Java虚拟机和核心库,是平台相容性的基础。Profile的分类是根据设备功能划分的,同类 功能的设备其他各种硬件条件和需求也相近。Profile是一组API,在某一 Configuration的基础上扩展了针对设备特定功能的API,使得 标准能够完全适应特殊的设备,彻底发挥设备的功能。

J2ME 体系的一般结构是:由Configuration定义的Java虚拟机运行于设备的宿主操作系统之上,构成整个平台的基 础。 Configuration提供了基本的语言特性,Profile提供针对设备的特殊功能API和扩展类库。应用程序的运行环境需要一个 Configuration 和至少一个Profile,多个Profile可以共存,也可以叠加。

我们用两个具体设备的实现作为例子说明。在一个运行Palm OS的PDA上,Configuration采用CLDC,虚拟机采用KVM(虚拟机和 Configuration是紧密相连的,KVM只是CLDC定义 的一个参考实现(reference implementation),并不是唯一的选择),然后采用PDA Profile的Profile。在另一个运行Symbian的智能手机上,则可以采用KVM,CLDC,MIDP。



注:在JCP(Java Community Process,J2ME标准在这里制定)的网站上已经提出了JSR 68(Java Specification Request,标准提案),将在下一代J2ME标准中用Building Block概念来取代Configuration。其原因是,Profile经常需要提供J2SE中已有的功能,为了能够利用已有的J2SE API而不是重新制定新API,引入了Building Block概念。一个Building Block定义一个来自J2SE或者J2EE的API以用于J2ME。这样,Profile就可以通过 Building Block来利用已有的API。





回页首


J2ME 主要标准简介

J2ME的标准很多,其中许多细节凡是关于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)。

表 1. CLDC 中的包

描述 类 和接口数目
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应用程序框架。

由于MIDP提出较早,目前重要的智能手机和PDA操作系统上都已有了相应的实现(后面将简要介绍这些操作系统),网上也有许多教程与 文章,一般所谓的Wireless应用文章都是关于MIDP的,这里就不再重复了,读者可以参 考文末的资源

PDA Profile

PDA Profile将在CLDC的基础上,提供针对PDA的用户界面,数据存储等扩展API。用户界面部分适用于有限大小和色彩的显示,为了支持开发者已有的 经验基础,将是AWT的一个子集,也有可能在AWT子集之上加入MIDP用户界面组件。而存储机制将是简单的,平台无关的,类似于MIDP中的存储,为应 用程序、数据、配置/环境信息提供简单的数据存储。

目前这一规范正由Palm Source公司(从Palm公司分离出来的专门负责Palm OS的公司)领导主持,已经在4月8日开始进入了JCP流程的第二阶段Community Draft最后部分(Community Draft Ballot 08 Apr, 2002 ),估计最终正式版本应该在7月至9月左右完成。(参考http://jcp.org/introduction/timeline/index.en.jsp) 前面已经提到,PDA Profile将取代 k java,作为针对PDA的正式J2ME标准。因此建议希望在PDA上开发应用的开发者等待这个标准的出台和相应的实现,现在如果要进行MIDP的应用开 发,则应明确其目标是智能手机类的设备,而不是PDA,这一点很多文章都没有讲清楚。

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支持Java语言 的完整实现,这是很容易引起混淆的。

首先可以肯定,既然CDC是CLDC的超集,基于CLDC的程序在CDC内是完全兼容的。不过这里的CLDC程序必须只用到CLDC的 部分,一旦采用了某一个Profile,显然也就不能在CDC内兼容了。



其次,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的)交互操作。





回页首


J2ME 的平台无关性和标准的兼容性

平台无关性主要指的是设备的宿主操作系统平台。由于Java平台建筑于虚拟机之上,只要不同的操作系统上的虚拟机满足同样的规 范和标准,对于虚拟机以上的层次是平台无关的。这使得针对某一Configuration或者Profile的应用可以运行于所有实现了这一 Configuration 或者Profile的操作系统平台。举例来说,目前已经有网站开始收集基于MIDP的程序?D?DMIDlet,提供下载和收 费,各种支持 MIDP的设备都可以使用,这包括数量巨大的智能手机和几乎所有的PDA(Palm OS和Pocket PC)。

对于Profile而言,不同的Profile之间一般是不相容的,比如日本NTT 的DoCoMo已经销售了相当多的支持CLDC的手机,但是使用的是自己专用的Profile,针对这一Profile的程序对其他Profile也就是 不兼容的。事实上,由于Profile是针对设备功能的,不同的Profile针对的设备,往往功能上有着较大差别,程序的相容性既不可能也无太大意义。 当然有一些设备的功能划分不那么明确,比如有无线通信功能的PDA和智能手机。由于一个Configuration之上可以同时有多个 Profile,Profile之间也可以嵌套和叠加,例如CDC的Foundation Profile就是其他各种Profile的基础。那么这些设备就既可以采用MIDP也可以采用PDAP,在以后的硬件基础上,同时装多个Profile 也完全没有问题。

有的文章里说,J2ME为了能够在计算能力有限的设备上运行,舍弃了J2SE的许多特性,因此J2ME是J2SE的子集。这样的说法没 有强调J2ME里因为设备特殊性而增加的内容,因而是不准确的。除非程序只用到这些平台间共同的部分,否则是不能相容的。而一般来说,共同的部分是相当有 限的。





回页首


其他非J2ME标准的相关技术

还有一些技术和J2ME相关,但是并不属于J2ME,我们在这里作简要介绍。

Java Card

Java卡(Java Card)是为智能卡(smart cards)设计的。Smart cards的内存非常有限,为此限制了类的数目(例如,没有Windows系统类),并把整个Java Card 规范在一个二进制核心里实现,然后用Java封装。由于智能卡的功能很简单而容易掌握,类不需要频繁改变,这一方法效果很好(对于J2ME显然不 能使用这种方法)。另外,由于每一个Java卡应用的数据和代码是独立在沙箱(sand box)内执行的,一张卡上可以有多个应用,彼此独立,并且很安全,这样就实现了一卡多用,不需要在钱包里装太多的卡。

虽然Java卡是为智能卡设计的,不过也可以用于许多其他地方。例如1998年的 Java One大会上的Java戒指(Java Ring,又名 Java-Powered iButton,事实上只是Java Card的另外一种型态,Dallas Semiconductor公司将它制作成为钮扣的形状,进而镶嵌在戒指之上),或者世界上现在发布的数百万张GSM SIM卡。

Embedded Java

Embedded Java是历史上Sun另一次创立嵌入系统Java平台的尝试,针对有间断的网络连接或者没有网络连接的设备,这些设备经常是没有图形界面的。 Embedded Java的设计更接近于J2SE,但是因此太大太慢,而且对系统要求过高。另外,Embedded Java将控制其运行的平台,也就是接管所有的系统调用,所有的库,所有的设备。显然提供平台的公司不会喜欢这一点。因此,Embedded Java基本上完全失败了。

WAP

WAP(Wireless Application Protocol,无线应用协议)是XML的一个应用,其目的是在无线设备如手机上显示Internet内容。由于无线设备的显示区域有限,需要将标准的 HTML重新调整以适应硬件条件。

许多初听说J2ME的人都会想到WAP,其实WAP和J2ME并不冲突,而且是很好的互补。WAP对于文本为主的内容是很合适的,需要 持续的网络连接。但是对于图形较多的应用WAP就不太合适,只能提供轻量级的脚本执行能力。 WAP的网关也有安全性问题。而Java技术可以用于间断的网 络连接,可以将应用和服务逻辑在设备和服务器间分离,很适合于图形应用,有很稳定而可靠的安全模型。

结合WAP和Java技术的一个方法是在设备上安装一个WAP浏览器,并且实现CLDC和MIDP及其与WAP浏览器之间的通讯。也有 一些WAP技术是用Java实现的,比如K Browser(http://www.4thpass.com)就是一个用Java实现的浏览器,运行于J2ME 之上。





回页首


无线Java技术

无线这个概念在J2ME的相关文章中经常出现,但是

  • 无线Java不等于J2ME。J2ME中,无线设备只是其中的一小部分。而无线 Java技术也可能包括这种情况:在笔记本上运行 J2SE应用,通过802.11 LAN连接网络。
  • MIDP不是全部的J2ME。MIDP发布最早,因此也得到了最广泛的支持,相关的讨论和文章因此也非常多,但是J2ME当然不 仅仅是MIDP。
  • MIDP不是全部的无线Java技术。还有许多其他Java技术属于无线技术,比如Personal Java,PDA Profile,甚至无线设备上的J2SE。




回页首


移动信息设备的主要操作系统平台及其对J2ME的支持

在消费电子和嵌入式设备的广阔领域中,目前最受关注的是移动信息设备,因此有必要介绍一下移动信息设备的主要操作系统平台,这 对J2ME的开发是相当重要的。移动信息设备主要包括PDA和智能手机,现在和将来都还会有一部分设备处于PDA和智能手机交界的位置。其中手机的市场远 比PDA要大得多,所以许多国外谈到J2ME的文章都是以Wireless应用为主。

PDA也即掌上电脑,一般是指类似于Palm公司出品的Palm这样的设备,主要的操作系统有Palm OS和Pocket C两大阵营。Palm OS来自Palm公司,是一个开放的系统,在PDA市场上占主导地位,已经有非常多的第三方厂商开发的应用和一大批非常忠实和狂热的用户。目前采用 Palm OS的主要有Palm公司的Palm系列和Sony公司的Clie系列(Handspring公司的Visor也属于这类产品,但是已经宣布退出传统 PDA市场,主要发展PDA和无线通讯结合的产品 Treo)。

Pocket PC是微软及其合作伙伴Casio、Compaq、Hewlett Packard和Symbol推出的,基于Win CE 3.0,也是一个开放的标准系统,功能可以扩展(以往的Win CE是一个封闭的不可扩展的系统),在这个平台上厂商可以自己开发软件。具体产品如 Compaq的iPAQ。

另外,Sharp公司Zaurus系列PDA采用Linux的一个针对嵌入式系统的版本。作为拥有高达64M内存的高端PDA,可以满 足CDC的标准,预装了Personal Java的虚拟机。

在智能手机领域,主要的平台是Symbian的EPOC。EPOC最早由Psion开发,主要面向智能手机,也有PDA的特 征,Psion就是第一批主要的PDA厂商之一。Psion宣布EPOC的第一个版本是开放的OS,并向其它厂商授权,随后Psion与 Ericsson,Nokia,及稍后的Motorola建立了名为"Symbian"的联盟,目前主要股东为Motorola, Nokia, Panasonic, Psion 和SonyEricsson,而且Siemens4月也宣布加入。Symbian在欧洲有很好的基础,为大多数主要手机厂商所采用,典型的产品 如 Norkia的9210。


图5:Norkia 9210

Symbian向领先的软硬件开发商开放源代码--所谓的Platinum Programme。从Symbian OS 5起开始支持java,OS 6引入了Personal Java和Java Phone(在Personal Java基础上的一个扩展API,主要针对手机),OS 7开始支持CLDC和MIDP(部分基于6.0和6.1的产品也支持)。



另一方面,微软则有PocketPC 2002电话版和SmartPhone 2002(又称Stinger)与Symbian竞争,显然,前者是有无线通信功能的PDA(前面提到的Handspring新推出的Treo就是这类产 品的典型),后者是有智能处理功能的手机。





回页首


移动信息设备上J2ME开发的现状和前景

在前面提到的这些操作系统平台中,Palm OS上已经有了MIDP的参考实现,但是并不是最适合PDA的Profile。Symbian实现了 CLDC和MIDP,作为智能手机的操作系统,是理想 的MIDP应用平台。在Compaq的iPaq上已经实现了CDC(基于Pocket PC),另外前面提到过,IBM的WebSphere Micro Environment在Pocket PC上实现了CLDC,CDC和MIDP。Sharp的Zaurus实现了Personal Java(基于Linux)。可以看到,在硬件条件较好的PDA上(Pocket PC和Zaurus都使用Intel Arm CPU,比Palm使用的Motorola DragonBall 系列性能要高得多)都可以实现CDC的标准。由于这些主要操作系统平台都是开放的,基本可以相信,主要的移动信息设备操作系统都将一 直提供 J2ME的支持,但是具体支持哪个标准则并不一定死板地按照CLDC和CDC的最初定义,和设备的硬件条件和厂商的选择有关,或者可能同时实现多个 标准。

关于移动信息设备上J2ME应用的具体开发,现有的文章和技术基本分为以下几类:

  • 采用早期的KVM和com.sun.kjava包,或者加上第三方的k awt类库。有很多早期的文章和代码,但是这一技术将被PDA Profile取代,而且不保证兼容性,不建议开发者采用这一方法,而是等待PDA Profile的最后完成及其实现。
  • 采用CLDC和MIDP开发。由于MIDP标准发布较早,智能手机的市场也远比PDA大得多,这是目前大量的无线应用文章的主要 内容,不过它最适合的目标是智能手机,虽然智能手机可能有一定的PDA的功能,但是这一技术并不是最适合PDA的,开发者需要考虑清楚。
  • 采用CDC和Personal Profile,这样的文章不太多见,目前的移动信息设备硬件能力还有所不足。但是下一代的PDA和智能手机肯定可以支持。

就现有的PDA硬件条件而言,J2ME应用要和已有的应用竞争还有比较多的困难:

  • 空间:现在一般的Palm类设备内存从2M到16M不等(目前较高档的机型都已支持扩展卡,可以扩展到128M,但是卡上运行程 序的速度要慢得多,一般主要用来放数据,运行程序不能依赖于卡),Palm上一般现有程序的标准大小是几十K到300K以下。而仅MIDP的Palm参考 实现库在Palm上就需要将近600K,再加上作为基础的CLDC库,加上程序,就快要接近1M了。和已有的应用相比,目前是没有太大竞争力的。
  • 速度:由于Palm一直信奉的是"简单就是美"的原则,目前的Palm系列PDA主要用的是33MHz 的Motorola 68000系列DragonBall,这虽然带来了成本的降低和节电性,但J2ME应用的性能很难让人满意了。作者在自己的 Palm m100(入门机型,但是Palm系列各机型的CPU速度基本上是一样的)测试过一些演示程序,一般都有两三秒钟的启动延迟。
  • 功能:目前最适合Palm的PDA Profile尚未完成,如果用MIDP开发则不太合适,用早期的KVM和com.sun.kjava则因为不是 J2ME标准,程序兼容性无法保证。

虽然如此,但是在移动信息设备上开发J2ME应用的前景还是非常美好的:

  • 硬件的发展:目前的Palm配8M到16M内存已经是主流,下一代超过32M是必然的趋势。Palm OS 5终于开始支持32位的ARM RISC处理器,其速度应该能够提高10倍以上。事实上,Sharp公司今年第一季度发售的Zaurus SL-5500已经采用了Intel 206MHz StrongARM处理器和64M内存,在这样的硬件上速度和内存都不会成为问题。
  • 标准的完善:PDA Profile今年内将最后完成,可以预计很快会在主要操作系统上得到实现。目前在JCP也有许多其他标准非常有意义,例如关于蓝牙技术 (Bluetooth),游戏,定位等等。
  • 平台的广泛性:移动信息设备的主要操作系统平台都是开放的,J2ME的标准也是开放的,因此基本上所有的主要操作系统平台都支持 或将支持J2ME,这带来的广阔市场(智能手机的市场尤其巨大,据称Norkia到今年就可以出货5000万只Java手机,而到2003年可达1亿 只。)和真正的"一次编写,到处运行"是任何其他技术无法比拟的。对于开发者而言,可以不受操作系统的限制,不用担心在这个多变的市场上因平台的变化而影 响自己的应用。
  • 开发的方便性:J2ME虽然和J2SE有着许多不同,但仍然属于Java技术,具有Java方便开发的优点,也使得Java程序 员学习移动信息设备开发没有太大困难(事实上,我认为开发J2ME应用的主要困难不在于具体编码,而在于标准的复杂性)。


参考资料

J2ME牵涉到的内容相当多,这里详细列出各方面的重要站点。

J2ME 的官方网站:

  • http://jcp.org,Java Community Process(JCP)。虽然Sun是Java的创始人,但是现在Java平台的许多定义和扩展工作是通过JCP进行的。 JCP允许公司和个人参与到 Java平台的定义和修改工作中来,其流程很简单,先提交一个扩展Java平台的规范需求(java specification request, JSR),如果被接受,就组成一个专家组正式定义这个JSR。专家组的成员包括该领域的专家和志愿奉献精力和时间者。下一步就公布出来接受其他JCP成员 和公众审查,根据审查意见修改后,就投票接受为一个正式的Java标准。这一过程能够保证 Java的各种实现是兼容的,从而保证Java应用的相容性。所 有的J2ME标准都是通过这个流程定义的。

  • http://jcp.org/jsr/tech/j2me.jsp, 所有的 J2ME标准。

  • http://java.sun.com/j2me,J2ME 官方网站。

  • http://java.sun.com/products/cldc/wp/ProjectMontyWhitePaper.pdf,Project Monty虚拟机的白皮书。

无线Java技术:

资源收集网站:

一些重要的J2ME文章:

邮件列表:

相关书籍:

  • 前面提到的Bill Day的J2ME资源中列出了主要的J2ME相关英文书籍。

  • 前面提 到的http://www.shiunkle.idv.tw/j2me/articles/index.htm中 列出了台湾出版的主要J2ME方面著作。

  • 电力出版社引进了其中两本:
    • Palm 应用程序设计--使用 Java 语言,朱仲杰著;中国电力出版社,2001.
    • 深入Palm应用程序设计:使用Java语言,朱仲杰著;中国电力出版社,2001.



关于作者


董向辉,中科院自动化所人工智能实验室博士生。研究方向为演化计算和复杂性科学。E- mail:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。