- 浏览: 530806 次
- 性别:
- 来自: 青岛
文章分类
- 全部博客 (222)
- 帖子来的 (3)
- JavaScript (25)
- Java (10)
- DataBase (2)
- el表达式 (1)
- html (4)
- FCKEDITOR和TINYMCE (3)
- tomcat (5)
- JavaEE (12)
- Eclipse (7)
- Windows (3)
- Dos命令 (1)
- Oracle (20)
- 乱搞 (1)
- AHK (3)
- TC (2)
- vim (12)
- Perl (13)
- ANT (6)
- Android (3)
- antlr (1)
- SSH (14)
- C/C++ (3)
- wordpress (4)
- CSS (3)
- java2D (1)
- Lucene (4)
- Linux (9)
- jquery (4)
- testsomething (7)
- JVM监控优化 (3)
- emacs (4)
- svn cvs版本控制 (2)
- 硬件 (1)
- j2me (2)
- maven (5)
- WebService (4)
- aspectJ (1)
- 算法 (2)
- mysql (1)
- project (2)
- 正则表达式 (2)
- firefox (1)
最新评论
-
直觉:
gua 顶
com.opensymphony.xwork2.inject.DependencyException -
fordfelix:
加了以后 任然存在这个异常 求解!!
struts2 json 插件 @JSON(serialize = false) -
fangyan_oracle:
谢谢了, 很受用
用IE修改当前页面内容的代码zzzz -
cfying:
[flash=200,200][/flash][url][/u ...
精解window.setTimeout()使用方式与参数传递问题!(转) -
qinglangee:
tiewazi 写道param必须是全局变量(即window对 ...
精解window.setTimeout()使用方式与参数传递问题!(转)
名词梳理
在正式开始介绍J2ME之前,这里我列出一些常见名词,方便与下文参照: J2ME
(Java2 Platform, Micro Edition) Java2平台微型版 CDC
(Connected Device Configuration)连接设备配置 背景随着无线应用与嵌入式系统的愈来愈受到人们的重视,SUN也推出了J2ME(Java2 Platform, Micro Edition)来迎合这一未来的发展趋势。 图1 Java版本的划分和针对的设备
CLDC/MIDP的基本结构
粗略的说j2me把设备分为两类,一种是联接设备( connected device),一种是有限联接设备(Connected,
Limited
Device)。前一种对应于那些有电源的,电力充裕,较大的设备。例如:电视机,冰箱等,后一种对应于主要使用电池,小型的设备,例如:手机,pda
等。 configuration包括虚拟机(virtual
machine),核心的类库与API。configuration层定义一个java虚拟机的特性与java类库的最小子集。也就是
说,configuration层提供了开发人员一个最基础,最核心的Java平台。因为j2me把设备分为两类:联接设备(connected
device)和有限联接设备(Connected, Limited Device)。对应这两种设备就有了两种J2ME
configuration。分别为CDC(Connected Device Configuration)和CLDC(Connected,
Limited Device Configuration)。这里请注意,CDC使用经典的javaVM,而CLDC使用的是KVM(The K
Virtual
Machine)。KVM是sun专门为使用16/32位RISC/CISC微处理器或控制器,并其可用内存为160kb~512kb的的设备而开发的。
KVM比较小,通常只有128K或更少。 图2 CLDC/MIDP的结构 |
深入理解CLDC /MIDP
<!-- start banner ad--><!-- ba--> <noscript> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1116164705?"> <IMG src="http://image.360doc.com/DownloadImg/494/68513_5" border=0 ></A> </noscript> <!-- end banner ad--> |
CLDC的目的
-
为小型的,且资源有限,Connected Limited的设备定义一个标准的Java平台。
-
允许动态的向这些设备发布内容与应用程序。
-
方便第三方软件厂商与开发者向这些设备移植内容与应用程序。
CLDC的范围
-
Java语言与虚拟机的特性
-
核心Java类库(如java.lang.*, java.util.*)
-
输入/输出
-
对网络的支持
-
对安全性的支持
-
对国际化的支持
CLDC不包括的范围(即由MIDP解决的)
-
对应用程序life-cycle的管理(就是指一个应用程序是如何安装,运行,删除的)
-
UI界面(User Interface)
-
Event处理
-
高级应用程序模式(这里指用户与应用程序的交互)。
CLDC的安全性
低端的基于虚拟机的安全性由下载时对class文件的审核
(verification)步骤来保证。(如果你写过并编译过MIDlet程序,就会知道这一步是必须的。这里有一个概念就行了,我会在后面讲述如何创
建MIDlet程序时,详细介绍具体的步骤)。基于应用程序的安全性通过使每个应用程序分别运行在相对独立的封闭环境中来保证并且处于被保护的系统
package中的类不能被应用程序重载(overridded)。
对于Java语言支持的特殊方面
CLDC总的来说是与Java语言完全兼容的,但需注意以下几点:
<!-- start banner ad--><!-- ba--> <noscript> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1813387004?"> <IMG src="http://image.360doc.com/DownloadImg/494/68513_6" border=0 ></A> </noscript> <!-- end banner ad--> |
不支持浮点数据类型(即没有float和double)(这实际上主要是由于CLDC所面向的设备,其硬件因其内存限制或是基于安全性的考虑不支持浮点运算)
不
支持类实例(class
instance)的终结(finalization),即不存Object.finalize()方法。(注:finalization指的是java
中提供的有别与garbage collection的另外的一种对象清理方法。具体可参看侯捷老师译的Bruce Eckel的《Thinking
in Java 第二版》,可以在www.jjhou.com中下载)
有限的错误处理,即大部分Java.lang.Error的子类都未被支持。与此相反,CLDC包括了相当完备的异常(exception)类。
对于Java虚拟机(Java Virtual Machine)支持的特殊的方面
实质上CLDC在其严格的内存限制下达到了对Java虚拟机相当程度的兼容性。不过还是有下列不同点:
-
不支持浮点数据类型(没有float和double)
-
不支持JNI (the Java Native Interface )不支持用户自定义的Java级的类载入器(class loaders )
-
没有反射(reflection)特性(注:reflection指java通过 java.lang.reflect提供的,可以对类的能力进行分析的功能。常用来对类的结构进行检查,在JavaBeans上有广泛运用可参见Gary Cornell的Core Java2 volumeI,II,机工有出中译本)
-
不支持线程组(thread groups)或守护线程(daemon threads)
-
不支持类实例(class instance)的终结(finalization)
-
没有弱参考(weak references)(注:weak reference提供了一种解决指向已经被garbage collector清除的对象的方法。在Java2中被介绍。具体请参考java.lang.ref API 文档,和sun网站上关于Reference Objects和Garbage Collection的文章。)
-
有限的错误处理(error handling)
类文件审核过程(classfiles Verification)
CLDC要求其下层的虚拟机能够辨别并拒绝非法的class文件。但由于CLDC本身面向小内存消耗的小型设备这一前提。其类文件检测机制与J2SE中定义的标准类文件审核机制还有所不同。请注意看下图:
图3 CLDC的类审核机制
请注意上图所示CLDC中的预审核(preverification)过程。这是CLDC区别于通常的类文件审核过程的 关键。如上图所示,当源程序被编译后,必须被预审核器预审核,然后才能被下载到目标设备上去。之所以有这一步骤,主要是为了减轻KVM中审核器的负担,加 快审核速度。就像我前文提到的,这是出于对CLDC支持的硬件的考虑(毕竟手机和PDA并没有我们PC机那样奔腾的“芯”呀!^-^)。这里记住这个概念 就行了。具体的操作方法我会在以后讲述编写MIDlet程序时介绍。
CLDC的类库API
如果不严格的说,CLDC的类库是J2SE的一个小的子集,有以下这种近似关系成立,即J2SE包含CDC包含 CLDC。但要注意CLDC并未完全包含于J2SE,它还包括一些专门针对无线设施的类。所以可以把CLDC的类库简要划分为两部分:从J2SE继承的类 和CLDC专有的类。
1. 从J2SE继承的类
<!-- start banner ad--><!-- ba--> <noscript> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=925022963?"> <IMG src="http://image.360doc.com/DownloadImg/494/68513_8" border=0 ></A> </noscript> <!-- end banner ad--> |
这部分包括三个package,即java.lang,java.util和java.io。注意即使这些从J2SE继承的的类,也是大大“缩了水”的。例如java.util的类与接口由J2SE的47个缩减到10个。另外两个也有相应缩减。
系统类
From java.lang:
Object, Class, Runtime, System, Thread, Runnable,
String, StringBuffer, Throwable
数据类型类
From java.lang:
Boolean, Byte, Short, Integer, Long, Character
容器类
(container class)
From java.util:
Vector, Stack, Hashtable, Enumeration
I/O 类
From java.io:
InputStream, OutputStream, ByteArrayInputStream,
ByteArrayOutputStream, DataInput, DataOutput,
DataInputStream, DataOutputStream, Reader, Writer,
InputStreamReader, OutputStreamWriter, PrintStream
日期与时间类
From java.util:
Calendar, Date, TimeZone
附加的实用类
java.util.Random, java.lang.Math
异常类
(Exception Classes)
From java.lang:
Exception, ClassNotFoundException,
IllegalAccessException, InstantiationException,
InterruptedException, RuntimeException,
ArithmeticException, ArrayStoreException,
ClassCastException, IllegalArgumentException,
IllegalThreadStateException, NumberFormatException,
IllegalMonitorStateException, IndexOutOfBoundsException,
ArrayIndexOutOfBoundsException,
StringIndexOutOfBoundsException,
NegativeArraySizeException, NullPointerException,
SecurityException
From java.util:
EmptyStackException, NoSuchElementException
From java.io:
EOFException, IOException, InterruptedException,
UnsupportedEncodingException, UTFDataFormatException
错误类
From java.lang:
Error, VirtualMachineError, OutOfMemoryError
2. CLDC专有的类
这里sun提供了javax.microedition.io包。用它来提供与外界沟通的桥梁。(注:就像在J2SE中我们利用java.net.*)注意,所有的连接都由javax.microedition.Connector创建。例如:
你可以打开一个http连接通过Connector.open("http://www.chinajavaworld.com")
javax.microedition.io的接口包括:
Connection, InputConnection, OutputConnection,
StreamConnection, ContentConnection, DatagramConnection,
StreamConnectionNotifier
这
里再说明一点,实际上你也可以看出,CLDC所包括的类库,并不足以开发应用程序。例如,没有UI界面的支持等。这也正是CLDC的设计理念。CLDC本
身就从未想过要解决所有的问题。这些问题要靠其上层的Profile-MIDP来解决。例如javax.microedition.lcdui就是定义在
MIDP中的UI包。
MIDP对应的设备特性
由于MID这类设备,在屏幕、内存、处理器等问题上有诸多限制,在手机或是PDA等MID上开发应用程序必须要考虑一些技术上的特殊点。
<!-- start banner ad--><!-- ba--> <noscript> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=2098709301?"> <IMG src="http://image.360doc.com/DownloadImg/494/68513_9" border=0 ></A> </noscript> <!-- end banner ad--> |
下面给出一些MID设备的特性:
-
显示(display):96x54 (最小屏幕尺寸),1bit(最小色深,单色)
-
输入设备: “one-handed keyboard”(指ITU-T手机键盘),“two-handedkeyboard”(指标准键盘,即QWERTY键盘),触摸屏。
-
内存分配:128kb(MIDP组件);8kb(应用程序生成的Persistent data,关于Persistent data,我会在将来讲RMS时,详细说明,这里有个概念就行了);32kb(java runtime环境)
-
网络: 双向的,无线的,间断的,带宽有限的网络
-
内核(kernel):至少要能运行KVM。
还有很多软件上的特性,如读写non-volatile内存(就是掉电后不会失去内容的内存,如flash)。读写无线 设备接口的API,等等。除了上诉技术上的问题,你还得注意你的程序要简单易用且稳定可靠。尤其是可靠性,你开发的是通讯设备,用户是不能忍受程序有什么 纰漏而影响到通话的。你要牢记这一点。
MIDP的类库API
如前文所述,sun在CLDC之上定义了MIDP(Mobile Information Device
Pro-file)层,用以提供对UI、永久存储介质(persistinace
storage)、和网络等更高层的(相对于CLDC)支持。那么,让我们来具体看看MIDP的类库。
MIDP由四个javax.microedition包组成,它们包括:
-
javax.microedition.rms 关于永久存储介质(注:rms是Record Management System的缩写)
-
javax.microedition.midlet 定义了MIDlet的框架,以及MIDlet与环境的交互。
-
javax.microedition.io 网络支持
-
javax.microedition.lcdui UI(User Interface)(注:UI分为high-level和low-level两种API。)
注:如果在加上语言和实用类(java.lang和java.util)则有六个。
编写并运行一个MIDlet
MIDPlet简介
MIDP中定义的应用程序称为MIDlet。任何一个MIDlet都
是javax.microedition.midlet.MIDlet的子类,必须继承自
javax.microedition.midlet.MIDlet。这很显而易见。我们在J2SE中编过Applet,Applet就必须继承自
java.applet.Applet。是不是很类似。请看下图,说明了MIDlet的继承体系。
图4 MIDlet的继承体系
一个简单的MIDlet
//HelloWorld.java,一个最简单的MIDlet程序。 |
该程序显示“HelloWorld”字符串。程序本身非常简单,如果你熟悉JavaApplet编程的话,你会发现与Applet很类似。好,我们先把它编译,运行一下看看。
编译之前的准备:
-
硬件:因为是Java,所以内存最少有128MB以上,CPU最好是PII或更高。
-
平台:最好是win2000,win98的中文显示会有问题,解决起来比较麻烦。Linux我没有试过,英文我想应该都没什么问题,但中文显示我估计可能会有些麻烦。如果有试过的朋友,请一定告诉我。
-
SDK:你需要有(下述软件都可在sun网站上免费下载)
1.Java 2 SDK 1.3或以上。
2.J2ME Wireless Toolkit 1.0.3
以下可选:
sun的IDE:Forte for java。(如果你上的是宽带,或不是自己付网费的话 ^-^)
下载好后,先安装JDK1.3,(具体关于安装和设置我就不详述了,想来大家都很清楚。如果您不清楚,请参考相应资 料。)在安装J2ME Wireless Toolkit 1.0.3,它会自动找到您的JDK1.3,并作相应设置。如果您不用命令行的话,环境变量也不用设置直接可在图形界面上运行,非常方便。关于环境变量的 设置请自己参考手册。
编译的步骤
如果你按上述已经安装好JDK和J2mewtk,请按以下步骤编译,实际上是非常简单的:
(注:下述默任JDK安装在c:\JDK1.3,J2ME Wirless Toolkit 安装在c:\J2mewtk\)
1. 开始->程序->J2ME Wirless ToolKit 1.0.3->KToolBar
2. 这时会出现"J2ME Wirless ToolKit"窗口,点"New project"按键,在Project name项填:HelloWorld;在MIDLet Class Name填:HelloWorld。点击Creat project。
3. 这时会出现Setting for project对话窗,采取默认即可。点击ok。
这时请注意,因为没有down
sun的IDE,所以你要手工把你事先编辑好的HelloWorld.java放置在c:\j2mewtk\apps\HelloWorld\src\目
录下。这时,按“Build”键,如果一切正常,将提示编译完毕。这时在device下拉选单中选定你想要的设备,再按“run”键,终于大功告成。你可
以多选几个不同设备,感受一下,不错吧。
MIDlet的lifecycle
<!-- start banner ad--><!-- ba--> <noscript> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1806323337?"> <IMG src="http://image.360doc.com/DownloadImg/494/68513_13" border=0 ></A> </noscript> <!-- end banner ad--> |
我们已经成功编译并运行了一个简单的MIDlet程序。现在,让我们来分析一下MIDlet的结构,了解一下它的Lifecycle。
通过对源程序的观察,我们可以发现MIDlet程序的运行是由startApp(),pauseApp()和destroyApp()这3个方法控制的。它们在javax.microedition.midlet
.MIDlet中定义。所有的MIDlet都必须有这3个方法。
顾名思义startApp()方法用于标志一个MIDlet的开始执行。不过这里要注意一点,与HelloWorld程 序的constrctor不同。startApp()不光是在初始化完一个MIDlet时执行,只要该MIDLet被从Paused态激活(变为 Active态),startApp()就会被调用。
pauseApp()方法标志着MIDlet进入Pause态。而destroyApp()方法标志着MIDlet进入destroyed态。(注意:这里严格的讲应该说成:方法被调用并成功返回标志着...)
看完上面的描述,大家可能会满头雾水,又是方法,又是状态的,什么跟什么吗?这还得从MIDlet的执行机制讲起。
MIDlet的执行是通过Application Management software来管理的。这玩意儿是处在操作系统级别上来管理MIDlet运行的底层机制的总称,所谓MIDlet state(MIDlet状态)就是它一手操办,控制管理的。MIDlet state确保了AMS随时可以消灭该MIDlet,同时MIDlet也有办法进入一个Pause态,并可再次激活。
MIDlet State 分为Paused,Active,destroyed三种。当AMS创生一个新的MIDlet实体时,对应于MIDlet,表现为其 constructor被调用,进入Paused状态。当所有的准备工作都做好后,AMS判断现在MIDlet可以运行了,于是调 MIDlet.startApp()方法。进入Active态。当AMS决定要把MIDlet转入Paused态,就会调用 MIDlet.pauseApp()方法,MIDlet就会暂停执行,通常Paused态会用于释放所占资源。当AMS判断MIDlet不再需要,就会调 用MIDlet.destroyApp(),MIDlet被消灭。
请注意我上述是站在AMS的角度在谈AMS如何控制MIDlet的状态改变。程序员也可请求MIDlet的状态的变换,通过调用resumeRequest, notifyPaused, notifyDestroyed这三个方法。
我们的HelloWorld程序先把destroyApp()的unconditional值置为false,抛出一个 MIDletStateChangeException 异常,表示MIDlet这时还不想被destroy。notityDestroyed()通知AMSMIDlet进入destroyed态。具体的细节请 参阅MIDP API文档。
下面给出一个MIDlet的最简单的状态流程:
//FlowMIDlet.java MIDlet的最简单的状态流程 |
MIDlet的状态的改变可以用下图表示:
这里还要说几句闲话,关于AMS,其作用不止是控制MIDlet的运行状态。它实际上际上负责了MIDlet的整个运行 机制。关于AMS进一步的描述,请参见王森老师的文章-“利用Java撰写手机应用-Java Application Manager篇”(《程序员》,12期,2001)。注意其中JAM就是AMS。
结束语
好了,J2ME(CLDC/MIDP)的简介就算是结束了。把帖子转成html实在是一项很累的工作。试过这后我才明白这个道理。如果您看过之后,有那么一点帮助的话,那就算是对我最大的报偿了。如果您觉得文章有什么错漏之处,或是有什么感想,欢迎给我E-mail 。
相关推荐
PDA Programming Using J2ME Introduction J2ME CLDC/MIDP API Preparation of programming Examples HTTP Connection, RMS DB, SOAP, XML Instruction of application development Step by step
2. **MIDP API**:这是J2ME用于开发移动应用的主要部分,包含了用户界面组件(如Canvas和Form)、网络连接、数据存储以及游戏功能等。 3. **CDC API**:适用于更复杂的设备,如PDA或嵌入式系统,提供了更全面的Java...
但J2ME对此提供的支持却十分有限,如MIDP2.0仅支持图像成90度整数倍的旋转。针对这种情况,本文提出了一种实现图像任意角度旋转的方案并提供了算法实现。然后对算法的应用问题进行了探讨,分析了算法的局限性。最后...
标题中的"midp-2_0-src-windows-i686 + j2me_cldc-1_0_4-src-winunix"提及了两个关键组件,即Midp 2.0和J2ME CLDC 1.0.4的源代码,分别针对Windows i686(Intel x86架构)和Unix平台。描述进一步确认了这些内容涉及...
第三章CLDC与MIDP--j2me开发.ppt
**J2ME中文教程 MIDP2.0** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机和智能家电。MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了...
J2ME 的核心组成部分包括 Connected Device Configuration (CDC)、Connected Limited Device Configuration (CLDC) 和 Mobile Information Device Profile (MIDP)。 1. **Connected Device Configuration (CDC)**:...
《核心J2ME技术与MIDP》一书由John W. Muchow撰写,出版社为Prentice Hall PTR,出版日期为2001年12月21日,ISBN号为0-13-066911-3,全书共737页。本书深入探讨了J2ME平台的核心技术和MIDP(移动信息设备配置)框架...
在本主题中,我们将深入探讨如何在 J2ME 平台上实现水波倒影效果,同时关注 CLDC1.1 和 CLDC1.0 版本的差异。 首先,"水波倒影" 是一种视觉特效,通常用于增强图形用户界面的吸引力。在 J2ME 应用程序中,这种效果...
### 核心知识点:J2ME与MIDP技术 #### 一、J2ME概述 J2ME(Java 2 Platform, Micro Edition)是Sun Microsystems为嵌入式设备和移动设备开发的一种Java平台标准。它针对的是内存有限、显示能力和处理能力较低的...
J2ME由两部分组成:KVM(K Virtual Machine)或CLDC(Connected Limited Device Configuration)以及MIDP(Mobile Information Device Profile)。这里的"j2me_cldc-1_0_4-src-winunix.zip"主要关注的是CLDC部分。 ...
MIDP1.0支持CLDC(Connected Limited Device Configuration),这是J2ME的另一部分,定义了小型设备所需的内存和处理器需求。 2. **J2ME开发环境** 开发J2ME应用程序通常需要一个集成开发环境(IDE),如NetBeans...
- CLDC 与MIDP 工具类别 升阳计算机教育训练中心 王森 moli0205@mail2000.com.tw 引言 JSR-118 规格,也就是MIDP 2.0 以经完成规格制定,新一代的Java 手机 所该具备的功能和特性,都可以从MIDP 2.0 看出端倪。...
j2me手机浏览器通常基于MIDP,它包含了必要的API来构建用户界面,如ChoiceGroup和Form,以及实现网络通信,如HttpConnection。此外,早期的移动互联网服务往往使用WAP(Wireless Application Protocol)协议,因此,...
J2ME的应用通常分为CLDC(Connected Limited Device Configuration)和MIDP两部分,前者定义了基本的Java环境,后者则提供了用户界面和网络服务的API。 压缩包内的文件名"地图制作要点详解.docx"表明,这是一个文档...
MIDP包含了一套称为J2ME Wireless Toolkit(J2ME WTK)的开发工具,允许开发者创建和测试MIDlet(MIDP的应用程序)。MIDlet使用轻量级用户界面组件,如ChoiceGroup、TextBox和Form,来构建交互式的应用程序。此外,...
开发网广泛的覆盖了基于CLDC的MIDP技术,并将逐步扩展到CDC方面。J2ME提供最新的 原创文章,促进开发者的技术交流;提供丰富的资源下载(包含源代码研究和API手册等等) 帮助开发者最快的吸收知识;提供交流论坛方便...
3. **兼容性问题**:不同的J2ME设备可能对MIDP和CLDC的支持程度不同,需要广泛的设备测试。 4. **安全性**:在处理敏感的文件操作时,需要确保应用的安全性,防止恶意操作。 总之,"J2ME文件浏览器(MIDP版本)"是...