编程高手

BlogJava 首页 新随笔 联系 聚合 管理
  3 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

2009年10月19日 #

 

J2ME的适用范围很广,而且针对J2ME的规范也在增加,很多人因为对各种规范的作用不了解造成对J2ME体系的误解。本文主要讲述一下 J2ME 的结构和构成,同时对一些容易混淆的概念进行解释。
J2ME是什么?
很多人把J2ME等同于手机程序开发,其实这是一个非常错误的说法。也有人认为J2ME是一个标准,一个规范,这同样是不正确的。
Sun 公司将 J2ME (Java 2 Micro Edition,Java 2微型版)定义为“一种以广泛的消费性产品为目标的、高度优化的 Java 运行时环境”。自从 1999 年 6 月在 JavaOne Developer Conference 上声明之后,J2ME 进入了小型设备开发的行列。通过 Java 的特性,遵循 J2ME 规范开发的 Java 程序可以运行在各种不同的小型设备上。
J2ME是Sun公司为嵌入式开发所定义的一个框架,一系列标准的规范所组成。所以J2ME是一个协议簇,而不是单一的规范。
J2ME是一个非常大的概念,下面的一幅图可以看看J2ME的适用范围。

图1
图中的CDC 和CLDC 是支持J2ME的两类设备的配置的简称,分别是:
 CDC (Connected Device Configuration,连接设备配置),运行在这一配置上的程序称为J2ME Application,在CVM上进行解释。
 CLDC(Connected Limited Device Configuration,连接限制设备配置),运行在这一配置上的程序称为MIDlet ,在KVM上进行解释。
可以把CDC 和CLDC 理解为对硬件的定义,就如同PC机和小型机一样,这些设备提供Java程序运行的硬件环境。
在 J2ME 中有两类虚拟机:CVM (C Virtual Machine,C虚拟机)与 KVM (K Virtual Machine,K虚拟机)。KVM 和 CVM均可被看作是一种 Java 虚拟机,是 JVM 的子集,在功能上都是 JVM 的缩减版。这两类虚拟机的适用范围并不相同,简单地说,CVM 的功能比KVM 功能更为强大。
这里再补充一点,J2ME还包括对了Java Card 的定义,用于各类IC卡。JavaCard 和CDC/CLDC在J2ME中是相同的地位。
JavaCard 的网页见:http://java.sun.com/products/javacard/index.jsp ;。
所以在这里要理解J2ME的含义,就可以从CLDC 和CDC这两方面进行了解。
CLDC 与CDC的对比
在前面的图1中已经显示出CLDC 和CDC在适用设备上的区别。
CDC主要针对32位的处理器主频通常在75MHz以上,内存可能在1~4MB 。CDC 针对的设备主要是数字电视、机顶盒、网络电话、车载计算设备等。这些设备的特点是:
 有线连接
 电源稳定
 设备外设资源比较受限
CLDC设备的最低配置为:CPU为16位、32位主频在 16MHz以上的处理器,设备的内存比较少,可能只有512KB,甚至更少。现在硬件的发展非常快,以前所定义的CLDC的设备目前的设备甚至远远超过原来的定义。不过请注意一下,J2ME 对CLDC设备配置的定义只是一个最低要求的定义。其实目前很多CLDC设备的配置都远远超过上面的配置,不过要分辨CLDC设备主要要从设备特点上进行区别。这些设备的特点是:
 无线连接
 没有稳定的电源供应(通常使用电池)
 设备外设资源极少
