J2ME 簡(jiǎn)介
J2ME (Java 2 Micro Edition) 簡(jiǎn)介
■前言
如果您曾經(jīng)到 http://www.javasoft.com 網(wǎng)站上查詢(xún)有關(guān) Java 2 Micro Edition 的資料,十之八九會(huì)被一大堆的技術(shù)名詞搞的一頭霧水。什么 KVM ,什么 CLDC 、 CDC 、 MIDP ,後面還冒出了 Personal Java 、 Embedded Java 以及 JES 等名詞。雖然名為 Java 的微小版本,可是它的世界可真是不小,讓我們滿(mǎn)肚子「見(jiàn)山不是山,見(jiàn)水不是水」的疑惑。的確,在我剛開(kāi)始接觸 Java 2 Micro Edition 的時(shí)候,就感覺(jué)到這個(gè)玩意兒實(shí)在越看越讓人摸不著頭緒。因此在本章中,我舍棄了技術(shù)上的細(xì)節(jié),希望帶大家從巨觀的角度來(lái)看待 Java 2 Micro Edition 的世界。希望讀過(guò)本章之後,可以使大家體驗(yàn)「見(jiàn)山是山,見(jiàn)水是水」,一切豁然開(kāi)朗的感覺(jué)。首先,我們必須先對(duì) Java 2 Micro Edition 在整個(gè) Java 技術(shù)之中的定位做個(gè)了解。
■各種不同版本之 Java 程序的開(kāi)發(fā)
如前面所說(shuō),各種不同的 Java 版本,在其支援的核心類(lèi)別函式庫(kù)之完整性以及所支援的 Java 基本型別這兩件事情上都有所差異,也就是說(shuō),不管您開(kāi)發(fā)的是企業(yè)所使用的 Java 程序、嵌入式裝置上執(zhí)行的 Java 程序、瀏覽器上執(zhí)行的 Applet ,或是在 PC 上執(zhí)行的應(yīng)用程序。您都必須在您的電腦上先安裝 J2SE ,然後再安裝各種版本的核心類(lèi)別函式庫(kù)以及額外的擴(kuò)充類(lèi)別函式庫(kù),如此才能成功地開(kāi)發(fā)各種不同目的的 Java 程序。 J2SE 所提供的 Java 編譯器 (javac.exe) 可以幫助我們編譯各種不同平臺(tái)上的 Java 程序,而 J2SE 所提供的 Java 虛擬機(jī)器 (java.exe) 則可以幫助我們?cè)?/span> PC 上先行測(cè)試這些程序執(zhí)行結(jié)果的正確與否。另外, Java 編譯器并不會(huì)幫您檢查您的程序是否符合各種平臺(tái)上所支援的核心類(lèi)別函式庫(kù)與 Java 基本型別。舉例來(lái)說(shuō),雖然我們?cè)谇懊嬲f(shuō)過(guò), Smart Card 版本并不支援 boolean 、 byte 以外的 Java 基本型別,而且該平臺(tái)也只支援 java.lang.* 核心類(lèi)別,可是當(dāng)我們?cè)谧珜?xiě) Smart Card 平臺(tái)上的程序時(shí),就算在程序碼里頭用了 boolean 或 byte 以外的 Java 基本型別,或者使用了 java.lang.* 之外的其他核心類(lèi)別,編譯器仍然可以照常幫您編譯出類(lèi)別檔。這個(gè)時(shí)候大家一定開(kāi)始產(chǎn)生疑惑 -- 那么這些程序如果放到 Smart Card 上頭執(zhí)行的時(shí)候,出了問(wèn)題怎么辦 ? 難道不會(huì)造成 Smart Card 上的虛擬機(jī)器執(zhí)行時(shí)發(fā)生錯(cuò)誤嗎 ? 針對(duì)這個(gè)可能發(fā)生的潛在問(wèn)題, Sun Microsystems 在各種不同版本的開(kāi)發(fā)套件中,有些會(huì)內(nèi)附檢查器 (checker) 或者預(yù)先審核器 (preverifier) ,這兩個(gè)工具可以幫助您在將程序放到目標(biāo)平臺(tái)之前先做好檢查和預(yù)先審核的工作。檢查器會(huì)幫您找出類(lèi)別檔之中不合目標(biāo)平臺(tái)規(guī)格的部分,并提醒你這些地方可能無(wú)法在目標(biāo)平臺(tái)上執(zhí)行。因此只要有檢查器的協(xié)助,您大致上可以確定您的程序可以符合目標(biāo)平臺(tái)的規(guī)定并順利執(zhí)行。 Java Card 的開(kāi)發(fā)套件中就附有檢查器。
而某些平臺(tái)的開(kāi)發(fā)套件則附有預(yù)先審核器,預(yù)先審核器除了做檢查器做的工作之外,還有一項(xiàng)額外的工作,就是減輕目標(biāo)平臺(tái)上虛擬機(jī)器的負(fù)擔(dān),要解釋預(yù)先審核器這個(gè)額外的工作,在傳統(tǒng)的 Java 程序之中,為了安全上的考量,任何進(jìn)入執(zhí)行環(huán)境的類(lèi)別檔 ( 不管該類(lèi)別檔是來(lái)自本機(jī)或是遠(yuǎn)端機(jī)器 ) ,都必須先經(jīng)過(guò) Byte Code 審核器 (Byte code verifier) 的驗(yàn)證,以防止程序在傳送途中遭到惡意的修改,而使得 Java 程序在執(zhí)行時(shí)對(duì)系統(tǒng)有不良影響。經(jīng)過(guò)審核之後,該類(lèi)別檔才能開(kāi)始被 J 虛擬機(jī)器所執(zhí)行。如果這個(gè)審核的動(dòng)作在一般的 PC 上執(zhí)行,速度倒是還能夠接受,可是一旦放到如 Palm 或是手機(jī)這些 CPU 較慢、記憶體也比較少的機(jī)器上面就顯得十分吃力了。為了節(jié)省寶貴的 CPU 運(yùn)算時(shí)間 ( 既能省電又能夠加速程序執(zhí)行 ) ,因此,在程序設(shè)計(jì)師產(chǎn)生能夠讓某些特定平臺(tái)執(zhí)行的類(lèi)別檔之前,程序設(shè)計(jì)師必須先在 PC 上使用預(yù)先審核器做一些前置的審核工作,預(yù)先審核器會(huì)在類(lèi)別檔之中加入一些特殊標(biāo)記或符號(hào)。如此一來(lái),當(dāng)這些程序放到目標(biāo)平臺(tái)上執(zhí)行時(shí),就可以大幅減少在目標(biāo)平臺(tái)上做審核時(shí)的時(shí)間,藉而加速程序的的啟動(dòng)及執(zhí)行速度。因此在 J2ME 之下的程序 (Spotlet 、 MIDlet) ,其執(zhí)行步驟變成因?yàn)轭A(yù)先審核的關(guān)系,執(zhí)行時(shí) Byte Code 審核器的工作就變少了,也因此從程序載入到開(kāi)始執(zhí)行之間的時(shí)間因而縮短。 CLDC 標(biāo)準(zhǔn)實(shí)作和 MIDP 參考實(shí)作之中就附有預(yù)先審核器。
■ Java 版本的演進(jìn)
相信熟悉 Java 演進(jìn)歷史的人或多或少都聽(tīng)說(shuō)過(guò), Java 技術(shù)一開(kāi)始并非就叫做 Java ,而是叫做 OAK ,而且最早的時(shí)候就是為了嵌入式系統(tǒng)而設(shè)計(jì)的一項(xiàng)產(chǎn)品。後來(lái)因?yàn)榫W(wǎng)際網(wǎng)路的發(fā)達(dá),而 OAK 的諸多特性剛好又適合用在網(wǎng)路上 ( 例如可移植性、編譯後程序碼很小 ) ,因?yàn)樯虡?biāo)已被注冊(cè)的關(guān)系,因此 OAK 被改名成 Java ,從此因緣際會(huì)地成了網(wǎng)路上的閃亮巨星,并隨著時(shí)間越來(lái)越成熟,也慢慢地產(chǎn)生了許多非原本預(yù)期中的相關(guān)運(yùn)用。雖然 Java 已經(jīng)被用到許多企業(yè)級(jí)軟體上,可是其實(shí)骨子里面還是非常適合用在嵌入式系統(tǒng)之中。
雖然從 Java 1.0 發(fā)表之後, Java 就被廣泛地使用在桌上型應(yīng)用程序以及 Applet 的開(kāi)發(fā)上,但是,從 Java 1.1 開(kāi)始, Java 又回到了它一開(kāi)始的老路 -- 也就是嵌入式系統(tǒng)方面的應(yīng)用,在當(dāng)時(shí) Sun Microsystems 發(fā)表了 Embedded Java 與 Personal Java( 也有人簡(jiǎn)稱(chēng)為 PJava) 這兩項(xiàng)規(guī)格。其中 Embedded Java 是為了資源十分有限,而且沒(méi)有顯示設(shè)備的嵌入式裝置而設(shè)計(jì); Personal Java 則是為了在能夠與網(wǎng)際網(wǎng)路連線(xiàn)、并擁有顯示系統(tǒng) ( 例如彩色 LCD) 的消費(fèi)性電子裝置而設(shè)計(jì)。接著 Java 的版本演進(jìn)到 Java 2 ,這時(shí)為了再明顯區(qū)分各種 Java 的應(yīng)用,所以分割出了 J2EE 、 J2SE 、以及 J2ME 三種版本。這三種版本的各種特性我們已經(jīng)在前面已經(jīng)詳細(xì)地描述,在此不再多說(shuō) 。因?yàn)?/span> Java 2 將 Java 的應(yīng)用區(qū)分成三大塊,使得 Java 程序語(yǔ)言的發(fā)展不會(huì)再像 Java 1.1 時(shí)如樹(shù)枝狀般擴(kuò)散出去,這么一來(lái)有助於大家對(duì) Java 各種應(yīng)用的 ?? 清,而不會(huì)造成今後越發(fā)展下去越不可收拾的混亂局面。額外向大家一提的是,後來(lái) Personal Java 發(fā)展到 1.2 版的時(shí)候,也采用了一些 Java 2 平臺(tái)上與安全性有關(guān)的設(shè)計(jì)。
■ Java 2 Micro Edition 概觀
J2ME 在設(shè)計(jì)其規(guī)格的時(shí)候,遵循著「對(duì)於各種不同的裝置而造出一個(gè)單一的開(kāi)發(fā)系統(tǒng)是沒(méi)有意義的事」這個(gè)基本原則。於是 J2ME 先將所有的嵌入式裝置大體上區(qū)分為兩種 : 一種是運(yùn)算功能有限、電力供應(yīng)也有限的嵌入式裝置 ( 比方說(shuō) PDA 、手機(jī) ) ;另外一種則是運(yùn)算能力相對(duì)較佳、并請(qǐng)?jiān)陔娏?yīng)上相對(duì)比較充足的嵌入式裝置 ( 比方說(shuō)冷氣機(jī)、電冰箱、電視機(jī)上盒 (set-top box)) 。因?yàn)檫@兩種型態(tài)的嵌入式裝置,所以 Java 引入了一個(gè)叫做 Configuration 的概念,然後把上述運(yùn)算功能有限、電力有限的嵌入式裝置定義在 Connected Limited Device Configuration(CLDC) 規(guī)格之中;而另外一種裝置則規(guī)范為 Connected Device Configuration(CDC) 規(guī)格。也就是說(shuō), J2ME 先把所有的嵌入式裝置利用 Configuration 的概念區(qū)隔成兩種抽象的型態(tài)。
其實(shí)在這里大家可以把 Configuration 當(dāng)作是 J2ME 對(duì)於兩種類(lèi)型嵌入式裝置的規(guī)格,而這些規(guī)格之中定義了這些裝置至少要符合的運(yùn)算能力、供電能力、記憶體大小等規(guī)范,同時(shí)也定了一組在這些裝置上執(zhí)行的 Java 程序所能使用的類(lèi)別函式庫(kù)、這些規(guī)范之中所定義的類(lèi)別函式庫(kù)為 Java 標(biāo)準(zhǔn)核心類(lèi)別函式庫(kù)的子集合以及與該型態(tài)裝置特性相符的擴(kuò)充類(lèi)別函式庫(kù)。比方就 CLDC 的規(guī)范來(lái)說(shuō),可以支援的核心類(lèi)別函式庫(kù)為 java.lang.* 、 java.io.* 、 java.util.* ,而支援的擴(kuò)充類(lèi)別函式庫(kù)為 java.microedition.io.* 。區(qū)分出兩種主要的 Configuration 之後, J2ME 接著在定義出 Profile 的概念。 Profile 是架構(gòu)在 Configuration 之上的規(guī)格。之所以有 Profile 的概念,是為了要更明確地區(qū)分出各種嵌入式裝置上 Java 程序該如何開(kāi)發(fā)以及它們應(yīng)該具有哪些功能。因此 Profile 之中定義了與特定嵌入式裝置非常相關(guān)的擴(kuò)充類(lèi)別函式庫(kù),而 Java 程序在各種嵌入式裝置上的使用者介面該如何呈現(xiàn)就是定義在 Profile 里頭。 Profile 之中所定義的擴(kuò)充類(lèi)別函式庫(kù)是根據(jù)底層 Configuration 內(nèi)所定義的核心類(lèi)別函式庫(kù)所建立。
■ Java 在嵌入式系統(tǒng)上的應(yīng)用
由於 Java 本身最初的設(shè)計(jì)理念即是針對(duì)嵌入式系統(tǒng),因此將他用在嵌入式系統(tǒng)上真可謂如魚(yú)得水。在這個(gè) Linux 開(kāi)始興起的時(shí)空交會(huì)點(diǎn),網(wǎng)路上出現(xiàn)了一篇關(guān)於嵌入式 Linux 與 Java 互相配合以造就雙贏局面的相關(guān)報(bào)導(dǎo),這是由 LinuxDevices.com 的專(zhuān)欄作家 Randy Rorden 所發(fā)表的一篇白皮書(shū),名為「 Java 與嵌入式 Linux 合作」。 在這篇文章里頭,作者對(duì)嵌入式 Linux 與 Java 個(gè)別的優(yōu)點(diǎn)提出他的看法,同時(shí)也提出了 Java-Linux 平臺(tái)的構(gòu)想。有興趣的讀者可以到到下列幾個(gè)網(wǎng)站參考相關(guān)新聞與資料。
1. Java 與嵌入式 Linux 合作白皮書(shū)
http://www.ctech.com.tw/d-news/news/linux/89090208.asp
2. Java 及嵌入式 Linux 合作
http://www.linuxdevices.com/news/NS5973673868.html
3. 即將來(lái)臨的 Java-Linux 結(jié)合
http://www.linuxdevices.com/articles/AT7102892618.html
■為何要用 Java 撰寫(xiě) PDA 上的應(yīng)用程序 ?
由於預(yù)期到今後行動(dòng)通訊時(shí)代的來(lái)臨,所以通訊相關(guān)行業(yè)變的前景可期,而除了達(dá)成行動(dòng)通訊的主要工具 -- 手機(jī)月來(lái)越精巧之外,有更多的廠商相繼投入 PDA 的生產(chǎn)與開(kāi)發(fā)。本來(lái) PDA 主要的平臺(tái)有 PalmOS 、 Windows CE 以及 EPOC ,也不知道曾幾何時(shí),開(kāi)始一大堆公司投入 embedded linux 的研發(fā),其中包括國(guó)內(nèi)資策會(huì)自己開(kāi)發(fā)的 @ViS 作業(yè)系統(tǒng),互慧科技也有自己的嵌入式作業(yè)系統(tǒng),當(dāng)然更不用說(shuō)大陸廠商與韓國(guó)廠商了。 喔喔 ! 這些作業(yè)平臺(tái)的數(shù)量比起 PC 來(lái)說(shuō)真不知道要復(fù)雜上幾倍。對(duì)一般使用者來(lái)說(shuō)當(dāng)然影響比較小,可是對(duì)於程序開(kāi)發(fā)者來(lái)說(shuō),看到這么多不同的程序發(fā)展平臺(tái),真是讓人望之卻步。如果每個(gè)平臺(tái)都有自己的程序?qū)懛ㄒ约昂綆?kù),那么光是看上面這些平臺(tái)至少就要學(xué)習(xí)五種以上程序的寫(xiě)法。當(dāng)然,只專(zhuān)精一種平臺(tái)當(dāng)然是很好的事情。可是程序設(shè)計(jì)師不禁要說(shuō) : ”如果我們寫(xiě)出來(lái)的軟體可以在不經(jīng)過(guò)修改原始碼的情況下就能夠在這些平臺(tái)上執(zhí)行,那不是更完美嗎 ? ” 對(duì)程序開(kāi)發(fā)者來(lái)說(shuō),這樣的投資報(bào)酬率當(dāng)然是最大的。
要在那么多平臺(tái)上開(kāi)發(fā)程序,對(duì)程序設(shè)計(jì)師來(lái)說(shuō)的確是一個(gè)很大的挑戰(zhàn),如果要把所有的時(shí)間和精力放在軟體的可用性上,那么相對(duì)地很多時(shí)候我們根本沒(méi)有那么多時(shí)間撰寫(xiě)各種平臺(tái)的程序。要解決這個(gè)問(wèn)題,一般來(lái)說(shuō)程序設(shè)計(jì)師會(huì)選用一個(gè)可以跨平臺(tái)的 Framework 來(lái)達(dá)成至少 source code level 的跨平臺(tái) ( 例入 Qt 就能做到 ) 。不過(guò)在本篇文章中我們要介紹的則是更終極的解決方案 ?Java ,利用 Java 的” write once, run anywhere ”特性,我們可以真正達(dá)到程序只要寫(xiě)一次,拿到任何平臺(tái)上都可以執(zhí)行 ( 當(dāng)然前提是必須要 PDA 的廠商也要實(shí)作出該平臺(tái)的 Java Virtual Machine 才行 ) 。利用 Java 來(lái)做 PDA 上的程序當(dāng)然有其缺點(diǎn),最廣為人知的可能就是執(zhí)行效率的問(wèn)題, Java 在執(zhí)行速度這個(gè)議題上一直讓人詬病。不過(guò)筆者認(rèn)為,隨著技術(shù)的發(fā)達(dá),將會(huì)有更快更省電的 PDA 專(zhuān)用 CPU 出現(xiàn),因此效率上的問(wèn)題其實(shí)是可以忽略的。更何況,當(dāng) Sun 在設(shè)計(jì) J2ME 的時(shí)候,也用了很多方式企圖加快 Java 在 PDA 上的執(zhí)行速度 ( 例如預(yù)先審核 ) 。
■總結(jié)
看完了本章之後,您對(duì)整個(gè) Java 2 Micro Edition 有個(gè)大致上的了解了嗎? 再進(jìn)入下一章之前,請(qǐng)務(wù)必弄清楚本章所提到的專(zhuān)有名詞。如果各位想對(duì)各種技術(shù)規(guī)格做更詳細(xì)的了解,請(qǐng)自行參考下表所列出的網(wǎng)頁(yè)。
Consumer & Embedded Technologies
http://java.sun.com/products/consumer-embedded/
Consumer & Embedded
http://developer.java.sun.com/developer/products/j2me/
Java 2 Micro Edition
http://www.javasoft.com/j2me/?
JDC J2ME Tech Tips
http://developer.java.sun.com/developer/J2METechTips/?
CLDC & KVM
http://www.javasoft.com/products/cldc/?
http://developer.java.sun.com/developer/products/j2me/wireless.
html?
MIDP
http://www.javasoft.com/products/midp/
Embedded Java
http://www.javasoft.com/products/embeddedjava/
Personal Java
http://java.sun.com/products/personaljava/
JavaPhone
http://java.sun.com/products/javaphone/
Java Embedded Server
http://www.sun.com/software/embeddedserver/index.html?
http://developer.java.sun.com/developer/products/j2me/embedserv
.html?
JavaTV
http://www.javasoft.com/products/javatv/
http://developer.java.sun.com/developer/products/j2me/tv.html?
Java Card
http://java.sun.com/products/javacard/?
http://developer.java.sun.com/developer/products/j2me/smartcard .html
Motorola 官方 Java 網(wǎng)站
http://www.motorola.com/java/?
JINI
http://www.sun.com/jini/
http://developer.java.sun.com/developer/products/j2me/downloads .html
Spotless System Page
http://www.sun.com/research/spotless/