J2ME应用开发详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第1章 引入J2ME平台

本章将从定义J2ME开始讲起,然后介绍它的总体架构并学习J2ME目标设备。作为架构讨论的一部分,将提供有关简表和配置的概述(后面的小节中将详细介绍简表和配置)。同时会简要介绍打包和配置J2ME应用程序过程中的一些注意事项。

Sun Microsystems将J2ME定义为“一种以广泛的消费性产品为目标的高度优化的Java运行时环境,包括寻呼机、移动电话、可视电话、数字机顶盒和汽车导航系统。”自从1999年6loper Conference上声明之后,J2ME为小型设备带来了Java语言的跨平台功能,允许移动无线设备共享应用程序。有了J2ME,Sun已经使Java平台能够适应集成了或基于小型计算设备并在JavaOne Deve的用户产品。

Sun Nucrosystems已发布了几个Java版本,且它们维护着不同版本的体系结构的一致性。以系列方式发布的这些版本,由于每个版本都加入了一些新的功能,从而改进了它们的能力。但在Java1.2版发行之后,在Java的打包和许可证发放的方式上有些改变。这导致了Java平台被拆成三个版本。

即不同环境的三个Java平台是:

(1)Java2标准版(J2SE)

(2)Java2企业版(J2EE)

(3)Java2微型版(J2ME)

J2SE是工具和API的收集,主要用于创建Java Applets和单独的、基于Web的应用。J2EE是对跨分布网络和远程访问的单个应用的企业计算Java的回答。J2EE包含J2SE的所有功能,着重于用企业Java Beans(EJB),Servlets和Java服务器页面(JSP),以及扩展置标语言(XML),进行服务器端编程。

1.1 J2ME和WAP

开发无线应用的一种方法是J2ME,它着重于无线计算环境,这是一个在不断推进的领域。无线计算的主要限制是对硬件设备资源的制约,诸如手机,个人数字助手(PDA),及其他的电子和嵌入设备。Java2微型版(J2ME)是Sun公司的一种模块化、定制的平台,处理这些小到128 KB RAM的设备,且其处理器的能力低于台式计算机的计算要求。

J2ME的多数特征是从J2SE派生出来的。J2ME的某些特征如下:

(1)可移植性。

(2)跨不同产品的内在的一致性。

(3)跨网络的安全性。

(4)与J2SE平台和J2EE平台的兼容性。

开发无线应用的另一种方法是通过无线应用协议(Wireless Application Protocol)(WAP)。WAP是适应于由Web协议(诸如TCP/IP和UDP)使用的几种数据处理技术的一种特例。WAP应用开发比较简单,因为它重用了现有的Web技术。WAP不是为使用HTML而设计的,尽管许多WAP网关可把HTML转换为特定无线设备的数据。为生成动态的WAP内容,可使用Servlets和Java Server Pages(JSP)或无线置标语言(Wireless Markup Language)(WML)。尽管WAP和J2ME是互补的技术,但它们以不同的方式进行操作。对于WAP的情形,移动设备运行一个访问Intranet或Internet应用的浏览器。移动设备不包含任何其他的应用。另一方面,J2ME应用驻留在移动设备上,用户可得到这些应用,即使个别没有连接到网络上。

1.2 J2ME的体系结构

J2ME使用配置和简表定制Java运行时的环境(JRE)。作为一个完整的JRE,J2ME由配置和简表组成,配置决定了使用的JVM,而简表通过添加特定于域的类来定义应用程序。配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定JVM。本书将在J2ME配置一章中详细讨论配置。

简表定义应用程序;特定地,它向J2ME配置中添加特定于域的类,定义设备的某种作用。在本章1.6小节中将深入介绍简表。下面的图1-1描述了不同的虚拟机、配置和简表之间的关系。它同时把J2SE API和它的Java虚拟机进行了比较。虽然J2SE虚拟机通常被称为一种JVM,但是J2ME虚拟机、KVM和CVM都是JVM的子集。KVM和CVM均可被看作是一种Java虚拟机——它们是J2SE JVM的压缩版,并特定于J2ME。

图1-1 不同的虚拟机、配置和简表之间的关系

1.2.1 配置概述

配置将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定JVM。虽然还可能在将来定义其他的配置,但当前J2ME存在两种配置。

(1)连接限制设备配置(CLDC)

特别与KVM一起用于内存有限的16位或32位设备。这是用于开发小型J2ME应用程序的配置(虚拟机)。(从开发的角度来看)它的大小限制让它比CDC更有趣、更具挑战性。CLDC同时还是用于开发绘图工具应用程序的配置。Palm电脑便是一个运行小应用程序的小型无线设备的示例。本书将在本章1.5小节中深入介绍CLDC。

(2)连接设备配置(CDC)

与C虚拟机(CVM)一起使用,用于要求内存超过2 MB的32位体系结构。因特网电视机顶盒便是这类设备的一个示例。稍后将在本章1.5.3小节中简要介绍CDC。

1.2.2 简表概述

