齊慧平
(臨汾職業(yè)技術(shù)學(xué)院, 山西 臨汾041000)
嵌入式系統(tǒng)中Java AWT的實(shí)現(xiàn)
齊慧平
(臨汾職業(yè)技術(shù)學(xué)院, 山西 臨汾041000)
隨著信息技術(shù)的飛速發(fā)展,21世紀(jì)成為了信息時(shí)代.各種數(shù)字化產(chǎn)品不斷涌現(xiàn),成為了當(dāng)前信息處理的主要工具。微處理器作為數(shù)字化產(chǎn)品的核心,在手機(jī)、個(gè)人電腦、電視機(jī)等等產(chǎn)品中有著廣泛的應(yīng)用,使得大部分產(chǎn)品都可以與網(wǎng)絡(luò)相連接.通過(guò)網(wǎng)絡(luò)連接起來(lái)的設(shè)備之間的硬件體系和操作系統(tǒng)是不相同的,Java可以通過(guò)創(chuàng)建與平臺(tái)無(wú)關(guān)的程序來(lái)解決設(shè)備之間軟硬件體系的不兼容問(wèn)題.Java的這種功能主要是由Java虛擬機(jī)實(shí)現(xiàn)的.本文將詳細(xì)剖析Java虛擬機(jī)內(nèi)部實(shí)現(xiàn)機(jī)制,并著重分析如何在嵌入式系統(tǒng)中實(shí)現(xiàn)Java AWT技術(shù).
嵌入式;Java虛擬機(jī);Java AWT技術(shù)
Java虛擬機(jī)作為Java體系結(jié)構(gòu)的核心部分,是一種抽象意義上的計(jì)算機(jī),這是因?yàn)镴ava虛擬機(jī)所必須實(shí)現(xiàn)的每一特點(diǎn)都是由Java虛擬機(jī)規(guī)范所定義的.Java虛擬機(jī)在體系中的主要任務(wù)在于裝載class文件,并且執(zhí)行其中的字節(jié)碼.Java通過(guò)本地連接的方法能夠與底層操作系統(tǒng)和函數(shù)庫(kù)進(jìn)行交互,同時(shí)還能為上層的Java應(yīng)用程序提供符合規(guī)定的應(yīng)用程序接口.
Java虛擬機(jī)為Java應(yīng)用程序提供了需要的基礎(chǔ)類(lèi)庫(kù)和抽象圖形工具包,二者結(jié)合形成了Java API的集合.Java虛擬機(jī)的內(nèi)部封裝了與平臺(tái)有關(guān)的操作,而Java的應(yīng)用程序不直接操作底層的函數(shù)庫(kù),因此Java程序與平臺(tái)無(wú)關(guān).
要想在嵌入式系統(tǒng)中實(shí)現(xiàn)Java ATW,需要逐步實(shí)現(xiàn)以下幾個(gè)步驟:
2.1 Java虛擬機(jī)欲運(yùn)行的軟件和硬件平臺(tái)
要想在嵌入式系統(tǒng)中實(shí)現(xiàn)Java虛擬機(jī),需要全面考慮以下幾個(gè)方面的影響.首先是Java虛擬機(jī)運(yùn)行平臺(tái)的CPU類(lèi)型和操作系統(tǒng)以及運(yùn)行時(shí)所占用的資源,比如Java虛擬機(jī)運(yùn)行時(shí)內(nèi)存的使用情況、Java類(lèi)庫(kù)的大小以及可執(zhí)行映像的大小等等.其次要考慮到Java虛擬機(jī)是否提供API圖形,如果提供的話(huà),虛擬機(jī)又需要用什么圖形庫(kù)來(lái)支持.最后,要考慮到Java虛擬機(jī)所提供的應(yīng)用程序接口與Java規(guī)范是否相符,如果相符,又該如何選擇規(guī)范標(biāo)準(zhǔn).除了這些因素之外,還應(yīng)考慮Java虛擬機(jī)運(yùn)行平臺(tái)提出的要求,下面以Wonka運(yùn)行目標(biāo)平臺(tái)為例,講述Java虛擬機(jī)運(yùn)行的軟件和硬件平臺(tái).
2.1.1 Java虛擬機(jī)運(yùn)行的軟件平臺(tái)
由于Java虛擬機(jī)是直接與底層的操作系統(tǒng)和函數(shù)庫(kù)打交道,因此Java虛擬機(jī)的軟件平臺(tái)就是由操作系統(tǒng)和函數(shù)庫(kù)構(gòu)成.除此之外,Java虛擬機(jī)運(yùn)行的嵌入式系統(tǒng)的軟件平臺(tái)還應(yīng)該具有以下特征:首先操作系統(tǒng)的源代碼具有開(kāi)放性,從而使虛擬機(jī)能夠充分操作系統(tǒng)中的各種功能.其次目標(biāo)平臺(tái)上需要提供專(zhuān)門(mén)面向嵌入式系統(tǒng)的圖形庫(kù),從而使得AWT的實(shí)現(xiàn)更加便利,比如QT/Embedded.最后可以通過(guò)設(shè)備文件來(lái)訪(fǎng)問(wèn)設(shè)備驅(qū)動(dòng)程序,從而使得AWT可以直接通過(guò)操作FrameBuffer來(lái)實(shí)現(xiàn).
2.1.2 Java虛擬機(jī)運(yùn)行的硬件平臺(tái)
為了使Java虛擬機(jī)的功能變得更加強(qiáng)大,需要一個(gè)強(qiáng)大的硬件平臺(tái)來(lái)支撐.Java虛擬機(jī)運(yùn)行的硬件平臺(tái)應(yīng)該包括以下幾點(diǎn)重要特征:
①內(nèi)存64M;②32M快閃存儲(chǔ)器;③能夠通過(guò)網(wǎng)卡和網(wǎng)絡(luò)連接;④CPU選用PXA250芯片,從而能夠與ARM架構(gòu)V5TE兼容,頻率可達(dá)到200-400HZ.這些特點(diǎn)決定了Java虛擬機(jī)的功能的豐富性,比一般嵌入式系統(tǒng)要優(yōu)越得多.
2.2 Java虛擬機(jī)的選擇
實(shí)現(xiàn)AWT的基礎(chǔ)是選擇一個(gè)合適的Java虛擬機(jī),因此必須要慎重考慮.綜合考慮各方面的因素,我們可以選擇一種叫作Wonka面向嵌入式系統(tǒng)的Java虛擬機(jī).由于Wonka的源碼是公開(kāi)的,因此符合嵌入式系統(tǒng)的需求.選擇Wonka,是因?yàn)槠渚哂幸韵碌膬?yōu)點(diǎn):
①Wonka設(shè)計(jì)的最初目的就是面向嵌入式系統(tǒng)的. Wonka是起源于歐洲,其代碼不僅能夠支持Linux操作系統(tǒng),還能支持ARM體系中的CPU.因此,可以根據(jù)目標(biāo)平臺(tái)的特點(diǎn),將Wonka移植到目標(biāo)平臺(tái)上.②Wonka是一種符合GPL精神的自由軟件,因此可以對(duì)其源代碼進(jìn)行開(kāi)發(fā)利用.③Wonka運(yùn)行時(shí)在嵌入式系統(tǒng)中所占用的內(nèi)存大小不大,一般在1-2M之間,滿(mǎn)足了嵌入式系統(tǒng)的需求.④Wonka系統(tǒng)是一個(gè)能夠與Java2兼容的Java虛擬機(jī),這樣不僅可以提供AWT圖形是,同時(shí)還能在AWT圖形庫(kù)的基礎(chǔ)上實(shí)現(xiàn)SWING圖形庫(kù).當(dāng)前網(wǎng)絡(luò)上的大部分Java資源與Java2能夠兼容.⑤Wonka的可移植性非常強(qiáng),能夠支持不同類(lèi)型的CPU體系結(jié)構(gòu),比如X86和ARM,同時(shí)能夠支持Linux系統(tǒng).
由于當(dāng)前關(guān)于Wonka軟件使用性能評(píng)估的資料很少,因此支持Wonka的用戶(hù)不多,比知名的KAFFEJava虛擬機(jī)要少很多,其應(yīng)用還沒(méi)有得到廣泛的推廣.但是由于有學(xué)者在掌上電腦中成功實(shí)現(xiàn)了Wonka,因此有一部分人正在嘗試在嵌入式系統(tǒng)中使用Wonka.
2.3 Wonka Java虛擬機(jī)的內(nèi)部執(zhí)行流程
Wonka Java虛擬機(jī)的內(nèi)部執(zhí)行流程可以簡(jiǎn)單地用圖1來(lái)表示.
圖1 Wonka內(nèi)部執(zhí)行流程
Wonka所實(shí)現(xiàn)的主要功能如下:
2.3.1 Main函數(shù)
最初主線(xiàn)程Main函數(shù)主要實(shí)現(xiàn)了以下功能:第一,可以為Java虛擬機(jī)的運(yùn)行分配所需要的空間,空間的大小由用戶(hù)的要求決定,如果沒(méi)有要求,Wonka就會(huì)使用默認(rèn)值.第二,可以對(duì)CPU和Java虛擬機(jī)內(nèi)部的定時(shí)器中斷服務(wù)程序進(jìn)行初始化.Wonka內(nèi)部的線(xiàn)程可以切換,同時(shí)還提供了軟定時(shí)器.為了對(duì)軟定時(shí)器的時(shí)間進(jìn)行判斷,需要在定時(shí)器中斷服務(wù)程序中進(jìn)行線(xiàn)程的切換.如果軟定時(shí)器的時(shí)間到了,中斷服務(wù)程序就會(huì)向timer線(xiàn)程發(fā)送一條消息,timer線(xiàn)程就會(huì)對(duì)該程序進(jìn)行相應(yīng)的處理.第三,通過(guò)系統(tǒng)調(diào)用setitimer,就可以啟動(dòng)Wonka內(nèi)部的定時(shí)器.系統(tǒng)每隔一定的時(shí)間就會(huì)向當(dāng)前的進(jìn)程發(fā)送一個(gè)sigalrm信號(hào),如果將中斷服務(wù)程序注冊(cè)為該信號(hào)的信號(hào)處理程序,就可以每隔一段時(shí)間執(zhí)行一次中斷服務(wù)程序.
2.3.2 初始線(xiàn)程
Wonka內(nèi)部創(chuàng)建的第一個(gè)線(xiàn)程就是初始線(xiàn)程.首先,初始線(xiàn)程創(chuàng)建了timer線(xiàn)程將其置為就緒狀態(tài),timer線(xiàn)程能夠處理Java虛擬機(jī)內(nèi)部以及用戶(hù)創(chuàng)建的軟定時(shí)器.其次,初始線(xiàn)程啟動(dòng)了Java虛擬機(jī).
2.3.3 加載基本類(lèi)
Wonka執(zhí)行用戶(hù)的應(yīng)用程序的前提條件是加載基本類(lèi).這里的基本類(lèi)是指在所有應(yīng)用程序在運(yùn)行期間都會(huì)用到的類(lèi).Java.lang.Object是所有類(lèi)的祖先類(lèi),Java虛擬機(jī)會(huì)為每一個(gè)加載的類(lèi)創(chuàng)建一個(gè)Java.lang.Class實(shí)例,因此首先必須加載這兩個(gè)類(lèi).
2.3.4 加載AWT基本類(lèi)
加載AWT基本類(lèi)與加載基本類(lèi)相類(lèi)似,知識(shí)加載一些與AWT相關(guān)的基本類(lèi).AWT應(yīng)用程序的運(yùn)行需要有基本AWT類(lèi)來(lái)作為支持.在AWT應(yīng)用程序運(yùn)行之前,需要將所有事件類(lèi)的祖先java.awt.AWTEvent和所有圖形類(lèi)的祖先java.awt.Image加載到Java虛擬機(jī)中.
2.4 實(shí)現(xiàn)AWT技術(shù)的總體構(gòu)思
2.4.1 實(shí)現(xiàn)步驟
①實(shí)現(xiàn)Java虛擬機(jī)與底層圖形庫(kù)之間的接口.該接口能夠?qū)崿F(xiàn)兩種類(lèi)型數(shù)據(jù)的傳輸.首先Java虛擬機(jī)將所需要顯示的數(shù)據(jù)通過(guò)接口傳送底層圖形庫(kù),底層圖形庫(kù)接收到數(shù)據(jù)之后就會(huì)顯示出來(lái).其次底層圖形庫(kù)接收鍵盤(pán)以及觸摸筆事件之后,通過(guò)接口將這些數(shù)據(jù)反饋給Java虛擬機(jī),Java虛擬機(jī)根據(jù)接收的信息作出相應(yīng)的處理.
②構(gòu)建符合J2ME(Java 2 Micro Edition,Java 2的微型版本)規(guī)范的AWT類(lèi)庫(kù).小的消費(fèi)類(lèi)電子的內(nèi)存很小,用戶(hù)接口受到了限制.為了滿(mǎn)足小的消費(fèi)類(lèi)電子產(chǎn)品,J2ME應(yīng)運(yùn)而生.在J2ME規(guī)范中,將Java技術(shù)的實(shí)現(xiàn)分為了兩個(gè)部分,即配置層和框架層.框架層又可以細(xì)分為基礎(chǔ)框架層和特定框架層.嵌入式系統(tǒng)中AWT實(shí)現(xiàn)的規(guī)范在特定框架層給出.
2.4.2 事件查詢(xún)方案
當(dāng)Wonka檢測(cè)到當(dāng)前的運(yùn)行程序中需要使用AWT時(shí),就會(huì)創(chuàng)建一個(gè)新的線(xiàn)程.這個(gè)新的線(xiàn)程主要通過(guò)接收觸摸筆事件和按鍵事件來(lái)顯示圖形.為了執(zhí)行這個(gè)線(xiàn)程,需要專(zhuān)門(mén)編寫(xiě)一個(gè)Dispatcher.java文件,具體程序如下:
public void start(){ if(!keepOnGoing){
keepOnGoing=true;
thread=new Thread(this“Rudolph”); thread.setPriority(priority); thread.setDacmon(false); thread.star();
}
}
2.4.3 圖形圖像顯示方案
為了能夠顯示圖形圖像,需要編寫(xiě)一個(gè)Painter.java文件,并創(chuàng)建一個(gè)新的線(xiàn)程.
public void start(){ if(!keepOnGoing){
keepOnGoing=true;
thread=new Thread(this,“Display”); thread.setPriority(priority); thread.setDaemon(false); thread.start();
}
}
語(yǔ)句“thread=new Thread(this,“Display”)”創(chuàng)建圖形圖像顯示線(xiàn)程.在Java虛擬機(jī)內(nèi)部啟動(dòng)上面的兩個(gè)線(xiàn)程之后,還要利用底層提供的圖形接口實(shí)現(xiàn)mouse-poll、keyboard-poll和screen-update三個(gè)函數(shù),才能實(shí)現(xiàn)圖形圖像的顯示.
〔1〕鐘聲,趙容彩.JAVA語(yǔ)言中本地方法的設(shè)計(jì)與實(shí)現(xiàn)[J].信息工程大學(xué)學(xué)報(bào),2000,1(1).
〔2〕李亞?wèn)|,等.基于JNI的跨平臺(tái)軟件設(shè)計(jì)[J].計(jì)算機(jī)工程,2000,9(26).
〔3〕毛煒.面向領(lǐng)域的實(shí)時(shí)嵌入式中間技術(shù)研究[D].西北工業(yè)大學(xué)學(xué)位論文,2004.
〔4〕馬鐳.面向領(lǐng)域的實(shí)時(shí)嵌入式中間技術(shù)研究[D].西北工業(yè)大學(xué)學(xué)位論文,2004.
〔5〕楊燦群,等.Java語(yǔ)言環(huán)境事實(shí)技術(shù)探討[J].計(jì)算機(jī)工程與科學(xué),2001,2(23).
〔6〕高百明,等.Java ATW的結(jié)構(gòu)概覽與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,1999,4(25).
TP31
A
1673-260X(2014)07-0023-02
赤峰學(xué)院學(xué)報(bào)·自然科學(xué)版2014年13期