具体一点说如智能手机,例如:Nokia 7650,Nokia 3650等,还有例如PDA设备也都应该归于CLDC的范围。
简表
J2ME 使用配置(CDC或CLDC)和简表(Profile)定制JRE(Java Runtime Environment, Java 运行时环境)。一个完整的 JRE由配置和简表组成,配置决定了所使用的 JVM(可能是CVM 或 KVM),而简表通过定义特定的类来为应用程序提供功能上的支持,一个简表定义了设备所提供的 API 集合。
如果把CDC 、CLDC 理解称为硬件配置的话,Profile可以理解为硬件上的操作系统,这个操作系统提供了程序可以调用的所有功能集合,也就是说Profile定义了各种功能的 API 函数集。当然这个比喻并不完全恰当,因为CVM 和 KVM 才充当了解释Java程序执行的角色。又或者可以把Profile理解称为虚拟机上提供的开发包,不同的开发包提供不同的核心功能调用。不管怎么理解都好,只要便于自己理解。
这里再补充说明一点:CDC规范和CLDC规范中也都定义了基本的API集合,这些API提供Java 的基本功能,例如:java.io、java.lang、java.util 、javax.microedition.io 这些包就是定义与CDC 和CLDC中的。不过这些包都是Java最基本的功能,更多的面向设备的功能性 API 必须还是通过简表来提供。
下面介绍一下几种常见的简表:
 MIDP (Mobile Information Devices Profile,移动信息设备简表):定义了移动信息设备的类型和提供相关的API集合, MIDP 所定义的功能更加面向用户,而且比 CLDC 更高级。
 IMP (Mobile Information Device Profile,信息模块简表):定义了提供网络连接,但是显示方式比较单一的设备简表,例如告警器。
 Foundation Profile(基础简表):提供除了用户界面以外 J2SE 所能够提供的标准类库。
 Personal Profile(个人简表):针对那些资源相对有限,但是对网络访问要求很高,基于AWT图形界面的设备,例如Web-TV、汽车导航系统等。
除这里提到的三个简表外还有其他类型的简表,但是上面的四个简表是Sun公司所推荐的,而且是开放的简表。例如以前的KJava就是和MIDP 类似的简表。
J2ME内定义的各种规范介绍
到目前为止,本文一共提到了几个规范:
 CLDC 规范:目前分为 v1.0 JSR 30,v1.1 JSR 139
 CDC 规范:目前分为 v1.0 JSR 36,v1.1 JSR 218
 MIDP 规范:分为 v1.0 JSR 37,v2.0 JSR 118
 IMP 规范:JSR 195
 FP 规范:JSR 46
 PP 规范:JSR 62
这些规范都是J2ME中的基础规范,例如说CLDC 设备必须要支持 CLDC规范,同时要选择支持一个简表规范,可能是MIDP 或者其他简表。对于CDC 设备来说也必须支持 CDC 规范,同时选择支持一个简表规范,可能是FP,也可能是PP。
对于其他规范,设备可以选择支持。接下来我引用一下Sun公司J2ME主页对各种规范的介绍:
适用于CLDC设备的规范:
Connected Limited Device Configuration (CLDC); JSR 30, JSR 139 CLDC 规范,前面已经介绍过

Mobile Information Device Profile (MIDP); JSR 37, JSR 118 MIDP 规范,前面已经介绍过

Information Module Profile (IMP), JSR 195 IMP 规范,前面已经介绍过

Java Technology for the Wireless Industry (JTWI), JSR 185 无线Java行业规范

Wireless Messaging API (WMA); JSR 120, JSR 205 无线信息规范,提供短信和彩信功能

Mobile Media API (MMAPI); JSR 135 移动媒体规范,提供音频视频播放

Location API for J2ME (JSR-179) 定位规范,提供定位功能

SIP API for J2ME (JSR-180) 提供对会话发起协议的支持

Security and Trust Services API for J2ME (JSR-177) 提供网络安全与信任的支持

Mobile 3D Graphics (JSR-184) 提供对3D绘图的支持

J2ME Web Services APIs (WSA), JSR 172 提供对Web Services的支持

Bluetooth API (JSR-82, Motorola, Java Partner Site) 提供对兰牙的支持

PDA Optional Packages for the J2ME Platform (JSR 75) 提供对PDA中文件、通信录等存取的支持

适用于CDC设备的规范:
Connected Device Configuration (CDC); JSR 36, JSR 218 CDC规范,前面已经介绍过

Foundation Profile (FP) (JSR-46) FP 规范,前面已经介绍过

Personal Profile (PP) (JSR-62) PP 规范,前面已经介绍过

Personal Basis Profile (PBP) (JSR-129) 类似于PP的规范,但在图形界面方面无需支持AWT

J2ME RMI Optional Package, (RMI OP); JSR 66 提供对远程调用的支持

JDBC Optional Package for CDC/Foundation Profile API (JSR-169) 提供对JDBC的支持

