J2ME综述
游安弼(本人导师)
1 J2ME诞生之前
90年代初SUN公预测到嵌入设备的巨大市场,开始了一项代号为“Green project”的秘密工程,该工程计划对嵌入设备研制出一整套的方案,包括设备,OS,图形界面,应用软件等。考虑到嵌入设备的多样性,该小组分析了已有语言后发现它们都不适合,应该重新设计一种新的语言,使得编写的程序不作改动就能在不同设备上运行,这就是“一次编写,到处运行”的首次提出。该工程完成时,嵌入市场尚在萌芽,其产品Star7 (*7)手持设备太超前了,在与日本几家公司的谈判中都未成功,该成果几乎夭折。此时INTERNET正是红火时,SUN公司的领导人以敏锐的目光发现该成果中的OAK语言很适合INTERNET,遂将其少许改进,命名为JAVA语言,应用到INTERNET上。由于JAVA语言的跨平台、短小、安全等特点而很快在INTERNET上走红,成为动态网页的主力军。
时间在推移,到了1996年嵌入市场渐渐启动,很多嵌入设备厂家要求与SUN公司合作,SUN公司才将JAVA重新应用到嵌入设备中,于1997年推出了PersonalJava,于1998年推出了EmbeddedJava,于1999年推出了KVM(The K Virtual Machine)。
PersonalJava应用环境针对有网络连接、有用户界面的设备(如机顶盒等)。为了减少对内存的需求,PersonalJava规范定义了两种包:一种是所有设备都必须有的强制包、一种是可选包。与JDK相比,PersonalJava应用环境不包括SWING用户界面API,而是提供了一个精简了的AWT API,还有一些特定的API。PersonalJava现已并入到PersonalProfile中。
表 1. PersonalJava 规范1.2a 核心包
强制包 |
|
可选包 |
|
注:当某个程序使用一个未包括的包时会引发一个NoClassDefFoundError 或 UnsupportedOperationException 例外。
EmbeddedJava应用环境是针对功能专一而且内存很有限的嵌入设备(如汽车、自动控制设备等)而提出的。它也是基于JDK 1.1,与PersonalJava很相似,但是它不像PersonalJava为特定设备定义特定的JAVA子集,而是允许用户仅使用需要的部分,您不别在您的设备中嵌入任何用不到的东西。EmbeddedJava将融入到基于CDC的某些(注意:不是某个)Profile中。
KVM是SUN公司的一项代号为“Spotless System”研究工程的成果,于1999年发布。该研究将JAVA技术移植到相对于PersonalJava类说资源更有限的运行环境中。 该研究的成果是一个最小的完整JVM(支持完整的字节码指令集,支持类装载,支持标准非图形类库和基本的文件支持)。该小组最关心的是可移植性和代码大小,而不是执行速度。为了测试该成果,该小组将其移植到PALM中,包括如下组件: KVM、核心类库、设备特定的数据库及用户界面API以及用于在PALM与电脑间传送文件的工具。该成果一公布,即在JCP中获得好评。如今它已成为CLDC的一部分。
到1999年时,嵌入市场已趋于成熟,日本推出的I-MODE JAVA手机迅速发展,几乎所有日本的手机厂商都推出了JAVA手机(由于I-MODE在MIDP之前,所以尽管也是JAVA手机,但开发方式与MIDP稍有不同)。
与此同时,JAVA在服务器端的开发中也迅猛发展,相对于CGI、服务器端API的开发技术来讲显示出了巨大的优越性,JAVA语言的平台独立性、安全性的特点在此再次得到充分发挥,其市场份额迅速提高。
到此时,以前的JAVA产品管理方式已不能适应迅速发展的市场,1999年下半年SUN公司决定将JAVA兵分三路,推出了针对嵌入开发的J2ME、针对桌面端的J2SE、针对服务器端的J2EE。下面我们来看看J2ME究竟有什么。
2 J2ME的组成
X应用程序 Y应用程序 Z应用程序
XProfile YProfile ZProfile
XConfiguration YConfiguration ZConfiguration
XOS YOS ZOS
X设备 Y设备 Z设备 |
图1 J2ME组成结构图
注:对于特定类型的设备选用特定的操作系统,特定的configuration,特定的profile,特定的应用程序。同类型的设备应用程序可通用。对于某一个设备,其configuration只能在已发布的configuration选用一个,但profile可以选用多个。尽管到目前为止只有两个configuration可用,但不排除会发布更多configuration的可能性。
Configurations是一个规范,它定义了针对特定类设备的一个虚拟机和专用的基本API集合。例如某一Configuration可能被定义为针对内存比较富裕而且有网络连接的嵌入设备,其虚拟机可能是一个完整的JVM,其API可能为J2SE中API的一个比较大的子集。而另一个Configuration可能被定义为针对内存较少且只有简单网络连接的设备,其虚拟机可能是JVM的一个子集,其API可能为J2SE中API的一个最小子集再加其它少量特定API。
Profile是建立在某个configuration之上的特定API集合。一个configuration只定义虚拟机和基本的API集合,不定义建立应用程序的细节。因此Profiles往往包括应用程序生命周期的API,用户界面API以及存储API。一个Profile既可直接建立在Configuration上,也可建立在另一个Profile之上。
为了在不改动Profile的前提下增加设备的功能,在Profile之外又提出了可选包,可将它们看成Profile的扩展,每个可选包对某个或某些profiles增加特定的功能。当对某个profile需要增加一个新的API时首先将它定义为可选包。如果随着时间的推移该可选包被广泛采用,它则可能成为某个或某些profiles的一部分。某些厂家特定的API与可选包起相似功能。
J2ME的这种结构很好的适应了嵌入设备的巨大多样性。从低到高,您可根据设备的情况可采用不同的configuration,在同一configuration中您又可根据设备的用途选用不同的Profile,在您的设备中您还可采用多个Profile,如果您还嫌功能不够,尚有可选包可用。那么有哪些configuration、Profile和可选包呢,我们介绍如下。
3 J2ME的现状
J2ME如今在嵌入市场可谓左右逢缘。在手机市场方面,几乎所有大型手机厂商都推出了JAVA手机,仅NOKIA在2002年就计划生产5000万部JAVA手机,型号达十几种,已开发出的JAVA应用程序更是不记其数。在数字电视方面,美国、欧盟以及我国的标准组织都采纳了JAVA,其前景可谓不可估量。我们在此仅从技术方面看看J2ME的现状。
3.1 已发布的configurations
到本文为止,已发布了两个configurations: CLDC( the Connected, Limited Device Configuration) 和 CDC (the Connected Device Configuration)。这两个configurations都是针对有网络连接的设备定义的。
3.1.1 CLDC
CLDC(The Connected Limited Device Configuration )是“Spotless”的延续,它针对很小、资源有限、有网络连接的设备如手机、个人数字助理、双向寻呼机等。这些设备计算能力较低、内存少、用电池供电、网络带宽小。其对硬件的要求较低,如可采用16位或32位处理器,最少160KB ROM,至少32KB RAM,某种网络连接。CLDC采用的虚拟机是KVM,其采用J2SE核心API的子集,还增加了特定的GCF (Generic Connection Framework)包, javax.microedition.io
。 下表列出了在CLDC中的包。
表 2. CLDC 包
包名
|
描述
|
|
J2SE 中相应包的CDLC 子集
|
|
J2SE 中相应包的CDLC子集
|
|
J2SE 中相应包的CDLC子集
|
|
J2SE 中相应包的CDLC子集
|
|
基于GCF的网络支持
|
3.1.2 CDC
CDC( The Connected Device Configuration )与CLDC相比是针对资源更宽裕的设备定义的规范,如高挡手机、高档PDA,电视机顶盒、信息家电等。CDC需要32位处理器,至少2M内存,某种网络连接。CDC使用的虚拟机是CVM,它是一个具有与J2SE 1.3 VM相同功能的但更小的虚拟机。CDC与CLDC相比包括了更多的J2SE 核心类库,编程更加方便,下表列出了CDC中定义的包.
表3. CDC 包
包名
|
描述
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
J2SE 中相应包的CDC 子集
|
|
基于GCF的网络支持
|
[此贴子已经被作者于2004-06-02 09:29:01编辑过]
----------------解决方案--------------------------------------------------------
3.2 已发布的PROFILE
J2ME中第一个正式发布的Profile是MIDP,而且随后比较长的时间内未有其它Profile发布,以至有人把MIDP等同于J2ME了,有人把WTK等同于J2ME SDK(由于J2ME包含的范围很广,所以不太可能有厂商推出能支持各种Profile的开发工具)。MIDP只是J2ME中的一员,我们来看看到写本文为止有哪些Profile。由于每个Profile是建立在特定的Configuration之上的,所以我们在Profile后注明其基于的Configuration。目前已有的基于CLDC的Profile有MIDP,基于CDC的Profile有FP、PBP。
3.2.1 MIDP(基于CLDC)
MIDP (The Mobile Information Device Profile)是第一个发表而且最成熟的J2ME Profile。主要是针对手机设备提出的。支持MIDP的手机厂商几包括所有大型厂商如Motorola, Nokia, Ericsson,SIEMENS 等,支持MIDP的通讯公司有SprintPCS, Nextel, and NTT DoCoMo等。下表描述了MIDP对设备的需求。
表4. MIDP 对设备的需求
需求 | 描述 |
显示器 | 大小: 96x54,颜色: 1位. 像数比为1:1. |
输入Input | 至少一种如下输入机制: 单手键盘, 双手键盘, 或触摸屏. |
内存 | 256 KB ROM, 128+8 KB RAM |
网络 | 双向,无线 |
电源 | 有限如电池供电 |
MIDP规范的指定由Motorola公司领头,MIDP1.0的JSR规范编号为JSR 37。它定义了MIDP应用程序的生命周期类、网络类、用户界面包、存储包。MIDP应用程序也叫MIDlet。MIDP定义的包有java.io
、
java.lang
、
java.lang
、
javax.microedition.io
、
javax.microedition.lcdui
、
javax.microedition.midlet
、
javax.microedition.rms
。
3.2.2 FP(基于CDC)
FP(The Foundation Profile)规范不像别的Profile 提供了运行的环境,而是为其它基于CDC的Profile 提供一个基础,本规范编号为JSR 46。 它为基于CDC的Profile提供了更好的安全性、更多的工具包。该规范并没有包含任何用户界面包,因此该规范可作为某些无用户界面但有网络连接的专用嵌入设备使用。
3.2.3 PBP(基于CDC)
PBP(The Personal Basic Profile)规范针对有网络连接而且有基本图形界面的设备提出的。潜在市场包括交互数字电视、信息电话亭等。这些设备需要一个基本的图形界面,但完整的AWT支持又没必要。该规范与Personal Profile 的主要区别是,Personal Profile要考虑移植PersonalJava ,PP必须支持以前PersonalJava中的所有特性,因此PP要求较高,而PBP没必要这么高。该规范对硬件的要求如下:最少2M ROM,最少1M RAM,稳定的网络连接,基本图形界面(注意:应用程序和本地化资源所需的内存另外计)。PBP规范的编号为JSR 129。它定义了最小的AWT用户界面包、JavaBeans支持相关包、应用程序生命周期类。PBP应用程序也叫Xlet。
3.3 已发布的可选包(Optional Package)
到本文为止,正式发布的可选包有WMA( The Wireless Messaging API)、The Mobile Media API 、RMI API。
3.3.1 The Wireless Messaging API
本可选包的编号是JSR 120, 它为某些具有收发无线信息的设备提供API。它定义了一组收发信息的API,信息可为文本信息或二进制信息,最典型的就是SMS(短信服务)。它可用于CLDC和CDC。该API只有一个包javax.wireless.messaging
。
3.3.2 MMAPI (The Mobile Media API )
本可选包的编号是JSR 135, 它为某些具有高级声音和多媒体功能的设备提供了一个简单多媒体处理API。该可选包基于CLDC,但也可用于CDC。 该API定义的包如下:
表 5. MMAPI 包
包名 | 描述 |
| 定义控制和表现媒体的接口以及 |
| 定义特定媒体内容处理器 |
| 定义选择数据源的类 |
3.3.3 The RMI Optional Package
该可选包编号为JSR 66, 它为某些需要RMI功能的编程提供了支持。该API是J2SE中相应API的改进版本。 包名为java.rmi
。
----------------解决方案--------------------------------------------------------
4 J2ME的未来
J2ME可能是JAVA三个平台中变化最快的。许多新的Profile、可选包即将发布,许多新的Profile被提上议程。我们来看看最令人兴奋的即将发布的Profile、可选包。
4.1 MIDP2.0
MIDP 2.0 也叫MIDP_NG,它的编号是JSR 118。MIDP2.0 与1.0相比有很大提高。 增加的特性有:提供域安全模型允许对应用程序进行签名和论证,提供TCP、UDP网络接口,内置OTA,更好的用户界面,基本的声音API。
4.2 Location API for J2ME
本可选包的编号是JSR 179, 它为某些具有定位功能的设备提供相应的API。该规范由 Nokia 公司领头。利用该API,JAVA程序中能够显示出该设备当前的物理位置。该API可与很多Profiles配合使用。该API额外增加的内存需求是20KB ROM和2KB RAM。其最低的configuration是CLDC1.1。 该规范只定义一个通用的定位API,所以它可基于大多数定位技术而不是某种定位技术。它定义的包名为 javax.microedition.location。
4.3 The Java APIs for Bluetooth
蓝牙可选包的编号是JSR 82。它为某些具有蓝牙通讯功能的设备提供相应的API。蓝牙技术是一种成本低短距离的无线通讯技术。该可选包基于GCF,以CLDC作为底层,但不排除用CDC 作为底层,也就是说它可与任何profile配合。它的包名为javax.bluetooth
、
javax.obex
。
4.4 PDAP
PDAP(The Personal Digital Assistant Profile)是针对个人数字助理提出的。PDAP 规范在MIDP 之后提出的,它的编号是JSR-75,提出它的主要原因是 MIDP 缺少如下一些个人数字助理常用的API:访问通讯录、记事本和其它在个人数字助理中常有的个人信息数据库等。另外个人数字助理需要文件存储功能,串口通讯功能、更丰富的用户界面。PDAP应用程序也叫PDAlets。PDAP 规范建立在MIDP之上,因此PDAlets其实就是使用了PDA功能的MIDlet。
5 J2ME与JCP,J2EE,J2SE,JavaCard
5.1 JCP (The Java Community Process)组织
JCP是制定并修正Java技术规范机构,由业界厂商所组成,它由两个执行委员会(Executive Committee,简称EC)组成,一个是Standard /Enterprise Edition EC,负责制定J2SE和J2EE的规格;另一个是Micro Edition EC,负责J2ME的标准制定。JCP现在规范了所有的Java API。通过JCP组织,java技术得到了持续不断的发展,并成功的迎合了市场的需求。
JCP处理事务过程很简单: 想要扩充java 平台的JCP成员,提交一份建议书,被称之Java 技术规范要求(JSR),然后JCP执行委员会对提交的技术规范进行审议,只有通过前面的审议,才能进入下一步流程,具体的操作方式,有一个完整的程序。
SUN鼓励你无论以你个人或是公司的名义加入JCP,这将有助于保证java满足市场的需求.虽然JCP是一个非常民主和自由的标准组织,但Java的专利却由Sun所拥有,同时该公司还拥有规范否决权。
Java的最大目标和特点,就是"一次编写,到处运行"的平台无关性。但是,很自然的,正如Sun认识到的,"One size does'nt fit all",一套标准无法适应各种不同的需求。因此,Java技术目前共有三套,分别针对不同的平台和应用
1. Java 2标准版包括了一系列的API,其瞄准的是传统的桌面应用
2. Java 2 企业版是J2SE的扩展. 定位于服务器端程序的应用.
3. Java 2 微型版定义的一系列的API,其运行环境目标是嵌入式消费设备.例如无线手持式设备、个人数字助理、电视机机顶盒及其它的缺少资源去支持所有的J2SE接口的设备
把Java 2划分为三个版本,更好地使其满足开发者在各自领域的需求,并且使得JAVA技术在不同的方向得以持续的发展。
5.2 Java 卡
Java 卡技术是J2ME的补充,它改写Java 平台以使其能应用于智能卡,一种非常特殊的环境――内存不足及受处理器的限制,它不适用于一般目的的编程。一个典型的Java卡设备有8或16位的处理器,1至5兆赫的运行频率,1.2k的RAM和32k的稳定内存(持久存储技术或闪存)。
Java Card小心谨慎地选择了Java语言的子集――它不支持大的原始数据类型,如长整型、双精型、浮点型、字符串型,动态的类载入,多线程其一些其它的Java技术特征。
当前Java Card是2.2版,Java Card技术包含三部分的内容:
1. Java Card虚拟机规范被定义为Java的子集及智能卡的虚拟机。
2. Java Card运行环境为智能卡定义了运行行为。
3. Java Card API 为智能卡定义了核心和扩展的Java包和类。
表3 概括了Java Card 2.2版中的核心Java包
Package Name 包名 | Description 描述 |
| Base IOException class to complete the RMI exception hierarchy |
| Subset of J2SE core Java programming language for Java Card |
| Base exception class and tagging interface for the Java Card RMI functionality |
| Framework of classes and interfaces for the core functionality of a Java Card applet |
| Service framework of classes and interfaces for a service-based JavaCard applet |
| Classes and interfaces for the Java Card security framework |
| Extension package containing security classes and interfaces for export-controlled functionality |
| RMI-specific classes for developing RMI-enabled applets |
普通的Java Card技术应用(被称为Java Card applets)包括数字身份证,安全的银行储蓄卡和用在移动电话中的SIM卡等。虽然Java卡是为智能卡设计的,不过也可以用于许多其他地方。例如1998年的Java One大会上的Java戒指(Java Ring,又名 Java-Powered iButton,事实上只是Java Card的另外一种型态,Dallas Semiconductor公司将它制作成为钮扣的形状,进而镶嵌在戒指之上)。
----------------解决方案--------------------------------------------------------
辛苦了
----------------解决方案--------------------------------------------------------