简表定义了用户的应用程序所支持的设备类型,它向J2ME配置添加了特定于域的类来定义设备的某种作用。简表建立在配置的顶部。已经为J2ME定义了两种简表:KJava和移动信息设备简表(MIDP),它们也被建立在CDLC上。这两种简表适用于小型设备。有一种纲要简表,用户可以在它的上面创建自己的简表,这种纲要简表也称为基础表,可供CDC使用。我们将在后面的章节中讨论上述这些简表,还会使用KJava和MIDP建立一些示例应用程序。

1.2.3 J2ME的目标设备

使用CLDC开发的J2ME应用程序的目标设备通常具有以下特征:

(1)可供Java平台使用的160 KB到512 KB的总内存。

(2)功率有限,常常是电池供电。

(3)网络连通性,常常是无线的、不一致的连接并且带宽有限。

(4)用户接口混乱,程度参差不齐;有时根本就没有接口。

一些CLDC支持的设备,包括无线电话、寻呼机、主流个人数字助手(PDA),以及小型零售支付终端。

依照Sun Microsystems,CDC的目标设备通常具有以下特征:

(1)使用32位处理器。

(2)2 MB或更多可供Java平台使用的总内存。

(3)设备要求的Java 2“蓝皮书”虚拟机的全部功能。

(4)网络连通性,常常是无线的、不一致的连接并且带宽有限。

(5)用户接口混乱,程度参差不齐;有时根本就没有接口。

一些CDC支持的设备,包括常驻网关、智能电话和通讯器、PDA、管理器、家用电器、销售网点终端以及汽车导航系统。

1.3 开发J2ME程序注意事项介绍

在本节中,首先介绍在为小型设备开发应用程序时需要牢记的一些注意事项,然后介绍在使用J2SE编译J2ME应用程序时调用编译器的方法,最后将探究打包和部署,以及在这个过程中提前验证所扮演的角色。

1.3.1 设计开发小型设备应用程序要注意的事项

为小型设备开发应用程序,需要用户在设计阶段制定某种策略。最好是在开始编写代码之前,战略性地为小型设备设计应用程序。由于无法考虑到所有的“gotchas”,在开发应用程序之前更正代码是一件很痛苦的工作。下面是一些可以考虑的设计策略:

(1)保持程序简单。除去不必要的功能,如果可能的话,将它们做成独立的、次要的应用程序。

(2)程序越小越好。这一点对所有的开发者来说应该是显而易见的。越小的程序占用的设备内存越少,并且花费的安装时间越少。可考虑将用户的Java应用程序打包,作为压缩的Java档案(jar)文件。

(3)运行时占用最少的内存。为尽可能减少运行时占用的内存,使用标量类型代替对象类型。同时,不依赖垃圾收集程序。用户应该在使用完对象时将对象引用置空,这样可有效管理内存。另外一种减少运行时所需内存的方法是使用“惰性”实例,它仅在必需时才分配对象。其他一些减少小型设备上过量和峰值内存使用的方法有快速释放资源、重新使用对象以及避免异常。

1.3.2 设计开发移动设备应用程序的注意事项

开发移动设备应用程序的规则与前面提及的开发小型设备的相同:先设计再编码。让用户检查一下开发移动设备应用程序时可考虑的一些设计建议:

(1)让服务器做大部分的工作。将计算性较强的任务放到服务器上,让服务器为用户做这些工作。让移动设备处理界面和最少的计算工作,而让服务器做繁重的工作。当然,用户为其开发应用程序的移动设备对设备连接到服务器上的难易程度和频率有重要影响。

(2)谨慎地选择编程语言。J2ME仍然处于成长期,可能还不是最好的选择。根据用户的需要,选择其他的面向对象语言,如C++,可能会更好。

1.3.3 性能注意事项

为性能而编码。下面介绍一些以获得最优性能为目标的编码方法:

(1)使用局部变量。访问局部变量比访问类成员更快。

(2)避免字符串串联。字符串串联不仅会降低性能,而且会增加应用程序的内存峰值占用量。

(3)使用线程,避免同步。任何运行时间超过1/10 s的操作都需要一个独立的线程。避免同步同样能提高性能。

(4)使用模型视图控制器(MVC)分离模型。MVC将代码中控制显示的逻辑分离出来。

1.3.4 编译注意事项

同其他的Java应用程序一样,用户在打包和部署应用程序之前要先进行编译。尽管有了J2ME,用户仍然使用J2SE编译器并且需要用适当的选项来进行调用。用户需要使用-bootclasspath选项来指示编译器使用J2ME类,而不是J2SE类。不要在编译器的CLASSPATH中设置配置类。这样将导致运行时错误,因为不管CLASSPATH中有什么,编译器将首先自动搜索J2SE的核心类。换句话说,编译器将无法引用特定J2ME配置中缺少的类或方法,结果导致在尝试运行应用程序时出现运行错误,如图1-2所示。

图1-2 编译错误

1.3.5 打包和部署注意事项

由于J2ME是为内存有限的小型设备设计的。大部分常用的Java提前验证已经从虚拟机中除去,以形成一个较小的覆盖区域。结果,在配置之前提前验证J2ME应用程序就很有必要。在运行时会附加一个检查以确保这个类在提前验证之后还没有改变过。