同时请大家注意一下,这里提到的适用于并不是表示只适用于,很多规范是可以同时适用于CDC 和CLDC 设备的。
J2ME的副作用:升级你的系统
这真是一个痛苦的事情!J2ME 中各种规范正处于一个不断扩充和不断完善的过程,旧设备无法支持新规范的事情会越来越多,而嵌入式设备的种类多很难在短时间内实现对各种规范的支持。
相关网页
Java Community Process:http://jcp.org/ ;
Sun公司 J2ME 主页:http://java.sun.com/j2me/
Sun公司 J2ME 下载页:http://java.sun.com/j2me/downloads/index.html ;
支持J2ME的设备列表:http://developers.sun.com/techtopics/mobility/device/
对一些问题的看法
J2ME 很简单
完全错误,J2ME的范围和规模非常之大,适用范围也非常广。要知道嵌入式设备无论从种类还是结构来将都要远远超出PC机,小型机的范围。
认为J2ME简单的人,多半是把J2ME过于具体化。例如:认为手机程序的开发就是J2ME开发的全部。或者认为在PDA上开发一个Java程序就是J2ME开发的全部。
KJava程序开发就是手机程序开发
KJava 也是一个Profile,和前面提到的MIDP的功能和作用类似。以前KJava是Sun公司提供的一个示范性简表。但是由于事实原因现在很多智能手机都支持KJava简表,和MIDP相比 MIDP是一个更开放的规范。
J2ME只能用于手机程序开发
目前看来J2ME还没有能够全面的渗透到各种嵌入设备中,而且目前最大的用途就是一些手机游戏。但是J2ME的用途绝对不止这些,J2ME 应用的发展有赖于各种硬件厂商提供的支持。
J2ME已经可以作为嵌入设备上操作系统
Java程序是解释执行的,所以必须还要有操作系统的支持。Palm OS、WinCE、Symbian的 EPOC、嵌入Linux这些才是操作系统,而且在嵌入式智能设备上应用比较广泛。至于JavaPhone之类的纯Java产品还有待Sun公司的开发。1997年,Sun公司兼并了长期从事嵌入式实时操作系统开发的Chorus公司,希望为Java嵌入技术的发展提供了良好的操作系统环境。以后应该会出现只支持Java的硬件设备和操作系统。不过从前面提到的四种嵌入式操作系统来说,支持C/C++语言才是首位。
J2ME程序可以实现一次编写到处运行
基本上很难。因为J2ME中定义的规范很多,每个规范有自己的API 集,不同的厂商还有自己提供的针对自身设备的 API集,而要求所有的嵌入设备都支持完全相同的规范集合是不现实的。所以利用厂家提供的 API 集开发程序还会保持一段相当长的时间。
但是有些基本的规范是被强制要求的,例如CLDC 和MIDP 要求的API 集就要求所有的智能手机支持。不过另一个方面讲即使是相同的规范也会有不同的版本,不同的版本中对 API 集的要求是不同的。
在我看来 J2ME的最大好处是把Java 带入了
posted @ 2009-10-19 12:36 米老鼠 阅读(145) | 评论 (0)编辑 收藏

Sun凭借最新的Java技术试图将其进一步实现为开发者的目标平台,然而Java平台自身却分成了三种平台:Standard版、Enterprise版和Micro版。Micro版,也就是所谓的J2ME,从问世伊始就专门设计为供内存量小和处理能力较低的移动设备作为Java开发平台使用。

从表面上看,这样做对那些希望提升应用程序的移动计算能力的开发者来说是一件好事。然而,“移动设备”这个术语却涵盖了相当广泛的领域,包括传统的个人数字助理(PDA)、所谓的智能电话、传呼机乃至GPS单元等,它们都具有各不相同的硬件配置。同样的,这类设备的市场也支离破碎,同一供应商的两种设备之间都还存在兼容性问题,更别说不同供应商的设备产品了,在很多情况下简直就是乱七八糟。
给这些五花八门的移动设备提供一种普遍适用的开发平台看来多半是不可能的了。所以J2ME定义了两种类型的规范,它们携手提供一种移动Java平台,这两种规范就是configurations 和profiles。Configuration和profile规范提出了相当多的技术术语,下面我们就来讨论一些。


Configuration
J2ME通过对Configuration的抽象来处理大量千差万别的移动设备硬件功能。J2ME configuration定义了特定设备可用的虚拟机和低级API,同时提供相应的开发基础。目前可用的Configuration有两种,它们是连接设备配置CDC(Connected Device Configuration)和连接有限设备配置CLDC(Connected Limited Device Configuration)。


连接设备配置

