自从1995年面世以来,已经大大超出了最初Applet应用范畴,在java发布两年后Sun公司推出了主要针对于企业级应用的J2EE(Java 2 EnterPRise Edition),而最近加入到Java产品家族的是J2ME(Java 2 Micro Edition),它的目标直指所谓的“信息设备”,包括电视机顶盒到移动电话的一系列产品。
Java版本
目前Java主要包括以下三种版本:
● 标准版(J2SE):运行在桌面电脑和工作站上;
● 企业版(J2EE):内置支持Servlets,jsp和xml,主要针对服务器端应用;
● 简化版(J2ME):针对那些具有有限存储、小显示以及有限处理能力的设备。
注释:1998年12月,Sun提出了"Java 2"(J2)这个名字来指Java 1.2 这个版本。现在这个名字已经应用到所有的Java版本中,包括标准版(J2SE),企业版(J2EE)和简化版(J2ME)。
图1 Java的不同版本
为什么使用J2ME?
J2ME主要针对那些具有有限处理能力的设备。许多这类设备(比如手机、传呼机等)原来并没有提供下载和安装软件的功能,但是随着J2ME的引入,这一切都得到了改变,J2ME使得这些设备具有了浏览,下载以及安装Java程序的功能。
这些小的消费类电子设备正静静地改变着我们的生活。而且,随着它们对Java的支持,你就可以使用Java语言的许多优秀特性,简单,跨平台,安全健壮,更不用说超过200万使用者的经验和信心啦。
尽管在这些小型设备上使用完整的J2SE API是令人兴奋的,但却是不现实的。想想看,手机的小屏幕是没办法让Java AWT(Abstract Window Toolkit)施展拳脚的。于是不同于J2SE和J2EE的Java简化版就产生了,这就是J2ME。
我们知道,J2ME应用的设备性能千差万别。一个因特网Screenphone(一种访问邮件,新闻,在线银行业务等的设备)拥有比一寻呼机大得多的显示屏。有时即使外形相当,性能也会有很大差异。一个移动电话和PDA同样在物理大小上被限制,然而一个典型移动电话支持12288像素(96 x128)显示,PDA却至少可以支持20000像素。
那J2ME是怎么能够支持这些设备的呢?
J2ME定义了两种类型的规范:配置(configurations)和子集(profiles),由它们来协同提供对各种设备的支持。
配置(Configurations)
一个Configuration定义了针对一系列设备的Java平台。Congiguration与Java 虚拟机(JVM)紧密联系。实际上,Configuration就是定义了Java的语言特性和JVM的核心类库。
不同的Configuration应用分类主要基于设备以下几个方面的考虑:内存,显示,网络连接和处理能力。
在Sun的J2ME FAQ中这样形象地定义:J2ME技术主要针对两种设备:你拿在手里的,你插到墙上的。确实如此,但这只是个很笼统的说法,实际应用过程中不要受此约束。
下面介绍两种典型的Configurations:
● 连接设备配置(CDC)
至少512KB内存运行Java;
至少256KB供运行时存储分配;
持续稳定和高带宽的网络连接(相对于CLDC来说)。
● 连结有限设备配置(CLDC)
128KB内存运行Java;
32KB供运行时存储分配;
受限制的用户接口;
能量有限,主要以电池提供能量;
网络连接可能是窄带宽、不稳定的,且以无线连接为主。
虽然这个划分似乎相当清楚,CDC针对机顶盒之类高端设备,而CLDC主要针对移动电话、PDA和传呼机等低端设备,但不必拘泥于此。随着技术的不断进步,两者之间的界限也越来越模糊。
● 子集(Profiles)
一个Configuration涵盖的设备很复杂,各种设备的性能也大不一样,可能对于某种设备来说的限制在其他设备看来就不是什么问题。前面我们提到移动电话和PDA都符合CLDC的要求,但是还记得开头部分我们对它们的显示性能做的对比吗?为了应付这些不同,Sun又提出了Profile这个概念。
假如说Configuration是从大的方面给这些设备分类的话,那么Profiles就是在特定的Configuration上再细分,是对Configuration的延伸和拓展。它提供给开发者在特定类型设备上开发的类库。比如说,移动信息设备子集MIDP(Mobile Information Device Profile)就是综合考虑了移动设备的屏幕和内存限制,定义了一些用户接口组件,输入和事件处理,存储,网络和计时方面的APIs。
Configurations和Profiles是如何被开发出来的?
J2ME FAQ(http://java.sun.com/j2me/faq.Html)的节录:这些工作都是由JCP(Java Community Process)来完成的,更多信息请查看:http://jcp.org。
Java虚拟机
我们知道,任何Java程序都是在JVM中被执行的。那么对于J2ME来说,情况又是如何呢?CDC仍然使用与J2SE相同的JVM,对于CLDC,由于设备资源受到限制,Sun专门开发了一个新的名叫KVM(K Virtual Machine)的虚拟机。这是个不同于传统的Java虚拟机:
● 虚拟机本身仅仅需要40-80KB内存;
● 只需要20-40KB动态内存(堆);
● 能够运行在16位25MHz处理器上。
当然KVM只是一个由Sun实现的符合CLDC规范的Java虚拟机而已,它并不是唯一的,还存在很多类似的虚拟机,你也完全可以自己实现一个这样的虚拟机,只要它符合CLDC规范就可以。
KVM和CLDC是如何联系在一起的?
摘自Sun的文档:“CLDC是对能运行在由它和相关profiles界定的设备上的Java虚拟机的规格说明”,言下之意就是虚拟机必须满足CLDC规范要求。KVM即是其中一个。
J2ME整体架构
前面我们大致地了解啦一下J2ME的各个方面,现在让我们从整体上来看看J2ME。
通用J2ME架构
图2 通用J2ME架构
MIDP架构
在这个通用架构基础之上,我们可以衍生出不同的应用类型,现在比较流行的就是MIDP架构。
图3 MIDP架构
Java版本间兼容性
Java有句名言:“编写一次,随处运行”(Write Once,Run Anywhere),也有人戏称为"Write Once,Debug Anywhere",那我们想问问:对于J2ME来说,这依然成立吗?答案是在某种程度上是对的。
J2SE应用能在J2ME上运行吗?
J2ME基本上可以算作J2SE的一个简化版本,J2SE中的很多功能J2ME并没有提供,所有说只有当你编写的J2SE程序只采用J2ME中有的类并且严格遵守J2ME规范,它才可能在J2ME上运行,不过那样的程序是毫无意义的。
J2ME应用能在J2SE上运行吗?
和上面同理,只要你的J2ME程序只采用两个平台共同具有的特性,就可以正常运行。但是要知道,J2ME应用中的大部分都是针对特定设备的应用接口和事件处理。