在今天的生活中,個(gè)性化的智能信息用品已經(jīng)是必須品。這些用品包括移動(dòng)電話、機(jī)頂盒、雙向?qū)ず魴C(jī)、智能卡和掌上電腦等。在幾年前開(kāi)發(fā)人員很難想像能夠用一種統(tǒng)一的開(kāi)發(fā)方式來(lái)開(kāi)發(fā)運(yùn)行在這些設(shè)備上的程序,也很難想像在這些設(shè)備上開(kāi)發(fā)兼容的程序,而現(xiàn)在借助 Java 的能力這些都成為可能。
Sun 公司將 J2ME (Java 2 Micro Edition,Java 2微型版)定義為“一種以廣泛的消費(fèi)性產(chǎn)品為目標(biāo)的、高度優(yōu)化的 Java 運(yùn)行時(shí)環(huán)境”。自從 1999 年 6 月在 JavaOne Developer Conference 上聲明之后,J2ME 進(jìn)入了小型設(shè)備開(kāi)發(fā)的行列。通過(guò) Java 的特性,遵循 J2ME 規(guī)范開(kāi)發(fā)的 Java 程序可以運(yùn)行在各種不同的小型設(shè)備上。
Sun 公司希望借助J2ME 這把利劍對(duì)嵌入式設(shè)備這個(gè)混亂的領(lǐng)域進(jìn)行統(tǒng)一,讓Java 的范圍擴(kuò)展到所有的電子設(shè)備開(kāi)發(fā)上,按照現(xiàn)在的發(fā)展速度,J2ME 很快將被廣泛應(yīng)用于消費(fèi)和嵌入式設(shè)備中。
與以前 Sun 公司推出的J2EE (Java 2 Enterprise Edition,Java 2企業(yè)版)、J2SE (Java 2 Standard Edition,Java 2標(biāo)準(zhǔn)版)規(guī)范相比,J2ME 不是一個(gè)單獨(dú)的技術(shù)規(guī)范,而是一系列技術(shù)規(guī)范總稱。這些規(guī)范定義了 Java 技術(shù)在資源限制的設(shè)備中的表現(xiàn)形式。J2ME 主要適用于小型嵌入式設(shè)備,這些設(shè)備與PC或是服務(wù)器設(shè)備相比沒(méi)有統(tǒng)一的硬件標(biāo)準(zhǔn)、外觀與操作方式,其功用也是千差萬(wàn)別。但是J2ME 在適用于這些設(shè)備的同時(shí)也保留了 Java 的傳統(tǒng)特性,即任何時(shí)間和任何地點(diǎn)的代碼具有可移植性、部署靈活性、安全的網(wǎng)絡(luò)傳輸性,以及代碼穩(wěn)定性。正是因?yàn)槿绱耍_(kāi)發(fā)人員才可以借助J2ME 力量讓編寫(xiě)的程序能夠運(yùn)行在其他型號(hào)或廠商的設(shè)備上。
Java 程序是以邊解釋邊執(zhí)行的方式運(yùn)行的,所有的Java 程序都會(huì)被編譯成為二進(jìn)制代碼并運(yùn)行在Java虛擬機(jī)上( J2EE、J2SE 中的Java 虛擬機(jī)簡(jiǎn)稱為 JVM)。而J2ME針對(duì)的設(shè)備主要是嵌入式和消費(fèi)類的設(shè)備,因?yàn)檫@些設(shè)備內(nèi)存和處理器的限制,所以J2ME 所包含的類庫(kù)也比較小一些,相對(duì)于J2SE的類庫(kù)來(lái)說(shuō)作了一些剪裁,虛擬機(jī)的功能也相對(duì)簡(jiǎn)單。
在 J2ME 中有兩類虛擬機(jī):CVM (C Virtual Machine,C虛擬機(jī))與 KVM (K Virtual Machine,K虛擬機(jī))。KVM 和 CVM均可被看作是一種 Java 虛擬機(jī),是 JVM 的子集,在功能上都是 JVM 的縮減版。這兩類虛擬機(jī)的適用范圍并不相同,簡(jiǎn)單地說(shuō),CVM 的功能比KVM 功能更為強(qiáng)大。在讀者閱讀完1.1.3、1.1.4節(jié)后,將會(huì)更清楚地了解這兩種虛擬機(jī)的具體適用范圍。
運(yùn)行在J2ME 上的程序大致分為兩種:
l J2ME Application :運(yùn)行在CVM之上。
l MIDlet (Mobile Information Devices let,移動(dòng)信息設(shè)備小程序):程序運(yùn)行在KVM之上,MIDlet 程序的開(kāi)發(fā)也就是本書(shū)要講述的內(nèi)容。
J2ME面對(duì)的是大量各種不同的小型嵌入式設(shè)備,它們?cè)谕庥^和功能上均各不相同。J2ME將這些設(shè)備進(jìn)行分類,將一些共性提取出來(lái)形成適合于某個(gè)范疇中設(shè)備可用的規(guī)范,稱為“配置”。讀者也可以將配置理解成為對(duì)硬件的描述,所以通過(guò)定義配置的方法就能夠清楚地描述硬件功能。
在 J2ME 中配置可以分為兩類:
l CDC (Connected Device Configuration,連接設(shè)備配置),運(yùn)行在這一配置上的程序稱為J2ME Application,在CVM上進(jìn)行解釋。
l CLDC(Connected Limited Device Configuration,連接限制設(shè)備配置),運(yùn)行在這一配置上的程序稱為MIDlet ,在KVM上進(jìn)行解釋。
從設(shè)備的硬件功能角度來(lái)看, CDC主要針對(duì)32位的處理器主頻通常在75MHz以上,內(nèi)存可能在1~4MB;而CLDC主要針對(duì)16位、32位主頻在 16MHz以上的處理器,設(shè)備的內(nèi)存比較少,可能只有512KB,甚至更少。因?yàn)?/SPAN> CDC 與CLDC 針對(duì)的設(shè)備CPU 處理能力和內(nèi)存是不一樣的,所以它們所使用的虛擬機(jī)和核心類庫(kù)也不相同,CDC的核心類庫(kù)也比CLDC的核心類庫(kù)要大。CDC用的虛擬機(jī)是CVM,而CLDC用的是KVM,CVM 比KVM 包含更多的功能和支持更多的特性。
從設(shè)備的用途和功能的角度來(lái)看,CDC 針對(duì)的設(shè)備主要是數(shù)字電視、機(jī)頂盒、網(wǎng)絡(luò)電話、車載計(jì)算設(shè)備等。這些設(shè)備的特點(diǎn)是有線連接、電源穩(wěn)定、設(shè)備資源比較受限。而 CLDC 針對(duì)的設(shè)備主要是移動(dòng)手持設(shè)備,例如 PDA、POS 機(jī)和智能手機(jī)。這些設(shè)備的特點(diǎn)是無(wú)線連接、沒(méi)有穩(wěn)定的電源供應(yīng)(通常使用電池)、設(shè)備資源極少。目前在國(guó)內(nèi)外用得比較廣泛的CLDC是在智能手機(jī)上的應(yīng)用。
J2ME 使用配置(CDC或CLDC)和簡(jiǎn)表(Profile)定制JRE(Java Runtime Environment, Java 運(yùn)行時(shí)環(huán)境)。一個(gè)完整的 JRE由配置和簡(jiǎn)表組成,配置決定了所使用的 JVM(可能是CVM 或 KVM),而簡(jiǎn)表通過(guò)定義特定的類來(lái)為應(yīng)用程序提供功能上的支持,一個(gè)簡(jiǎn)表定義了設(shè)備所提供的 API 集合。
對(duì)比前面簡(jiǎn)表的定義可以知道,MIDP (Mobile Information Devices Profile,移動(dòng)信息設(shè)備簡(jiǎn)表)是簡(jiǎn)表的一種,定義了移動(dòng)信息設(shè)備的類型和提供相關(guān)的API (Application Programming Interface,應(yīng)用程序編程接口)集合, MIDP 所定義的功能更加面向用戶,而且比 CLDC 更高級(jí)。
具體地講,在進(jìn)行MIDlet程序開(kāi)發(fā)時(shí)所使用的API 來(lái)自于:
l CLDC v1.0規(guī)范中定義的4個(gè)包 java.io、java.lang、java.util 與javax.microedition.io ,提供Java語(yǔ)言和CLDC 設(shè)備所支持的基本功能。
l MIDP 所定義的其他包有javax.microedition.midlet 、 javax.microedition.lcdui 、 javax.microedition.lcdui.game、javax.microedition.rms 等,提供諸如程序生命周期控制、用戶界面、游戲、持久存儲(chǔ)這樣的功能。
為了理解虛擬機(jī)、配置和簡(jiǎn)表之間的關(guān)系,圖1.1 將這3個(gè)概念進(jìn)行對(duì)比。在對(duì)比J2ME 內(nèi)的不同虛擬機(jī)、配置和簡(jiǎn)表的同時(shí),也將J2ME 結(jié)構(gòu)和J2SE 結(jié)構(gòu)進(jìn)行了對(duì)比。