CDC应用于相对内存量较大、更强处理器的移动设备。CDC规范采用了内存优化的虚拟机,也就是所谓的CVM,通过它提供等同标准JVM的特性。按照Sun的文档说明, CDC针对新型PDA、智能通讯设备和机顶盒之类的高端设备。为了能够受到CDC支持,移动设备必须至少具备以下条件:

用于CVM和Java API库的2 MB内存。
32位微处理器或者控制器。
可用网络连接,最好是高带宽连接。
连结有限设备配置
CDC的要求有利于昂贵的移动电话、IR扫描仪或类似产品。CLDC则主要针对那些更轻便、更便宜、不能满足CDC要求的设备。

CLDC采用了更轻型的虚拟机,设计为在较低内存环境下运行。这种JVM的参考实现也就是所谓的KVM,为什么要叫KVM呢?这是因为这种虚拟机的大小是以千字节度量的。CLDC 的设备需求如下:

最低160KB的内存,其中128KB用于KVM和运行时库
最低16位25-MHz处理器
有限的用户界面功能
没有(或者间歇的)低带宽网络连接
由于受到严格的内存容量限制,KVM因此缺乏一些完整JVM所提供的特性,这就是说,你可能得改变自己的编程风格了。KVM在如此低内存要求下不得不在浮点数学计算、反应和对finalizers类的支持等方面对性能折中。使用CLDC的开发者在编译程序之后必须预先采用J2ME开发工具包所提供的一种检查工具对他们的源代码进行校验。

profile
如果说配置为应用程序提供了基础,那么profile则提供了应用程序的框架。profile定义了一整套J2ME应用程序可用的API类而且专门针对给定配置创建。Sun推出了2种可用的参考J2ME profile:基础(Foundation)和移动信息设备profileMIDP(Mobile information Device Profile)。

基础profile主要用于CDC配置,因而其虚拟机几乎等同于标准的虚拟机。这意味着,使用基础profile的开发人员必须访问完整实现的J2SE特性集。

MIDP连同功能较低的CLDC配置一道为开发今天的移动设备应用程序提供了你最可能用到的Java平台。MIDP支持J2SE类库的有限子集而且为在CLDC配置上使用定义了定制的用户接口和输入/输出类。

编写一次到处可行?
兼容性如何呢?J2SE应用程序能在J2ME平台上运行吗?这些问题的答案主要取决于配置和profile的具体应用了。J2SE代码无须或者很少修改即可采用CDC和基础profile运行。然而,正如我们在这里所讨论的那样,由于主机硬件受到限制,CLDC和MIDP profile只提供了很有限的功能集合。因此它J2SE应用程序不大可能在不加修改的情况下就运行在这类平台上,除非它把自己限制在两种平台的API交集之内(严重地限制了其功能)。因为CIDC的要求对应了今天大多数手持设备的功能,所以任何J2SE应用软件想不经修改就运行在给定的设备上是值得怀疑的。你多半得修改需要移植到J2ME的应用软件。但也别紧张。从保住饭碗的角度看这未尝不是好事。

posted @ 2009-10-19 11:59 米老鼠 阅读(107) | 评论 (0)编辑 收藏

2009年10月18日 #

在J2ME编程过程中,MIDlet是最核心的类之一,熟悉该类的使用是J2ME学习过程中必须首先掌握的类,下面就结合实际介绍一下该类的实际使用。

众所周知,J2ME程序都是从MIDlet类开始执行,系统规定了MIDlet的生命周期。规定MIDlet程序有三种状态:

1、 暂停状态

2、 运行状态

3、 销毁状态

系统在执行MIDlet程序时,首先构造一个MIDlet类型的对象,然后使程序进入到暂停状态,按照生命周期的规定,系统会自动调用MIDlet对象的startApp方法使程序进入到运行状态,开始程序的执行。如果在创建MIDlet对象的过程中,或者是调用startApp的方法中发生了异常,则系统会自动调用MIDlet对象的destroyApp方法进行到销毁状态,也就是使程序退出。

所以生命周期中的第一个需要注意的地方就是熟悉在以上状态转换过程中,系统会自动调用的方法,然后在实际编写MIDlet类的时候,在这些方法中书写合适的代码,这样就可以在系统规定的状态转换时,自动调用这些方法。

另外一个需要说明的状态是暂停状态,系统在程序运行过程中,如果手机有来电,则系统会自动的使MIDlet程序进行到暂停状态,在进入到暂停状态以前,系统会自动调用MIDlet对象的pauseApp方法。当电话接听完毕以后,系统会自动使 MIDlet程序进行到运行状态,在进入到运行状态以前,系统还会自动调用startApp方法使系统进入到运行状态。

