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

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

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

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