Java嵌入式開(kāi)發(fā)之二(下) [轉(zhuǎn)自yesky]
發(fā)表時(shí)間:2024-02-24 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]第五節(jié) 再談?wù)勔恍㎎2ME規(guī)范 在 J2ME內(nèi)還有很多子規(guī)范, J2ME的重要的部分如下:PersonalJava、K虛擬機(jī) (KVM)、Java嵌入服務(wù)器以及 PersonalJava的兩個(gè)擴(kuò)展規(guī)范: JavaPhone和 JavaTV應(yīng)用程序接口。 你可以想象, JavaPhone是一個(gè)定位...
第五節(jié) 再談?wù)勔恍㎎2ME規(guī)范
在 J2ME內(nèi)還有很多子規(guī)范, J2ME的重要的部分如下:PersonalJava、K虛擬機(jī) (KVM)、Java嵌入服務(wù)器以及 PersonalJava的兩個(gè)擴(kuò)展規(guī)范: JavaPhone和 JavaTV應(yīng)用程序接口。 你可以想象, JavaPhone是一個(gè)定位于無(wú)線電智能電話和互聯(lián)網(wǎng)絡(luò)可視電話的應(yīng)用程序接口,而 JavaTV則滿足機(jī)頂盒市場(chǎng)的需求。
下面我想詳細(xì)的談一談以上的規(guī)范:
1、PersonalJava
PersonalJava應(yīng)用程序環(huán)境目標(biāo)是 Web連接消費(fèi)設(shè)備----常常執(zhí)行來(lái)自網(wǎng)絡(luò)的小應(yīng)用程序。問(wèn)題是 PersonalJava如何適合 J2ME的配置和簡(jiǎn)表方案。 答案是 PersonalJava將被包容進(jìn) Connected Device Configuration中,最終將被定義為 Personal簡(jiǎn)表,即前面所談到的Personal簡(jiǎn)表。
另一方面,有一段時(shí)間將有兩個(gè) Java應(yīng)用程序接口為嵌入開(kāi)發(fā)世界服務(wù): PersonalJava和 EmbeddedJava。 PersonalJava偎依在 J2ME大傘之下, 可為什么 EmbeddedJava不呢? EmbeddedJava不和 PersonalJava同在 J2ME內(nèi),是因?yàn)樵?PersonalJava和 EmbeddedJava應(yīng)用程序之間有一個(gè)基本的差別。 PersonalJava應(yīng)用程序期望連接到某類(lèi)網(wǎng)絡(luò)中下載并執(zhí)行小應(yīng)用程序。 按照這種觀點(diǎn), PersonalJava設(shè)備就是一般用途的消費(fèi)設(shè)備; 它們的能力可以被擴(kuò)展。
相比之下, EmbeddedJava設(shè)備則慘了點(diǎn)。 它們執(zhí)行的功能都非常具體的,基本沒(méi)有必要提供下載新的代碼到 EmbeddedJava設(shè)備的能力。 Hence, PersonalJava設(shè)備使用可擴(kuò)展 Java應(yīng)用程序接口; 而EmbeddedJava設(shè)備則沒(méi)有,因?yàn)闆](méi)有必要使用。
PersonalJava可以以兩種形式得到: 由原碼形式的,提供給那些對(duì)把PersonalJava移植到其他設(shè)備感興趣的開(kāi)發(fā)者,那些已經(jīng)把 PersonalJava移植到某個(gè)具體的操作系統(tǒng)和處理機(jī)的組織提供二進(jìn)制形式的 PersonalJava環(huán)境。有興趣探索 PersonalJava的開(kāi)發(fā)者如果沒(méi)有二進(jìn)制平臺(tái)也可以使用 PersonalJava模擬環(huán)境 ( PJEE )。 這個(gè)模擬器運(yùn)行于 Solaris/SPARC或 Windows,并且在許多配置中可用。 這些多種多樣的配置基于“ look and feel”和類(lèi)庫(kù)支持 (環(huán)境是否提供 PersonalJava規(guī)范中規(guī)定的最低限度的或最大的類(lèi)庫(kù))。PJEE包括類(lèi)文件,一個(gè)應(yīng)用程序 launcher和一個(gè) appletviewer (兩者都是為了調(diào)試功能并使其最優(yōu)化)和其它的附帶的文件 (例如字體敘述文件)。
J2ME家族的另一位成員 JavaCheck實(shí)用程序,提供了 PersonalJava的補(bǔ)充支持。 你把應(yīng)用程序傳過(guò) JavaCheck,它將告訴你你的應(yīng)用程序在一個(gè) PersonalJava環(huán)境中能否順利地執(zhí)行。 JavaCheck檢查類(lèi)之間的依賴關(guān)系,如果應(yīng)用程序調(diào)用了一個(gè)在 PersonalJava不可用的應(yīng)用程序接口,它就會(huì)給出一個(gè)警報(bào)信號(hào)。 (據(jù)我所知,目前有兩種JavaCheck的版本可用,一個(gè)是用于檢驗(yàn) PersonalJava 1.0版應(yīng)用程序,另一個(gè)用于檢驗(yàn) 1.1.x版程序。 當(dāng)前的 PersonalJava應(yīng)用程序接口規(guī)范是 1.2,用于這一版本的 JavaCheck還沒(méi)有。 讀者請(qǐng)去Sun相關(guān)網(wǎng)站去看看( http : file://java.sun.com/products/personaljava)。
2、KVM
前面我也說(shuō)過(guò),KVM是用于 J2ME平臺(tái)最小的虛擬機(jī),并且是用于CLDC配置的虛擬機(jī)。可是J2ME應(yīng)用程序并不一定非要使用 KVM,J2ME技術(shù)可以使用任何虛擬機(jī),不過(guò)至少應(yīng)當(dāng)有 KVM這樣的功能。
為了滿足基于KVM的設(shè)備一般只有狹小的內(nèi)存空間和有限的處理能力的事實(shí), KVM使用 C編寫(xiě) (它不是現(xiàn)有的VM改進(jìn)了的以后的產(chǎn)品)。 此外, KVM是模塊化的, 也就是說(shuō),它是由模塊構(gòu)建的,當(dāng)某個(gè)模塊實(shí)現(xiàn)了預(yù)先設(shè)定的目標(biāo)后,就可以很容易地把這一模塊卸載。 可選的某塊包括: 大的數(shù)據(jù)類(lèi)型 ( long、 float和 double ),多維數(shù)組、類(lèi)文件驗(yàn)證等。
KVM的本地界面以輕便性為原則構(gòu)建,所以在KVM中任務(wù)切換不依賴硬件產(chǎn)生的記時(shí)器中斷,因此在這種意思上來(lái)說(shuō)不是搶先式。任務(wù)切換發(fā)生在虛擬機(jī)執(zhí)行了一個(gè)預(yù)設(shè)編號(hào)的字節(jié)碼之后。 并且, KVM的無(wú)用單元收集利用一個(gè)標(biāo)記清掃(mark and sweep)算法來(lái)實(shí)現(xiàn)無(wú)用單元釋放。 因此,對(duì)象引用是直接的,就像標(biāo)準(zhǔn) Java一樣。
當(dāng)然,除了虛擬機(jī)以外還有許多可用的執(zhí)行環(huán)境,在小型設(shè)備中,虛擬機(jī)必須要么被擴(kuò)展,要么在附加工具協(xié)助下提供一個(gè)更加完整的運(yùn)行期環(huán)境,正是這個(gè)原因, KVM需要附帶的工具,比如說(shuō), JavaCodeCompact工具提供了預(yù)鏈接和預(yù)加載類(lèi), 允許Java類(lèi)被直接地鏈接進(jìn)虛擬機(jī)中。((設(shè)備上所有的應(yīng)用程序使用的類(lèi) can直接地嵌入虛擬機(jī)。)
KVM一個(gè)可選的附件就是 Java Application Manager ( Java應(yīng)用程序管理器,簡(jiǎn)稱(chēng) JAM )。JAM的工作就是處理下載、安裝、執(zhí)行和卸載 CLDC設(shè)備上的應(yīng)用程序的細(xì)節(jié)問(wèn)題,因?yàn)橘Y源有限,在CLDC設(shè)備上有可能不存在這些功能。JAM也處理更新安裝應(yīng)用程序的操作。(如果更新過(guò)程失敗,它甚至可以重新使用舊的應(yīng)用程序。 )
3、Java Embedded Server(Java嵌入服務(wù)器)
Java Embedded Server( Java嵌入服務(wù)器,簡(jiǎn)稱(chēng) JES),在 PersonalJava基礎(chǔ)上建立,是一個(gè)用于嵌入式網(wǎng)絡(luò)設(shè)備的運(yùn)行期環(huán)境。為了理解 JES,你必須理解兩個(gè)核心概念:服務(wù)和服務(wù)空間結(jié)構(gòu)。后者是前者的容器。服務(wù)程序是運(yùn)行于一個(gè) JES服務(wù)器上的組件化程序;服務(wù)空間結(jié)構(gòu)是為服務(wù)程序提供生命周期 支持的環(huán)境。
技術(shù)上說(shuō),服務(wù)程序是界面的實(shí)現(xiàn),事實(shí)上,它是一個(gè)實(shí)現(xiàn)特定活動(dòng)的Java類(lèi)集合。比如說(shuō),假如把 JES配置為一個(gè)家庭的氣候控制系統(tǒng)的服務(wù)器,可以把從模數(shù)轉(zhuǎn)換器讀到的溫度數(shù)據(jù)放進(jìn)一個(gè)數(shù)據(jù)組件程序中。我就可以稱(chēng)這個(gè)組件為ReadThermostats服務(wù)程序。
在 JES的領(lǐng)域,服務(wù)的封裝媒介稱(chēng)為 bundle。簡(jiǎn)單地說(shuō),bundle就是一個(gè)帶有特殊內(nèi)容的JAR文件。服務(wù)程序和bundle之間有一對(duì)一關(guān)系,一個(gè)bundle帶有一個(gè)服務(wù)程序。服務(wù)程序和 bundle之間有一對(duì)一關(guān)系,一個(gè) bundle帶有一個(gè)服務(wù)程序。可這也不一定,一個(gè) bundle可以設(shè)置多個(gè)服務(wù)程序索引 (注意, JES提供的所有的核心服務(wù),每個(gè) bundle中只有一個(gè) )。
正如前面提到的那樣,服務(wù)空間的一項(xiàng)工作就是管理服務(wù)程序的生命周期,這個(gè)工作的很大的部分包括解決服務(wù)隸屬關(guān)系。bundle內(nèi)容的一個(gè)重要的部分是bundle服務(wù)的依賴信息。所以,當(dāng)服務(wù)空間打開(kāi)一個(gè)bundle安裝它的服務(wù)時(shí),服務(wù)空間就可以確定外部需要什么服務(wù)。而且,一個(gè)服務(wù)的依賴關(guān)系并不是靜止不變的,它們可以隨某些事件改變。比如說(shuō)當(dāng)服務(wù)程序更新時(shí)的變化就是一個(gè)很好的例子。一個(gè)服務(wù)的新的版本可以添加或去除依賴關(guān)系。服務(wù)空間跟蹤并解決這樣的動(dòng)態(tài)依賴關(guān)系。如果服務(wù)空間處理所有服務(wù)程序的生命周期,這就暗示了服務(wù)空間被賦予知曉一切的能力,那就是說(shuō),它能夠推論結(jié)構(gòu)、依賴、安裝的細(xì)微差別等所有它負(fù)責(zé)的服務(wù)。服務(wù)空間通過(guò)在 bundle內(nèi)伴隨服務(wù)的 Java代碼模塊處理一些任務(wù),這些模塊被稱(chēng)作 wizard(向?qū)В。JES向?qū)歉鶕?jù)它們完成的任務(wù)命名的:
Dependencies -向?qū)Ц嬖V調(diào)用者一個(gè)bundle依賴關(guān)系是什么。
Installer-向?qū)幚韇undle中服務(wù)的安裝和刪除操作。
Activator -向?qū)е廊绾螁?dòng)和終止服務(wù)。
Updater -向?qū)Э丶耣undle中的服務(wù)。(更新向?qū)Р粌H知道更新一個(gè)服務(wù),而且知道在何時(shí)和什么情況下更新服務(wù)。 )
About -這個(gè)向?qū)В拖袼Q(chēng)意味的那樣,返回關(guān)于 bundle內(nèi)容的信息。
Dispatcher -這是一種元向?qū)В╩eta-wizard)。服務(wù)空間調(diào)用dispatcher向?qū)Фㄎ灰粋(gè)bundle的其他向?qū)А?
當(dāng)一個(gè) JES服務(wù)器啟動(dòng)的時(shí)候,服務(wù)空間并不是完全沒(méi)有啟動(dòng)服務(wù)。JES定義一組核心服務(wù)(可選),這些都是任何 JES服務(wù)器的組成部分。這些核心服務(wù)包含:
HTTP服務(wù)
日志 -記錄錯(cuò)誤和事件日志
日期 -精確到秒的日期/時(shí)間服務(wù)
連接管理器 -提供網(wǎng)絡(luò)服務(wù)和Socket綁定,也處理連接接收。
線程管理器 -管理服務(wù)器提供的線程。thread管理器支持線程池并允許有效使用線程上界的規(guī)范。
計(jì)劃程序 -提供未來(lái)的事件計(jì)劃安排 (可用于告訴服務(wù)器某某動(dòng)作必須在某某事件發(fā)生 )
RMI
SNMP
控制臺(tái) -提供遠(yuǎn)程管理服務(wù)器功能
基于 HTTP的遠(yuǎn)程應(yīng)用程序接口實(shí)現(xiàn)
基于 RMI的遠(yuǎn)程應(yīng)用程序接口實(shí)現(xiàn)
如果你把服務(wù)空間結(jié)構(gòu)當(dāng)成 JavaBean中的容器的話, JES就變得容易理解了。在這種類(lèi)比關(guān)系中,服務(wù)程序就相當(dāng) JavaBean。那么,正象組件容器提供一個(gè)環(huán)境供 JavaBeans實(shí)例化、運(yùn)行一樣,服務(wù)空間就是以實(shí)例化的服務(wù)的聚集地。服務(wù)空間管理安裝、實(shí)例化、執(zhí)行、終止以及卸載服務(wù);它也提供應(yīng)用程序接口供服務(wù)交互作用。