如何严格执行提前验证或者检查类的正确性依靠的是工具包。CLDC提供一个称为提前验证的命令行实用程序,它能够进行实际的验证并且可以把一些额外的信息插入到类文件中去。MIDP使用无线工具包,这种工具包提供一种GUI工具,也可从命令行运行这种工具。

部署工作取决于用户要部署的平台。应用程序必须以一种适合J2ME设备类型的格式进行打包和配置,就如简表定义的那样。

1.4 无线编程的新趋势

世界逐渐地从有线网时代转向无线网时代。用户将不断地看到连接无线网的小型设备彼此通信,类似于通过PC用有线网的方式进行。这些设备包括手机、手持计算机、传呼机、掌上OS(Palm OS)设备。所有这些设备将使用如J2ME这样的平台来运行专门为这些手持设备开发的不同应用软件。

1.4.1 J2ME使能设备

J2ME正成为创建移动设备、消费电子产品,以及嵌入式设备的新应用的最合适的平台。J2ME体系结构由支持各式各样设备的不同的配置类型、特征和规格说明组成。CDC配置支持CVM,它是为消费电子产品及嵌入式设备定制的JVM。这些设备有相当于手持设备那样较好的硬件资源。其基本特征由Java API组成。这种特征是CDC配置的组成部分,其组合将成为构建未来消费电子产品及嵌入式设备的技术。

MIDP是一组Java API。其特征是CLDC配置的组成部分,以创建客户化的手持设备的应用。使用J2ME技术的不同设备可广义地分两种类型:手持设备和消费电子产品及嵌入式设备。手持设备利用CLDC配置运行Java应用。反之,消费电子产品及嵌入式设备利用CDC配置运行Java应用。

手持设备有较少的内存资源、较低的处理器速度和不规则的网络连接。这种设备的例子包括个人数字助理(PDAs),蜂窝电话、基于Palm OS的设备和形成体(organizers)。

另一方面,消费电子产品及嵌入式设备有大量的内存、高的处理器速度、且总是与网络连接。这种设备的例子包括机顶盒、Internet TV、屏幕电话和高端通信装置。

提示

手持设备上可用的内存一般范围为32 KB到512 KB,常用的消费电子产品及嵌入式设备的内存能力在1 MB到10 MB之间。

1.4.2 J2ME使能设备的优点

使用J2ME技术,服务提供者可基于每种客户设备的资源说明提供独特的、特定于客户的应用。J2ME应用可部署在各种各样资源约束的设备上。只要设备是依从J2ME的,这可用于任何网络和任何的平台。J2ME对最终用户也是有好处的。最终用户可基于他们的需要直接下载应用和产品到他们的移动设备上。因此,用户可不必为手机和其他的手持设备购买预先安装在设备上的应用和产品。

提示

移动设备部门的主要机构,如NTT DoCoMo、Inc.、LG Telecom和Nextel,已经共同在3百万以上的无线手持设备上部署了J2ME技术。移动设备制造商,如Nokia、Motorola、Siemens、NEC、Sony、Samsung以及LG Electronics,已经开始将运输设备和Java技术集成起来。

当前,用J2ME创建的几种移动设备应用正广泛地用在无线设备上。这些移动设备应用的例子如下。

● 我的航行:客户可以检查个人的航行材料。例如,累计飞行距离及费用偿还图,客户可核对飞行材料和选择用E-mail通报飞行材料。

● 我的天气:向客户提供有音乐背景的每天的天气预报。此外,在下雨天时得到报警。

● 我的名人:可让客户观看流行的名人网站中的消息。

1.4.3 服务器应用和应用门户

J2ME的主要着眼点是在小而资源有限的设备上提供最终用户的应用,J2ME还包括其他两种类型的应用——服务器应用和应用门户。

1. 服务器应用

设计J2ME服务器应用以帮助服务提供者提交更好的最终用户应用。服务器应用在Web服务器上运行,且易于在用户设备上部署MIDlets。

提示

也可在非Java平台上创建服务器应用。

服务器应用的典型例子是包括:

● AppStream

● 4thpass Mobile Application Server(MAS)

AppStream是一种流应用(application streaming)使能的服务器应用,它类似于流媒体(media streaming)。一般情况下,用户下载文件时,在文件完全下载好之前不可能打开文件和运行它。但流媒体的情况下,用户不必完全下载好音频或视频文件就可播放它,甚至在下载时就可开始播放文件。类似地,用流应用还可在下载时就可运行应用。这对于由慢速网络下载应用到内存和速度有限的设备上的用户来说特别有意义。称为AppStream的公司提供了这种应用。

4thpass Mobile Application Server(MAS)是一种服务器应用,它有助于减少在速度较慢的无线网络上下载的时间。称为4thpass的公司开发了这种应用。

2. 应用门户

J2ME应用门户是致力于以MIDlets的形式提供最终用户应用的Web站点。这些MIDlets按他们的应用定价。某些MIDlets在Web上是免费的。应用门户能使移动设备用户直接下载MIDlets到他们的设备上,减少用户对提供这些应用的服务提供者的依赖。这些门户也有助于软件厂商把他们的产品(MIDlets)直接销售给用户。

