明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

Java嵌入式開發(fā)之二(下) [轉(zhuǎn)自yesky]

[摘要]第五節(jié) 再談?wù)勔恍㎎2ME規(guī)范  在 J2ME內(nèi)還有很多子規(guī)范, J2ME的重要的部分如下:PersonalJava、K虛擬機 (KVM)、Java嵌入服務(wù)器以及 PersonalJava的兩個擴展規(guī)范: JavaPhone和 JavaTV應(yīng)用程序接口。 你可以想象, JavaPhone是一個定位...
第五節(jié) 再談?wù)勔恍㎎2ME規(guī)范

  在 J2ME內(nèi)還有很多子規(guī)范, J2ME的重要的部分如下:PersonalJava、K虛擬機 (KVM)、Java嵌入服務(wù)器以及 PersonalJava的兩個擴展規(guī)范: JavaPhone和 JavaTV應(yīng)用程序接口。 你可以想象, JavaPhone是一個定位于無線電智能電話和互聯(lián)網(wǎng)絡(luò)可視電話的應(yīng)用程序接口,而 JavaTV則滿足機頂盒市場的需求。

  下面我想詳細(xì)的談一談以上的規(guī)范:

  1、PersonalJava

  PersonalJava應(yīng)用程序環(huán)境目標(biāo)是 Web連接消費設(shè)備----常常執(zhí)行來自網(wǎng)絡(luò)的小應(yīng)用程序。問題是 PersonalJava如何適合 J2ME的配置和簡表方案。 答案是 PersonalJava將被包容進(jìn) Connected Device Configuration中,最終將被定義為 Personal簡表,即前面所談到的Personal簡表。

  另一方面,有一段時間將有兩個 Java應(yīng)用程序接口為嵌入開發(fā)世界服務(wù): PersonalJava和 EmbeddedJava。 PersonalJava偎依在 J2ME大傘之下, 可為什么 EmbeddedJava不呢? EmbeddedJava不和 PersonalJava同在 J2ME內(nèi),是因為在 PersonalJava和 EmbeddedJava應(yīng)用程序之間有一個基本的差別。 PersonalJava應(yīng)用程序期望連接到某類網(wǎng)絡(luò)中下載并執(zhí)行小應(yīng)用程序。 按照這種觀點, PersonalJava設(shè)備就是一般用途的消費設(shè)備; 它們的能力可以被擴展。

  相比之下, EmbeddedJava設(shè)備則慘了點。 它們執(zhí)行的功能都非常具體的,基本沒有必要提供下載新的代碼到 EmbeddedJava設(shè)備的能力。 Hence, PersonalJava設(shè)備使用可擴展 Java應(yīng)用程序接口; 而EmbeddedJava設(shè)備則沒有,因為沒有必要使用。

  PersonalJava可以以兩種形式得到: 由原碼形式的,提供給那些對把PersonalJava移植到其他設(shè)備感興趣的開發(fā)者,那些已經(jīng)把 PersonalJava移植到某個具體的操作系統(tǒng)和處理機的組織提供二進(jìn)制形式的 PersonalJava環(huán)境。有興趣探索 PersonalJava的開發(fā)者如果沒有二進(jìn)制平臺也可以使用 PersonalJava模擬環(huán)境 ( PJEE )。 這個模擬器運行于 Solaris/SPARC或 Windows,并且在許多配置中可用。 這些多種多樣的配置基于“ look and feel”和類庫支持 (環(huán)境是否提供 PersonalJava規(guī)范中規(guī)定的最低限度的或最大的類庫)。PJEE包括類文件,一個應(yīng)用程序 launcher和一個 appletviewer (兩者都是為了調(diào)試功能并使其最優(yōu)化)和其它的附帶的文件 (例如字體敘述文件)。

  J2ME家族的另一位成員 JavaCheck實用程序,提供了 PersonalJava的補充支持。 你把應(yīng)用程序傳過 JavaCheck,它將告訴你你的應(yīng)用程序在一個 PersonalJava環(huán)境中能否順利地執(zhí)行。 JavaCheck檢查類之間的依賴關(guān)系,如果應(yīng)用程序調(diào)用了一個在 PersonalJava不可用的應(yīng)用程序接口,它就會給出一個警報信號。 (據(jù)我所知,目前有兩種JavaCheck的版本可用,一個是用于檢驗 PersonalJava 1.0版應(yīng)用程序,另一個用于檢驗 1.1.x版程序。 當(dāng)前的 PersonalJava應(yīng)用程序接口規(guī)范是 1.2,用于這一版本的 JavaCheck還沒有。 讀者請去Sun相關(guān)網(wǎng)站去看看( http : file://java.sun.com/products/personaljava)。

  2、KVM

  前面我也說過,KVM是用于 J2ME平臺最小的虛擬機,并且是用于CLDC配置的虛擬機?墒荍2ME應(yīng)用程序并不一定非要使用 KVM,J2ME技術(shù)可以使用任何虛擬機,不過至少應(yīng)當(dāng)有 KVM這樣的功能。

  為了滿足基于KVM的設(shè)備一般只有狹小的內(nèi)存空間和有限的處理能力的事實, KVM使用 C編寫 (它不是現(xiàn)有的VM改進(jìn)了的以后的產(chǎn)品)。 此外, KVM是模塊化的, 也就是說,它是由模塊構(gòu)建的,當(dāng)某個模塊實現(xiàn)了預(yù)先設(shè)定的目標(biāo)后,就可以很容易地把這一模塊卸載。 可選的某塊包括: 大的數(shù)據(jù)類型 ( long、 float和 double ),多維數(shù)組、類文件驗證等。

  KVM的本地界面以輕便性為原則構(gòu)建,所以在KVM中任務(wù)切換不依賴硬件產(chǎn)生的記時器中斷,因此在這種意思上來說不是搶先式。任務(wù)切換發(fā)生在虛擬機執(zhí)行了一個預(yù)設(shè)編號的字節(jié)碼之后。 并且, KVM的無用單元收集利用一個標(biāo)記清掃(mark and sweep)算法來實現(xiàn)無用單元釋放。 因此,對象引用是直接的,就像標(biāo)準(zhǔn) Java一樣。

  當(dāng)然,除了虛擬機以外還有許多可用的執(zhí)行環(huán)境,在小型設(shè)備中,虛擬機必須要么被擴展,要么在附加工具協(xié)助下提供一個更加完整的運行期環(huán)境,正是這個原因, KVM需要附帶的工具,比如說, JavaCodeCompact工具提供了預(yù)鏈接和預(yù)加載類, 允許Java類被直接地鏈接進(jìn)虛擬機中。((設(shè)備上所有的應(yīng)用程序使用的類 can直接地嵌入虛擬機。)

  KVM一個可選的附件就是 Java Application Manager ( Java應(yīng)用程序管理器,簡稱 JAM )。JAM的工作就是處理下載、安裝、執(zhí)行和卸載 CLDC設(shè)備上的應(yīng)用程序的細(xì)節(jié)問題,因為資源有限,在CLDC設(shè)備上有可能不存在這些功能。JAM也處理更新安裝應(yīng)用程序的操作。(如果更新過程失敗,它甚至可以重新使用舊的應(yīng)用程序。 )

  3、Java Embedded Server(Java嵌入服務(wù)器)

  Java Embedded Server( Java嵌入服務(wù)器,簡稱 JES),在 PersonalJava基礎(chǔ)上建立,是一個用于嵌入式網(wǎng)絡(luò)設(shè)備的運行期環(huán)境。為了理解 JES,你必須理解兩個核心概念:服務(wù)和服務(wù)空間結(jié)構(gòu)。后者是前者的容器。服務(wù)程序是運行于一個 JES服務(wù)器上的組件化程序;服務(wù)空間結(jié)構(gòu)是為服務(wù)程序提供生命周期 支持的環(huán)境。

  技術(shù)上說,服務(wù)程序是界面的實現(xiàn),事實上,它是一個實現(xiàn)特定活動的Java類集合。比如說,假如把 JES配置為一個家庭的氣候控制系統(tǒng)的服務(wù)器,可以把從模數(shù)轉(zhuǎn)換器讀到的溫度數(shù)據(jù)放進(jìn)一個數(shù)據(jù)組件程序中。我就可以稱這個組件為ReadThermostats服務(wù)程序。

  在 JES的領(lǐng)域,服務(wù)的封裝媒介稱為 bundle。簡單地說,bundle就是一個帶有特殊內(nèi)容的JAR文件。服務(wù)程序和bundle之間有一對一關(guān)系,一個bundle帶有一個服務(wù)程序。服務(wù)程序和 bundle之間有一對一關(guān)系,一個 bundle帶有一個服務(wù)程序。可這也不一定,一個 bundle可以設(shè)置多個服務(wù)程序索引 (注意, JES提供的所有的核心服務(wù),每個 bundle中只有一個 )。

  正如前面提到的那樣,服務(wù)空間的一項工作就是管理服務(wù)程序的生命周期,這個工作的很大的部分包括解決服務(wù)隸屬關(guān)系。bundle內(nèi)容的一個重要的部分是bundle服務(wù)的依賴信息。所以,當(dāng)服務(wù)空間打開一個bundle安裝它的服務(wù)時,服務(wù)空間就可以確定外部需要什么服務(wù)。而且,一個服務(wù)的依賴關(guān)系并不是靜止不變的,它們可以隨某些事件改變。比如說當(dāng)服務(wù)程序更新時的變化就是一個很好的例子。一個服務(wù)的新的版本可以添加或去除依賴關(guān)系。服務(wù)空間跟蹤并解決這樣的動態(tài)依賴關(guān)系。如果服務(wù)空間處理所有服務(wù)程序的生命周期,這就暗示了服務(wù)空間被賦予知曉一切的能力,那就是說,它能夠推論結(jié)構(gòu)、依賴、安裝的細(xì)微差別等所有它負(fù)責(zé)的服務(wù)。服務(wù)空間通過在 bundle內(nèi)伴隨服務(wù)的 Java代碼模塊處理一些任務(wù),這些模塊被稱作 wizard(向?qū)В。JES向?qū)歉鶕?jù)它們完成的任務(wù)命名的:

  Dependencies -向?qū)Ц嬖V調(diào)用者一個bundle依賴關(guān)系是什么。

  Installer-向?qū)幚韇undle中服務(wù)的安裝和刪除操作。

  Activator -向?qū)е廊绾螁雍徒K止服務(wù)。

  Updater -向?qū)Э丶耣undle中的服務(wù)。(更新向?qū)Р粌H知道更新一個服務(wù),而且知道在何時和什么情況下更新服務(wù)。 )

  About -這個向?qū)В拖袼Q意味的那樣,返回關(guān)于 bundle內(nèi)容的信息。

  Dispatcher -這是一種元向?qū)В╩eta-wizard)。服務(wù)空間調(diào)用dispatcher向?qū)Фㄎ灰粋bundle的其他向?qū)А?

  當(dāng)一個 JES服務(wù)器啟動的時候,服務(wù)空間并不是完全沒有啟動服務(wù)。JES定義一組核心服務(wù)(可選),這些都是任何 JES服務(wù)器的組成部分。這些核心服務(wù)包含:

  HTTP服務(wù)

  日志 -記錄錯誤和事件日志
  
  日期 -精確到秒的日期/時間服務(wù)
  
  連接管理器 -提供網(wǎng)絡(luò)服務(wù)和Socket綁定,也處理連接接收。

  線程管理器 -管理服務(wù)器提供的線程。thread管理器支持線程池并允許有效使用線程上界的規(guī)范。

  計劃程序 -提供未來的事件計劃安排 (可用于告訴服務(wù)器某某動作必須在某某事件發(fā)生 )

  RMI

  SNMP

  控制臺 -提供遠(yuǎn)程管理服務(wù)器功能

  基于 HTTP的遠(yuǎn)程應(yīng)用程序接口實現(xiàn)

  基于 RMI的遠(yuǎn)程應(yīng)用程序接口實現(xiàn)
 
  如果你把服務(wù)空間結(jié)構(gòu)當(dāng)成 JavaBean中的容器的話, JES就變得容易理解了。在這種類比關(guān)系中,服務(wù)程序就相當(dāng) JavaBean。那么,正象組件容器提供一個環(huán)境供 JavaBeans實例化、運行一樣,服務(wù)空間就是以實例化的服務(wù)的聚集地。服務(wù)空間管理安裝、實例化、執(zhí)行、終止以及卸載服務(wù);它也提供應(yīng)用程序接口供服務(wù)交互作用。