对于上面的内容做一个简单的总结:

1、 startApp方法

在系统第一次运行的时候,系统会自动调用该方法使系统进入到运行状态。

当系统从暂停状态切换到运行状态以前,系统也会自动调用该方法。

2、 pauseApp方法

当系统从运行状态切换到暂停状态以前,会自动调用该方法。

3、 destroyApp方法

当系统发生异常退出程序以前,会自动调用该方法。该方法有一个boolean类型的参数,如果该参数为true则代表该方法必须清理和释放资源,如果为false可以抛出一个MIDletStateChangeException异常来表明它不想立即退出。

熟悉了这几个方法的使用以后,可以实现很多实用的功能,下面介绍两个实际功能的实现:

1、 实现来电话时暂停的功能

在实际的MIDlet编程中,必须实现手机来电时暂停程序的功能,如果有线程时,还需要把线程停止掉,然后当电话结束以后,重新显示界面,并重新启动线程。

startApp方法的具体的实现代码框架如下:

public void startApp() {
//获得当前显示的界面
Displayable curr = display.getCurrent();
//判断是否是第一次运行
if (curr == null) {
//显示第一个界面,例如logo界面
} else {
//显示来电以前的界面
display.setCurrent(curr);
//如果需要,还可以启动线程
}
}

如果游戏界面中有线程,则需要在来电时暂停线程,而pauseApp在暂停以前会被系统调用,所以可以在pauseApp方法中实现该功能。pauseApp方法的实现代码框架如下:

public void pauseApp() {
//获得当前显示的界面
Displayable curr = display.getCurrent();
//判断是否是游戏界面
if (curr instanceof GameCanvas) {
//停止线程
}
}
      2、 实现按挂机时清理的功能

熟悉MIDlet编程的人都知道,在程序运行过程中按挂机键,可以使MIDlet程序退出,在低级用户界面编程中,可以在keyPressed方法中捕获该事件,但是却无法处理,因为捕获以后,程序就直接退出了。

如果游戏中有背景音乐等,则当按挂机键直接退出的时候,音乐还会存在,这样就会造成很多的问题。但是按挂机键以后,在程序退出以前,系统会自动调用destroyApp方法,所以可以把最后处理的代码放置在destroyApp方法中。

下面接着来看一下另一组方法,来继续熟悉MIDlet类的使用:

1、 notifyPaused

使程序进入暂停状态

2、 notifyDestroyed

是程序进入到销毁状态。

以上两个方法和上面的三个方法不同,上面的三个方法是在状态切换过程中,会自动被系统调用。而这两个方法不会被系统自动调用,但是程序员在实际编程过程中可以手动调用这两个方法,使程序进入指定的状态。

比如如果想实现程序退出的功能,就只需要使MIDlet程序进入到销毁状态即可,也就是只需要手动调用notifyDestroyed方法即可。

上面是MIDlet类中最主要的两组方法,下面分MIDP1.0和MIDP2.0来分别介绍剩下的方法的作用。首先看一下MIDP1.0中的两个方法:

1、 getAppProperty

获得jad文件和manifest文件中属性的值,如果一个属性在以上两个文件中都包含,则以jad文件中的属性值为准。

2、 resumeRequest

系统通过调用该软件来判断是否需要使该MIDlet进入运行状态。如果需要进入运行状态,则系统会自动调用startApp方法。

在MIDP2.0中,MIDlet类中新增了两个方法,下面介绍一下这两个方法的作用,依次是:

1、 checkPermission

该方法是MIDP2.0的安全许可机制,在程序的实际使用过程中,可以通过该方法来检查MIDlet是否允许特定的操作,例如联网、发送短信息等等。

如果不允许该操作则返回0,允许返回1,未定义则返回-1。

2、 platformRequest

使用该方法可以访问某些系统功能,例如通用的功能主要有两种

使系统打开浏览器访问某个特定的网址:

platformRequest(“http://wap.sina.com.cn”);

这个功能可以实现用来实现提示用户下载新的程序版本等功能。

使手机拨打特定的电话号码:

paltformRequest(“tel:1860”);

则系统会自动利用手机来拨打1860。

posted @ 2009-10-18 20:47 米老鼠 阅读(120) | 评论 (0)编辑 收藏

仅列出标题