1.1.4.1.1 圖1.1 不同虛擬機(jī),配置與簡(jiǎn)表之間的關(guān)系
在圖1.1 中出現(xiàn)了 KJava 這個(gè)字眼,這對(duì)于了解過(guò)手機(jī)程序開(kāi)發(fā)的朋友一定不陌生,曾經(jīng)有一段時(shí)間KJava 程序開(kāi)發(fā)幾乎等同于手機(jī)上的 Java 程序開(kāi)發(fā)。在這里,為了糾正一下這個(gè)看法有必要解釋清楚 KJava 所代表的含義。KJava 是Sun 公司開(kāi)發(fā)的一種簡(jiǎn)表,它包含了 KJava API。KJava并不作為一種完整的、功能齊全的簡(jiǎn)表,Sun 公司最初推出 KJava 時(shí)只是作為一種示范簡(jiǎn)表,即用于演示簡(jiǎn)表如何與 CLDC 一起工作。由于 KJava 出現(xiàn)較早,因此早期的部分手機(jī)設(shè)備都選擇支持KJava 所定義的API。因此,如果把手機(jī)上的Java編程都稱為KJava編程說(shuō)法那是不正確的,把KJava程序開(kāi)發(fā)和MIDP 程序開(kāi)發(fā)等同也是不正確的。由于歷史原因,到目前為止 KJava 已經(jīng)被廣泛使用,但是作者相信 MIDP 將會(huì)逐漸取代KJava的地位,畢竟MIDP 是一個(gè)更為開(kāi)放的標(biāo)準(zhǔn)。
MIDP 和 KJava 一樣,也是建立在 CLDC 之上的,并且提供一個(gè)標(biāo)準(zhǔn)的運(yùn)行時(shí)環(huán)境,允許在終端用戶設(shè)備上動(dòng)態(tài)地部署新的應(yīng)用程序和服務(wù)。與KJava不同點(diǎn)在于,MIDP 是一個(gè)公共的、為移動(dòng)設(shè)備設(shè)計(jì)的工業(yè)標(biāo)準(zhǔn)簡(jiǎn)表,它不依賴某個(gè)特定的商家。對(duì)于移動(dòng)應(yīng)用程序開(kāi)發(fā)來(lái)說(shuō),它是一個(gè)完整的、受支持的基礎(chǔ)。因此現(xiàn)在新的智能手機(jī)設(shè)備,如果支持J2ME 都會(huì)選擇支持MIDP ,而不是KJava 。
除MIDP簡(jiǎn)表外,目前還存在其他類型的簡(jiǎn)表,例如:
l Foundation Profile(基礎(chǔ)簡(jiǎn)表):提供除了用戶界面以外 J2SE 所能夠提供的標(biāo)準(zhǔn)類庫(kù)。
l Personal Profile(個(gè)人簡(jiǎn)表):針對(duì)那些資源相對(duì)有限,但是對(duì)網(wǎng)絡(luò)訪問(wèn)要求很高的設(shè)備,例如Web-TV、汽車導(dǎo)航系統(tǒng)等。
相信在以后隨著J2ME 更廣泛地推廣和應(yīng)用,會(huì)逐漸出現(xiàn)其他類型的簡(jiǎn)表。
在功能方面,MIDP v1.0規(guī)范中包括:
l 應(yīng)用的下載。
l 應(yīng)用的生命周期。
l 端到端的傳輸協(xié)議,例如HTTP (Hyper Text Transmission Protocol ,超文本傳輸協(xié)議)。
l 網(wǎng)絡(luò)連接。
l 持續(xù)性存儲(chǔ)。
l 定時(shí)器。
l 用戶界面。
現(xiàn)在MIDP最新的規(guī)范為 v2.0,MIDP v2.0新增加了以下內(nèi)容:
l 應(yīng)用程序的下載和計(jì)費(fèi)。
l 在 HTTP 的基礎(chǔ)上提供了端到端的SHTTP(Secure Hyper Text Transmission Protocol ,安全超文本傳輸協(xié)議)安全傳輸。
l 應(yīng)用程序的數(shù)字簽名和域的安全模式。
l MIDlet 的 push 注冊(cè)。
在安全方面,J2SE 中Java 程序是運(yùn)行在沙箱機(jī)制下的,為了限制程序?qū)Y源的訪問(wèn),資源被分為兩類:受限資源和非受限資源。當(dāng)程序運(yùn)行時(shí),只有那些被信任的程序才能夠訪問(wèn)受限資源與調(diào)用相關(guān)的 API。在 J2ME 中為了達(dá)到安全的目的也繼承了沙箱機(jī)制,此外,MIDP v2.0引入了信任的 MIDlet 的新概念。當(dāng)無(wú)線信息設(shè)備檢測(cè)到一個(gè)程序是被信任的程序時(shí),則此程序允許訪問(wèn)安全機(jī)制所規(guī)定的API。例如,這些API 可以訪問(wèn)手機(jī)內(nèi)地址本,或者可能是允許訪問(wèn)無(wú)線網(wǎng)絡(luò)。
J2ME / CLDC / MIDP架構(gòu)是專為移動(dòng)通訊設(shè)備而設(shè)計(jì)的。有了前面的介紹,下面再用圖1.2 說(shuō)明MIDP和CLDC之間的關(guān)系。