创建MIDlets的任何人可在应用门户上张贴它。用户可从这些门户中把这些MIDlets下载到他们的移动设备。Sun的官方网站(http://java.sun.com)提供了与能下载MIDlets的某些门户的链接。

提示

读者可通过http://midlet.org访问midlet.org,通过http://jars.com访问jars.com。

1.4.4 J2ME与其他Java技术的汇集

J2ME之前,Sun公司引入过一些技术,尤其是对于小型的手持设备。由于J2ME的到来自然地期望Sun能把这些技术与J2ME汇集起来以拓宽J2ME可提供的应用范围。

J2ME开始之前,Sun已经引入了称为个人Java的技术(PersonalJava)。在普通家用电子装置上使用PersonalJava能使它们的功能自动化。假定J2ME是PersonalJava自然的后继者。但PersonalJava仍然在不适用于两类J2ME配置(CDC and CLDC)的小装置上使用。这些小装置需要它们自己的特征。Sun现在决定把这些设备包括在受CDC配置影响的基础特征(Foundation profile)中。Sun通过使PersonalJava与J2ME的集成来替代PersonalJava。

Sun开发的JINI作为不同平台下的不同网络和作业的集成系统的一种中间解决方案。在JINI的帮助下,任何类型的设备(如打印机、扬声器、存储设备等)可插入到网络。用户可立即看到网络中设备并使用它。新插入到网络的设备将在网络设备注册表中定义它自身。

提示

JINI替代了使用称为Device Drivers的软件,使用它可把关于网上新加入的硬件通知操作系统。

使用JINI时,操作系统用网络设备注册表跟踪新加入的硬件。目前,设计的JINI仅在J2SE和J2EE平台下工作。JINI对于解决与嵌入系统的连接问题十分有效。因此,JINI也十分适宜在J2ME平台下工作。

Web服务能使组织独立于基础网络和任何一端上的平台访问Internet上的服务和应用。用数据格式和诸如XML和简单对象访问协议(SOAP)这样的协议创建这些Web服务。通过J2ME、J2EE和XML的集成,它可在J2ME依从的移动设备上访问存储在J2EE应用服务器中的Web服务。

1.4.5 Java卡和J2ME灵巧卡的演化

灵巧卡在物理外形上类似于信用卡。但灵巧卡包含一个小的计算机芯片,与信用卡相比它们是动态的。灵巧卡可具有相当于电子现金的功能。电子现金允许用户支付交易的现金而不必通过银行账户。

Java卡是能够执行Java程序的灵巧卡。它们主要用于处理数据的订户标识模块(SIM)卡。这是通过连接卡到手机来做。Java卡类似于信用卡,但可发送、接收和处理数据。这是通过卡片读入机将Java卡连接到计算机上来做的。

Java Card相对原先的灵巧卡来说有以下优点:

● 可互操作性

● 安全性

● 能运行多种应用

● 灵活性

Java卡提供了可互操作性,因为用Java技术开发的任何Java Applet将在Java卡中起作用,不管其基础硬件是什么。此外,Java卡具有与Java编程语言那样的安全和灵活性。Java卡能提供多种应用,因为它包含若干个Applets,每个Applets提供了不同的应用。Java卡又是动态的,因为服务提供者能按照用户的需要加入和除去Java卡提供的应用。

灵巧卡与SIM卡一样主要在手机中使用。以前,手机主要用于声音传递。但随着Java卡的到来,服务提供者现在能提供各种各样的新服务,诸如:网上银行、通过电子商务的贸易和访问Web站点,把手机信息转到PC机上。

提示

Java卡应用的一个典型例子是美国国防部提供的公共访问卡(Common Access Card)。此卡可以使军事人员和其他授权的用户访问军用设施和其他敏感的资源。

Sun没有提出在Java卡上实现J2ME技术的任何计划。但J2ME提供了创建Java卡应用的理想平台。目前,Java卡用Java卡虚拟机(JCVM)执行程序。如果J2ME能进入这种想象的话,那么这个卡将必须适应KVM执行J2ME MIDlets。但如果KVM不能在Java卡环境中运行的话,Sun将可能必须创建CLDC配置下的Java卡的新特征。

1.4.6 J2ME在GADGET编程中的作用

Sun开发Java的目的是在家用电器中使用Java,以使这些设备更灵巧和更有交互性。用J2ME和小装置编程的概念,使Sun在实现这个目标上更接近了。

使用JVM的嵌入式公共电子小装置使这些小装置能执行Java程序。这是所谓的小装置编程(gadget programming)。小装置编程使用户能从单个测点控制不同的小装置,提供远程控制这些小装置的机制。小装置编程也使这些设备可交互和自动化。这些小装置编程可对来自计算机的指令做出应答。例如,有些烘箱能直接接收来自TV的烹调指令而不要用户干预。这是直接的小装置到小装置的交互。类似地,可为基于用户的需要为其他的器具(如空调、音频和视频系统、洗衣机、真空洗尘器、电冰箱等)构建应用。所有这些小装置可连接到中央服务器。这种服务器将包含Java程序,控制这些小装置的操作,使它们高度自动化和可交互,从而创建“灵巧家用设备(smart home)”。灵巧家用设备的主要特点是可连接到外部网络(如Internet),和从远程站点控制它们。现在,还没有使用J2ME技术的嵌入式小装置。但J2ME已经证明了它在小型无线设备中价值。因此,可以预期它将成为未来小装置编程的主流技术。

提示

Consumer Electronic Show 2000陈列了用Java技术创建的灵巧家用设备。Sun称它为.com Home。.com Home由一些小装置组成。例如,配有Web面板的冰箱以浏览网络,可编程的洗涤器在出现故障事件时可自动地通知制造厂商。这种灵巧家用设备也能使咖啡壶可自动地通过Internet更新其功能。

小装置编程的另一个例子是建立自动汽油泵中使用J2ME技术。未来的汽油泵将与账户系统结合起来,这样人们就不需要管理它们。汽油泵也将提供达到不同目的地的道路图。假如汽油泵配有Java驱动的系统,它也有可能直接和汽车交互,然后对汽车中可能的缺陷向用户提出警告,并提醒用户维修细节。也可能在Java卡中存储这种维修细节。这将保证:当用户要支付而猛打卡时,该汽油泵回自动地告诉用户关于需要注意的问题。

提示

GM、Ford、BMW和Fiat等汽车制造商已经构造了Java驱动系统的车辆原型,他们提出这种车辆的行驶版本仅仅是时间问题。

1.4.7 用J2ME的娱乐软件编程

软件市场中视频娱乐业是争钱最多的产业之一。现在市场的主要游戏者已认识到这个等待开拓的巨大的、未触及的市场,并已逐渐把注意力转向生产移动设备的娱乐软件。软件厂商和移动设备制造商正在联手提供移动设备的娱乐软件。

提示

这种联手的例子包括娱乐厂商THQ Inc和移动设备制造商Sony Ericsson之间的联合,另一个例子是娱乐厂商Sega和移动设备制造商Motorola之间的联合。按照这种联合,娱乐厂商将创建只能在他们联合方制造的移动设备上运行的娱乐程序。

目前,世界上有6亿以上的手机用户,而且用户的数目正以指数速度增长。这就导致了开发专为手机而设计的全新的娱乐。尽管在100 ×100 像素屏幕上提供图形丰富的娱乐是不容易的,但手机娱乐相比桌面视频娱乐有它的优点。它们是可携带的,因此只要用户带上移动设备,就可在任何地方播放。预期J2ME是移动设备娱乐软件的核心。用J2ME开发移动设备的娱乐是简单而容易的。这些娱乐增加了设备的价值和制造商的吸引力。创建计算机和控制台的视频娱乐涉及到艺术家和编程员,要花费大量的人力,这会引起巨大的开销。而另一方面,J2ME提供了不可思议的创建娱乐的容易环境。几种商标的J2ME使能的电话包含这样的API,可让用户访问通常手机不能提供的特殊功能。包含这种API手机的例子包括Motorola和Nokia制造的手机。这些制造商已创建了可在娱乐中有音频、动画、及更好图形的娱乐API。使用J2ME平台的另一个主要优点是在其他平台上运行的现有的娱乐可容易地移植到这个平台。

当前,J2ME有两种规格说明用于娱乐编程和多媒体应用:

● Gaming API

● Mobile Media API

Gaming API规格说明是用于建立使用CDC配置设备的娱乐。用Mobile Media API访问多媒体内容。

Sun当前正在从事新的API,移动3D图形(Mobile 3D Graphics)API,将它包含在CLDC配置中。这种API将在MIDP中提供选项包,将极大地改善3D外观、图形、J2ME中娱乐的活跃特征。通过使用这种API,开发者将能为移动设备创建图形丰富的娱乐。此外,这种API也将使应用开发者创建栩栩如生的消息和类似于桌面工作站中的屏幕保护程序。

Mobile 3D Graphics API具有以下特点:

● 有助于创建各种移动应用的3D图像。

● 占有最少的设备资源,因此可在任何手持设备中使用。

● 用这种API创建的任何3D应用,不管简单的或高级的,都可在移动设备上运行。

提示

Sun的J2ME Wireless Toolkit带有娱乐的源代码。例如,TilePuzzle、WormGame、PushPuzzle、Snake、Sokoban、Pong、Star Cruiser,以及Tile Sliding游戏。

Sun也正在开发新的虚拟机,它可大大地改进现在用的KVM的性能。这个新的虚拟机将使3D图形应用和运行在移动设备上的其他的复杂应用大大地前进一步,且消耗更少的内存和电池能量。

1.4.8 J2ME与多媒体的汇集

多媒体内容(如音频和视频文件)即使是压缩的形式也要消耗大量的内存。因此,对于内存能力差和低的处理器速度为特征的J2ME设备来说,把它与多媒体链接起来是很不合理的。但事实上服务提供者正在选择可能的J2ME通过手机提交多媒体内容。

● 移动设备的视频:PacketVideo的公司开发的一个软件,允许在无线网络上传输视频流。移动服务提供者使用这个软件把新闻剪辑和影片预告传输到手机。正在构建的称为PacketVideo的软件使用了视频的MPEG-4标准,并使用J2ME平台。

● 移动设备的音频:音频文件以MP3格式被数字化地存储以使内存的需求最少。MP3格式与J2ME技术一起可把这种文件传输到移动设备,现在,用户可把音频内容下载到诸如:MP3播放机、手机,以及传呼机之类手持设备上,在无线网络上提供这种功能的前沿厂商是称为Sensate的公司。Sensate已开发了称为AoIP Wireless Media Server的应用,可使用户下载音频内容到手持设备上。此应用需要每个用户建立与客户的连接以下载音频文件,采用J2ME技术开发。

1.5 J2ME配置

正如前面所介绍的,配置将基本运行时环境定义为一套核心类和一个运行在特定类型设备上的特定的JVM。读者也可以学到J2ME的两种配置类型是CLDC和CDC。

Sun提供的J2ME配置是适合不同层次的市场需求的,CLDC适合于小型设备,而CDC适合于大型设备。J2ME环境可以被动态地配置为提供运行应用程序所需要的环境,而不用考虑是否为设备提供了运行该应用程序所需的所有Java技术库。核心平台接收应用程序代码和库。运行在网络上的服务器软件执行配置工作。CDC主要用于具有网络连接性的高端消费者设备。这些设备包括机顶盒、Internet TV,以及汽车导航系统。

提示

机顶盒是一种能使电视机作为与Internet用户接口的设备,也能检索数字电视(DTV)广播。

CDC支持以下的Java包如表1-1所示。

表1-1 CDC支持的Java包

注意

J2ME应用不可访问定制包。

CLDC是处理能力比高档消费者设备低的设备。使用CLDC的某些常用设备是手机、私人记事器(personal organizers)和传呼机。

下面将介绍有关CLDC和CDC的更多知识以及与它们关联的简表。

1.5.1 连接限制设备配置(CLDC)

CLDC是由Java Community Process创建的。正如Sun Microsystems的Web站点所定义的那样,它的标准是:“轻便、覆盖区域最小的Java构建块,适合小型的、有资源限制的设备”。

J2ME CLDC配置是为将在业界定义的简表中使用的一个虚拟机和一套核心库准备的。正如前面提及的,一个简表通过在基本J2ME配置顶部提供特定于域的类来为特定的设备定义应用程序。K虚拟机(KVM)、虚拟机的CLDC的参考执行和它的KJava简表运行在CLDC的顶部。

CLDC简要描述了高度限制设备上每个J2ME执行所要求的一套最基本的库和Java虚拟机特征。CLDC主要面向那些网络连接速度慢、能源有限(经常是电池供电)、具有大于等于128 KB的稳定内存,以及大于等于32 KB的不稳定内存的设备。不稳定内存是不持久的并且没有写保护,这意味着如果关掉设备,内存中的内容将全部丢失。而稳定内存中的内容是持久的,并且有写保护。CLDC设备使用稳定内存来存储运行时的库和KVM,或存储为某个特殊设备创建的另一个虚拟机。不稳定内存被用来分配运行时的内存。

J2SE API不适用于手持设备,因为它们需要大量的内存。因此,CLDC库API中不包括所有的J2SE API。不同种类的CLDE库API如下:

CLDE库包含J2SE API的子集类。这些J2SE-特定的类设置在java.lang、java.io和java.util包中。表1-2列出了一些从这些包中继承过来的类。

表1-2 从J2SE包中继承的类

CLDC库包含CLDC特定的几个新的接口和类,它们构成了javax.microedition.io包的一部分,J2ME中用它支持CLDC的连网能力。表1-3列出了这些类。

表1-3 javax.microedition.io包的一部分类

J2ME中核心API包括来自诸如java.lang和java.util之类包的一些类。所有这些API被不同的配置使用,因此,这些API应得到包括KVM在内的所有虚拟机的支持。表1-4列出J2ME中使用的核心API可用的不同类。

表1-4 java.lang和java.util之类包的一些类

提示

在某些情况下,如J2ME中那样使用J2SE包,例如,java.util和java.io包。但由于资源的制约,只是某些J2SE包的一个子集,如java.lang所使用的那样。其中有些包,如微编辑包,则是为J2ME全部重写过的。

1.5.2 CLDC要求

CLDC定义了下列要求:

● 完整的Java语言支持(除浮点支持、最终定案和错误处理之外)。

● 完整的JVM支持。

● CLDC的安全性。

● 有限国际化的支持。

● 继承类:所有不针对CLDC的类都必须是J2SE 1.3类的子类。

● 针对CLDC的类都在名为javax.microedition的软件包和它的子包中。

除javax.microedition软件包以外,CLDC API还由J2SE的子集java.io、java.lang以及java.util等软件包组成。

1.5.3 CLDC与CDC的比较

图1-3描述了CDC和CLDC之间的关系,同时也揭示了它们与整个J2SE API系统的关系。正如前面所说,CDC是加上一些额外类的J2SE的子集,读者也可以看到CLDC是CDC的子集。

图1-3 CLDC与CDC的比较

1.6 J2ME简表

一个简表定义了受支持设备的类型。例如,移动信息设备简表(MIDP),定义了蜂窝电话的类。它把一些特定于域的类加入J2ME配置中来定义对类似设备的使用。已经为J2ME定义了两个简表:KJava和MIDP。它们都构建在CLDC之上。KJava和MIDP都和CLDC及小型设备相关联。

简表被构建在配置的顶部。由于简表是特定于运行应用程序的设备的大小(内存的数量),所以,某个简表是与某种特定的配置相关联的。

在纲要简表上,用户可以创建自己的简表,这种纲要简表也称为基础表,它对于CDC也是可用的。然而,在本书中,将只介绍建立在CLDC上的KJava和MIDP简表。

1.6.1 KJava简表

KJava是归Sun公司所有的简表,它包含KJava API。KJava简表建立在CLDC配置的顶部。KJava虚拟机可以像标准的J2SE虚拟机那样接受相同的字节代码和类文件格式。

KJava包含一个特定于Sun的、运行在Palm操作系统上的API。这个KJava API和J2SE抽象视窗工具包(AWT)有很多地方都是相同的。然而,由于它不是一个标准的J2ME软件包,它的主软件包是com.sun.kjava。在第10 章中开发一些示例应用程序时会介绍更多关于KJava API的知识。

1.6.2 MIDP简表

MIDP适合诸如蜂窝电话和寻呼机等移动设备。MIDP和KJava一样,也是建立在CLDC之上的,并且提供一个标准的运行时环境,允许在终端用户设备上动态地部署新的应用程序和服务。

MIDP是一个公共的、为移动设备设计的工业标准简表,它不依赖某个特定的商家。对于移动应用程序开发来说,它是一个完整的、受支持的基础。

MIDP包含一些附加的库,它们为与用户界面和数据库的交互提供了Java API。此外,这些Java API提出了诸如应用生命周期和特定设备联网之类的问题。用户可用MIDP下的API来创建各种不同的应用,如消费者应用和游戏软件等。MIDP应用称为MIDlets,表1-5中描述了不同的MIDP包。

表1-5 MIDP包的部分类

注意

属于移动信息设备分类的PDA特征,仍处于它的构造阶段。

在移动信息设备(如手机和传呼机)中使用的MIDP有以下特点:

● 屏幕的最低大小为96 ×54像素

● 1位显示深度

● 输入设备,如:键盘或触屏

● 关于MIDP部件,最少128 KB非易失内存

● 双向无限可连接性

此外,MIDP在低端处理器上运行,创建最少的无用信息。在J2ME中,CLDC与MIDP结合形成了综合的运行时环境。系统级服务的接口是由其配置,CLDC提供,而应用级服务的接口是由特征MIDP提供。

注释

用户可控制显示的像素,用“位”来指出颜色或灰度级。1位显示移位:1个像素使用1位。

1.6.3 MIDP取代KJava

正如在前面的1.6.1小节中提及的,KJava是Sun公司所拥有的一个API。它不作为一种完整的、功能齐全的简表,而是作为一种示范,示范简表如何与CLDC一起工作。根据CLDC发行说明(其中包含CLDC下载版本)。

在软件包com.sun.kjava中提供的GUI类不是连接限制设备配置CLDC的一部分。Java 2平台袖珍版的正式GUI类,将通过Java Community Process分别定义并被包含进J2ME简表中。

不管这个事实存在与否,KJava简表已经被早期的采用者广泛使用了。在2001年JavaOne的开发商会议上,Sun公司宣称早期Palm操作系统的MIDP可用性(MID简表的最初发行版焦点主要集中在无线电话上)。Palm操作系统MIDP的规格是由Java Community Process(JCP)定义的。因此,它是独立于供应商的。当前众多限制中的一个——它将随时间消失——就是Palm操作系统的MIDP需要最新的Palm操作系统——V3.5。

在作者写这本书的同时,Palm操作系统的MIDP的规范仍然在随着JCP不断发展,其细节也会随时改变。尽管目前还无法确定其发行日期,但是规范一旦出台,将必然减少对KJava的需求。

1.7 J2ME无线工具箱

J2EE和J2SE平台用于创建在高速、大容量存储设备上运行的应用。对于为这种设备写的Java应用由使用大量内存的JVM编译。但与JVM相比,KVM占有较少的内存,严重地限制了它的能力。移动应用中的任何虚拟机必须能够识别和拒绝无效的类文件。KVM的限制之一是它不可能执行类文件的检验。要求这些检验过滤不属于CLDC配置的类文件。因此,需要一种机制能在KVM之外执行类文件检验,这由J2ME无线工具箱完成。这个工具箱是Sun公司用来构建和测试MIDlet的一组工具。

创建MIDlet之后,必须测试它以保证应用能成功地运行。如果开发的MIDlet要在不同的移动设备上运行,必须在每个这些设备中测试它。J2ME无线工具箱提供了模拟这些环境和测试应用的一种机制。这些被模拟的测试消除了在特定设备中MIDlet发生故障的可能性。

1.7.1 J2ME无线工具箱的结构

J2ME无线工具箱由两个部件组成:

● 字节代码检验器(Bytecode verifier)

● J2ME仿真器(emulator)

此外,由Motorola发布的某些J2ME无线工具箱(如J2ME的SDK),还包含称为配置编辑器(Configuration editor)的附加部件。

1. 字节代码检验器

如前面提到的,J2ME MIDlet必须遵循CLDC配置。J2ME不支持J2SE中可用的所有的类文件。CLDC配置进一步限制了这些类文件的使用。在这种情形下,虚拟机必须能够定位并拒绝来自MIDlet的所有的无效类文件,只保留有效的类文件。KVM不可能执行这些任务。因为,使用字节代码检验器。过滤无效类的过程称为预检验。在MIDlet的开发阶段执行预检验过程。然后准备把被检验的MIDlet作为应用被装入。字节代码检验器的优点是:它减少了KVM的工作负荷。这可让KVM完全集中于编译过程而不必检查无效的类文件。归结起来,字节代码检验器用来定位并拒绝来自MIDlet的所有无效的类文件,只保留有效的类文件。过滤无效类的类文件的过程称为预检验。减少了KVM的工作负荷,可让KVM完全集中于编译过程而不必检查无效的类文件。

在预检验过程中,.class文件被转换为.jar文件。MIDlet被编译之后,以.class扩展的方式存储它,这类似于Java字节代码文件。下一步是预检验过程,此后,.class文件被转换为.jar文件。预检测过程如图1-4所示。

图1-4 预检测过程

除了MIDlet类和其他的支持类之外,MIDlet JAR文件还包含以下元素。

● MIDlet:MIDlet类文件。

● Manifest文件:又称为应用描述符,这个文件描述了MIDlets,诸如:MIDlet的名、厂商名,等等。用扩展jad来保存此文件。

● 其他资源:这些资源包括:MIDlets使用的图像文件和声音文件。

单个JAR文件可以包含一个以上的MIDlet。若干个MIDlets一起形成了MIDlet套件。应用描述符提供了由套件访问特定MIDlet所需的信息。这种应用描述符作为JAR文件内的.jad文件存储。存储在JAR文件中的其他资源包括声音和图像文件。

2. J2ME仿真器

在准备部署MIDlet之前,必须在真实的情况下测试它。这涉及到测试创建它的每个设备中的MIDlet。用J2ME仿真器来执行此测试。该仿真器提供了在PC上测试代码的有效的被模拟的环境。当执行此模拟时,设备的图像出现在屏幕上,应用的执行完全像在特定设备上执行的那样。用户可通过鼠标点击设备上的不同按钮来与设备交互。

J2ME无线工具箱能模拟以下设备的环境:

● DefaultColorPhone

● DefaultGrayPhone

● MinimumPhone

● Motorola i85s

● PalmOS_Device

● RIMJavaHand-held

图1-5 描绘了J2ME仿真器屏幕,这在测试游戏软件时出现在3 种不同的移动设备(DefaultGrayPhone、RIMJavaHand-held和Motorola i85s)上的MIDlet。

图1-5 不同的仿真器

J2ME仿真器具有以下优点:

● 帮助用户在模拟的环境中重复地运行MIDlet直到确定错误为止。

● 提供让用户可在不同的设备上测试运行MIDlets单个接口。

● 分析MIDlet的特定方面,如:无用单元收集和装入类文件。

尽管用户可认为J2ME仿真器是一个完整的解决方案提供者,但它有一些限制。仿真器不能以确实的精度来测试和检验MIDlets的一些特点。这些限制主要包括:

● 执行速度

● 内存可用性

创建在不同设备上运行的MIDlet,每个设备有它自己的处理器速度。因此,希望有一种仿真器能以不同的速度测试运行MIDlets,但是J2ME Wireless Toolkit的当前版本还做不到这一点。同样,要对不同设备中MIDlets测试其可用的内存,内存可用性决定了应用能否在设备内很好地运行。对于可变的可用内存,在仿真器中测试运行MIDlet是不可能的。

仿真器的另一个限制是它不能模拟驻留在每个移动设备上的应用管理器(application manager)的工作。应用管理器负责在移动设备内添加、删除和执行MIDlet。仿真器不能模拟应用管理器的工作。因此,它不可能确切地确定这些MIDlets怎样在设备内被管理的。

3. 配置编辑程序

配置编辑程序帮助用户配置设备环境。这意味:用户可改变设备内可用的不同特征。例如,用户可修改设备图像、屏幕大小,以及设备中可用的按钮。这样,编辑程序提供了可让用户控制模拟环境的机制。

注释

Sun公司发布的标准J2ME Wireless Toolkit不提供配置编辑程序。但这个标准工具箱能让用户配置设备环境。在Motorola发布的J2ME的SDK中,有这个功能。