J2ME 走向成熟新的规范预示着 Java 2 平台微型版的迅速增长 |
|
级别: 初级
Todd Sundsted (todd@etcee.com), 首席工程师, PointFire Inc.
2001 年 5 月 04 日
原文链接:http://www.ibm.com/developerworks/cn/java/j-j2me/
长期隐藏在其明星同属产品的阴影之下的 J2ME (Java 2,小型版)正开始进入作为开发平台的阶段。但 J2ME 是否已处在其黄金时期了呢? Todd Sundsted 将带您浏览 J2ME 的当前结构,讲述使 J2ME 成为今日平台的每个规范。在讲述的过程中,还将涉及 2 个要好的老友:PersonalJava 和 KJava,让您了解这 2 种技术如今的发展情况。本文概述了 J2ME 的当前状况,为首次进入 J2ME 就获得成功提供您所需的信息。
J2ME (Java 2, Micro Edition) 于 1999 年 6 月由 Sun Microsystems 第一次推向 Java 团体,它是一项能更好满足 Java 开发人员的不同需求的广泛倡议的一部分。 在 Java 2 平台下,Sun 重新定义了 Java 技术的架构,将其分为三个版本。标准版 (J2SE) 为桌面开发和低端商务应用提供了可行的解决方案。企业版 (J2EE) 是为面向以企业为环境而开发应用程序的专门开发人员而准备的。而小型版是致力于消费产品和嵌入式设备的开发人员的最佳选择。尽管早期人们对它看好而且 Java 开发人员团体中的热衷人士也不少,然而,J2ME 最近才开始从其影响更大的同属产品 J2EE 和 J2SE 的阴影中走出其不成熟期。
J2ME 的崭露头角对 Sun,对跨通讯产业、信息产业和消费类电子产品业的公司,还有对 Java 开发人员来说的确是个好消息。Java 技术将一大批设备(从服务器到台式机和移动设备)集中到一种语言和一种技术之下。虽然这些设备的应用不同,但 Java 技术为这些不同点起到了桥梁的作用,使原本致力于单一领域的开发人员能将其技能发挥到跨越不同设备和应用的领域。
如果您是初次接触 J2ME,您会惊奇地发现 J2ME 没有技术规范。这是因为 J2ME 不是一个单独的技术规范,而是相关技术规范的一个家族,这些规范定义了 Java 技术在资源限制的设备(即能源消耗少于普通台式机的设备)中的形态。
在本文中,我们将讨论今日的 J2ME。我会讲述定义 J2ME 目前结构的各个组件,并为那些对是否使用 J2ME 持观望态度的用户提供该技术近期发展的概览。我还将为您提供针对嵌入式设备的 Java 平台的二种早期实现方法:KJava 和 PersonalJava 的最新状况。我们首先讲述 J2ME 目前的二项顺序原则:配置和简档。
首先考虑一下可能用到 J2ME 的各类设备。这类设备包括 PDA、蜂窝式电话和寻呼机、电视机机顶盒、远程遥控装置和许多其他嵌入式设备。很明显,要为所有这些设备定义一种最优化,或者接近最优化的单一技术是不可能的。处理器能源、内存、固定存储器和用户界面的差异非常之大。
为解决这一问题,Sun 将适合 J2ME 的设备的定义划分成各个部分,然后再进一步细分。在第一步的划分中,Sun 将各种设备按照处理性能、内存和存储能力划分成两大类,此时并不考虑使用目的。公司然后定义 Java 语言的一个剥离版本,它能够在每一类设备的限制下工作,而同时提供最低限度的 Java 语言功能性。
然后,Sun 在这二个种类中找出功能类似的设备类 -- 比如说所有的蜂窝电话无论哪个生产厂商都归为一类。通过 Java Community Process 中的合作伙伴的协助,Sun 然后再针对每个纵向分类定义了附加的功能性。
第一部分创建 J2ME 目前的二种配置:连接设备配置 (CDC) 和连接限制设备配置 (CLDC)。 配置是 Java 的虚拟机 (JVM) 和为选择的一组设备提供运行环境的最小类库集和 API。配置指定了 Java 语言的最小公分母子集,它符合为其而开发的设备家族所强制的资源限制。
由于用户界面、功能和用途中的这种极大差异,甚至在同一配置中,一个典型的配置不能像用户界面工具包和固定存储 API 那样定义这样的重要片断。而该功能性的定义被称为简档。
J2ME 简档是由从事例如寻呼机或蜂窝电话的特定种类设备的某业界领先集团指定的一系列 Java API。每个简档建立在由其配置提供的 Java 语言的最小共分母子集的顶部,并补充该配置。目前有二个简档:补充 CDC 的基础简档和补充 CLDC 的移动信息设备简档 (MIDP)。更多的简档正处于开发阶段,规范和参考实现方法即将出台。
图 1 说明了 J2ME 及其配置和简档与 J2SE 和 J2EE 之间的关系。
如上所述,J2ME 不是单一的规范而是一系列规范,每一项适用于特定的一系列要求。在下文中,我将讲述在 Java 2 平台下每一项规范和它与其它规范之间的关系。
|
让我们首先来分析一下较小的二个配置。根据其规范,CLDC 服务于具有 512 KB 以下内存、有限能源供应(通常使用电池)、有限或非持续网络连接和简单(或无)用户界面的设备。这是最适合用来创建蜂窝电话、寻呼机、PDA 和类似设备的配置。
为了使 CLDC 适应如此严格的限制,开发人员不得不放弃 J2SE 中的许多功能。实际上,当完成设计后,CLDC 只包括四个包:其中三个来自标准 Java 规范(java.lang、java.util 和 java.io),另一个专门针对 CLDC (javax.microedition)。
甚至这三个标准包的内容也被缩减了。在 J2SE 中包含 47 个类和界面的 java.util 包在 CLDC 中缩减至 10 个类。那些被保留的类的功能性足以构建应用程序 -- 省略的功能性由 MIDP 提供,我将在下文中讲述。
表 1 罗列了类的数量,以及每个 CLDC 包的界面,让您清楚地了解 CLDC 有多小。
包 | 描述 | 类和界面 |
java.io | 系统输入输出 | 18 |
java.lang | Java 编程语言的基本类 | 38 |
java.util | 集合、日期和时间支持、各式实用工具类 | 10 |
javax.microedition | 类属连接 | 10 |
CLDC 不需要一致的实现方法来支持例如反映、结束、用户定义的类装载器或浮点算法等功能,这毫无价值。然而,CLDC 并不能提供构建有用应用程序的所有功能性。很明显,它缺少用户界面这一大多数应用程序必需的功能。CLDC 从来就不是一个完整的解决方案。它的设计只是个开头,是可建立提供附加功能性和定位特定产品类的简档的通用基础。MIDP 就是这样一个简档。
|
MIDP 为 CLDC 加入创建诸如蜂窝电话、寻呼机和简单 PDA 应用程序必需的功能性。MIDP 的功能性包括支持计时器、简单固定存储器、通过 HTTP 的连网和用户界面。
CLDC 中 3 项丢失的类已加入到 java.lang 和 java.util 包中,使 MIDP 支持计时器。这些类是:
- java.util.Timer
- java.util.TimerTask
- java.lang.IllegalStateException
所有 MIDP 剩余的功能性包含在 J2ME 中唯一的四个包中。表 2 罗列了这四个剩余的包,以及包的描述和包中含有的类和界面。
表 2. 组成 MIDP 的 4 个 javax.microedition 包
包 | 描述 | 类和界面 |
javax.microedition.rms | 固定记录存储 | 10 |
javax.microedition.midlet | MIDlet 和其环境之间的界面 | 2 |
javax.microedition.io | 支持 HTTP 协议 | 1 |
javax.microedition.lcdui | 用户界面工具包 | 24 |
javax.microedition.midlet 包保证了进一步的观察,它为 Java 开发引入了一个新特性。 MIDlet 这一名称提供给写入 MIDP 规范的应用程序。所有这些应用必须适合 javax.microedition.midlet 包中定义的框架。
MIDlet 框架类似 J2SE 提供的小应用程序框架。MIDlet 是相关类的集合,其中一类扩展了 javax.microedition.midlet.MIDlet
类。由 MIDlet 所在设备提供的 MIDlet 环境通过传递使其开始、暂停和自毁的事件来控制 MIDlet。图 2 展示了 MIDlet 的生命周期。
请参阅 参考资料了解更多 MIDlet 的相关内容。
|
目前 2 个已定义的 J2ME 的配置的大部分是 CDC,它最适合用来创建电视机机顶盒、娱乐系统、汽车导航系统和其他这类规模的应用程序。
在资源限制的条件下,CDC 补充了 CLCD 的不足,并针对大于 2 MB 内存的设备,它能支持标准 Java 虚拟机和 Java 编程语言的完整实现。简而言之,CDC 非常接近您熟悉的 Java 规范。
当只需要兼容 CLDC 的虚拟机来支持标准 Java 虚拟机功能性的一个子集时,那么 CDC 指定的虚拟机必须和标准 JVM 特性兼容。这意味着如果包括对本地方法调用的支持,CDC JVM (或 CVM)必须符合 JNI (Java 本地接口) 1.1。如果包括对调试的支持,那就必须符合 JVMDI (Java 虚拟机调试界面)。如果需要包括简档支持,那就必须遵从 JVMPI (Java 虚拟机简档界面)。
在类库层中,CDC 提供支持全兼容 Java 2 虚拟机所必需的最小 API 集。这一 API 集包括所有为 CLCD 定义的 API 和针对文件 I/O、连网、高级安全性、对象序列等 API。表 3 罗列了在 CDC 规范下提供的包、每个包中的类和界面的数量和每个包的描述。
包 | 描述 | 类和界面 |
java.io | 系统输入与输出 | 62 |
java.lang | Java 编程语言基本类 | 77 |
java.lang.ref | 特别参考类 | 5 |
java.lang.reflect | 反映支持 | 12 |
java.math | Math 支持 | 1 |
java.net | 网络类和工具 | 23 |
java.security | 安全支持 | 36 |
java.security.cert | 证书支持 | 4 |
java.text | 文本处理类 | 13 |
java.util | 集合、日期和时间支持,各种实用工具类 | 47 |
java.util.jar | Jar 文件支持 | 7 |
java.util.zip | Zip 文件支持 | 9 |
javax.microedition | 类属连接 | 10 |
很明显,表 3 中缺少属于 java.awt 包中的类和界面。与 CLDC 的情形相同,CDC 不支持任何用户界面。这还是由于设备与设备之间的用户界面差异很大所造成的。必须为 CDC 加入合适的简档以获得用户界面支持。
CVM 是指定和 CDC 一起使用的 Java 虚拟机,它具有许多超出支持 CDC 所必需的有趣功能。它的移植性很强、支持可 ROM 的类、允许快速线程同步操作,并提供对本地线程的支持。简而言之,它是为支持经常出现在嵌入式应用中的操作系统而设计的。
|
基础简档是唯一的为 CDC 而定义的简档。它大大地扩展了 CDC 提供的 API。然而,它并不提供用户界面 API。正如其名“基础”所示,该简档必须通过一个或多个提供用户界面支持的附加简档来扩充 -- 例如个人简档 (JSR 62),它正处于开发阶段并有可能最终替代 PersonalJava 的简档。
表 4 罗列了基础简档中的,也包括 CDC 中的所有类和界面的数量。这一配置及其主要简档提供的所有类和界面与我们习惯使用的 Java 平台类似。
包 | 描述 | 类和界面 |
java.io | 系统输入与输出 | 74 |
java.lang | Java 编程语言基本类 | 79 |
java.lang.ref | 特别参考类 | 5 |
java.lang.reflect | 反映支持 | 12 |
java.math | Math 支持 | 1 |
java.net | 网络类和工具 | 35 |
java.security | 安全支持 | 63 |
java.security.acl | 访问控制表支持 | 8 |
java.security.cert | 证书支持 | 15 |
java.security.interface | 安全界面类 | 9 |
java.security.spec | 关键规范和运算法则参数规范 | 14 |
java.text | 文本处理类 | 23 |
java.util | 收集、日期和时间支持,各种实用工具类 | 54 |
java.util.jar | Jar 文件支持 | 8 |
java.util.zip | Zip 文件支持 | 17 |
javax.microedition | 类属连接 | 11 |
|
旧的规范:KJava 和 PersonalJava 重新露面
如果近两年一直关注着 Sun 对资源限制设备的支持,那么您一定对 KJava 和 PersonalJava 很了解。PersonalJava 是 Sun 首次为资源限制设备创建 Java 平台版本的尝试。Sun 的 Spotless 研究计划派生的 KJava 是 Sun 在 1999 年 JavaOne 中为 Palm 而开发的 Java 平台版本。
由于为 PersonalJava 和 KJava 编写的代码很多,许多开发人员非常关切这两种平台未来的发展如何。因为它们各自都独立地发展,所以关于这两种平台的信息并不多,但我会告诉您我所知道的信息。
PersonalJava 正逐渐转变成 CDC 的个人简档。尚处于开发阶段的这一简档将处于基础简档的顶部,并且将与 PersonalJava 版本 1.1 和 1.2 向后兼容。
KJava 的情形就不十分明朗。Sun 非常关注 KJava 的实验状态,并提醒开发人员注意它对 API 的不断变化,甚至重大变化。Palm Inc. 目前正为 CLDC 定义 PDA 简档,它将取代 KJava。不幸的是,现在尚无法明确地知道要对现有的 KJava 应用程序做出多少修改才能使其与新简档协同工作。
|
J2ME 的前景很明显要比 J2SE 甚至 J2EE 来的复杂,但是复杂性也预示着 J2ME 能够支持的设备的多样性。总的来说,以我的方法学习一种特定的配置和简档并不很困难。许多情况下,J2ME 让我想起 1995 年的 Java 语言。
如果试图决定是否在嵌入式应用程序中使用 J2ME,您会发现有许多无法回答的问题。例如,我仍然不清楚何时 J2ME 的优势能超越它的成本,特别是鉴于虚拟机和 API 在已经资源限制的环境下使用的资源。
然而,随着规范的成型和更多简档的加入,我确信答案会出现,而且 J2ME 将巩固其在嵌入式设备领域的地位。通过 CDC 和 CLDC,Sun 已采取重要的步骤为该领域的开发人员的各种需求提供各种重要的服务。基础简档刚开始巩固,个人简档将在几个月内出台。作为开发人员,我们将与 J2ME 一同发展,如果仅是实验性的,并且使 Sun 以及其他在无线和嵌入设备市场的商家明确我们的需求。
- George Weaver 和 Timothy Prickett Morgan 自 2001 年 3 月起在这篇论文中对 无线网络以及 iSeries 和 AS/400 服务进行彻底分析 (PDF)。
- JDBC driver 使连接网络的 Palm OS 设备直接访问 DB2/400 信息。
- Sun 提供的几个网站包含有关 J2ME 细节的相关主题:
- 若您想保持与有关 J2ME 和相关开发同步,Bill Day 的 J2ME 资源页面是个好的开始。
- 对通用设备感兴趣?请参阅最新 developerWorks 上的 无线专题。
| Todd Sundsted,从台式机流行起就开始从事编程工作。起初兴趣主要集中在使用 C++ 语言编写分布式程序,当 Java 语言成为那些程序的必然选择时,Todd 转向 Java 编程语言。除了编程之外,Todd 还是 PointFire Inc. 的首席工程师以及创办人之一。可以通过 todd-p2p@etcee.com 和 Todd 联系。 |