1.1.5.1.1 圖1.2 CLDC 與 MIDP之間的關(guān)系
在圖1.2中,讀者可以看出:
l MIDP 建立在 CLDC 功能的基礎(chǔ)之上。
l J2ME 規(guī)范允許設(shè)備制造商提供與自己設(shè)備相對(duì)應(yīng)的 API 供程序調(diào)用,一般來(lái)說(shuō),設(shè)備廠商都會(huì)提供一些自己的API 供開(kāi)發(fā)人員使用,這些功能都是有針對(duì)性的,因此在不同的設(shè)備之間可能無(wú)法移植。一般來(lái)說(shuō),這部分API能夠提供額外的功能或者在運(yùn)行性能上有所提高。
此外,在圖1.2中可以看出CLDC 之上有兩類API:
l MIDP API:這些API 正是MIDP 規(guī)范所要定義的API 。
l OEM Specific API:MIDP規(guī)范所涉及的無(wú)線通訊設(shè)備多種多樣,因此它不可能涉及所有設(shè)備的需求。因此這一類的API是由 OEM 廠商提供的,以便訪問(wèn)特定設(shè)備的特定功能。但基于這些API 的應(yīng)用可能不在其他的MIDP設(shè)備上運(yùn)行。關(guān)于這一部分,各個(gè)手機(jī)廠商都提供了自己的開(kāi)發(fā)包,讀者可以到手機(jī)廠商網(wǎng)站下載。
這里需要澄清一個(gè)概念,無(wú)線通信設(shè)備并不等同于移動(dòng)信息設(shè)備。盡管就目前的實(shí)際情況來(lái)講,MIDP 規(guī)范主要是在無(wú)線通信設(shè)備中得到了廣泛的應(yīng)用。
用Java編寫(xiě)程序的最大好處莫過(guò)于一次編寫(xiě),隨處運(yùn)行。但是由于J2ME/CLDC/MIDP架構(gòu)的限制,同一個(gè)Java程序只能在相同的MIDP支持下運(yùn)行。要完整地定義所有的移動(dòng)設(shè)備是非常困難的,但是隨著MIDP的標(biāo)準(zhǔn)化和各個(gè)設(shè)備廠家對(duì)MIDP的支持,在標(biāo)準(zhǔn)的MIDP下開(kāi)發(fā)的Java應(yīng)用程序能夠在支持標(biāo)準(zhǔn)MIDP的設(shè)備上運(yùn)行。目前市面上大多數(shù)的智能手機(jī)都能夠支持MIDP v1.0,而且已經(jīng)開(kāi)始出現(xiàn)支持MIDP v2.0 的手機(jī),例如Nokia 的 S90系列, SonyEricsson 的P900系列。
有一點(diǎn)必須要提醒讀者注意,CLDC和MIDP是J2ME 中兩個(gè)不同的規(guī)范,在 CLDC v1.0 和MIDP 1.0 規(guī)范下,這兩個(gè)部分是沒(méi)有交叉的,但是當(dāng)MIDP 2.0 發(fā)布時(shí),除了在 MIDP 所提供的 API 中進(jìn)行了改動(dòng),還在 CLDC 所提供的 API 中增加了部分功能。例如 javax.microedition.io是由CLDC 規(guī)范所定義的,但在 MIDP 2.0 發(fā)布時(shí) javax.microedition.io 包中增加了對(duì)套接字,串口等的支持。讀者在學(xué)習(xí)時(shí)需要注意這一點(diǎn),當(dāng)查看某個(gè) API 時(shí),可以從幫助文檔中發(fā)現(xiàn)此 API 是屬于哪個(gè)規(guī)范定義的,避免引起理解上的混亂。
J2SE 為桌面開(kāi)發(fā)和低端商務(wù)應(yīng)用提供了可行的解決方案,J2EE為了各種企業(yè)應(yīng)用的開(kāi)發(fā)提供了解決方案,而J2ME則希望讓自己成為小型設(shè)備和嵌入式設(shè)備的開(kāi)發(fā)人員的最佳選擇。
圖1.3 描述了Java體系結(jié)構(gòu)中 J2EE、J2SE 與 J2ME 對(duì)于設(shè)備的應(yīng)用范圍。

1.1.6.1.1 圖1.3 J2EE、J2SE和J2ME 的應(yīng)用范圍
l J2SE:是為桌面 PC而設(shè)計(jì)的,主要運(yùn)行在 Unix 、 Linux、 Microsoft Windows等操作系統(tǒng)上。
l J2EE:是一個(gè)適合分布式的、多用戶、企業(yè)級(jí)應(yīng)用系統(tǒng)運(yùn)轉(zhuǎn)的平臺(tái)。它以J2SE為基礎(chǔ),增加了處理服務(wù)器端計(jì)算的功能。
l J2ME:和J2SE不同,它并不是一個(gè)單一的規(guī)范。準(zhǔn)確地說(shuō),J2ME是為了支持像小型嵌入式設(shè)備或移動(dòng)設(shè)備而制定的一系列的技術(shù)和規(guī)范的總稱。在提供類似的類庫(kù)的同時(shí)也對(duì) J2SE 中的類庫(kù)進(jìn)行了裁剪