專利名稱:對rom中存儲的資源文件的訪問的制作方法
技術領域:
本發(fā)明涉及在諸如嵌入式設備等存儲器資源受約束的環(huán)境中對諸如圖象、位圖和聲音文件之類的資源的存儲。本發(fā)明提供一種在這種資源存儲在只讀存儲器(ROM)的情況下在運行期間訪問資源的方法。
嵌入式設備諸如蜂窩式電話、尋呼機和PDA(個人數字助理)一般包括復雜的用戶界面、聽覺信號和其它功能部件,以執(zhí)行為這些設備所設計的消費者功能。
必備資源的通常形式是預先構建的數據文件,內含位圖、字型或聲音記錄。程序訪問一個或多個資源文件中的數據,以便在設備的顯示器上描繪用戶界面或者從設備的音頻系統(tǒng)發(fā)出聲音。
問題是如何存儲諸如圖象、位圖和聲音文件等之類的資源以及從諸如JAVA應用程序等運行程序中訪問它們。在桌面計算機中,簡單的方法是使用快速文件系統(tǒng),像正常文件一樣對待這些資源的,在被運行程序訪問時被拷貝到隨機存取存儲器(RAM)。
然而,這種方法不適合嵌入式系統(tǒng)。原因有兩個第一,復雜的位象可能非常大—有時長達數萬字節(jié)。如果將這些圖象拷貝到RAM供在顯示器上描繪,會大大地增加對內存的耗費。嵌入式設備一般只有1到14MB的內存,所以,如果為訪問資源、特別是再現大型位象而增加RAM的使用,會影響能在設備上存儲和運行的應用程序的數量和復雜程度。
第二,許多嵌入式系統(tǒng)只有一個薄薄的實時操作系統(tǒng)(RTOS),或者根本沒有。經常不含有文件系統(tǒng)。
因此,本發(fā)明的一個目的是提供一種方法,按照這個方法,資源數據不用文件系統(tǒng)就能在ROM中存儲,并且能在ROM存儲器中從運行程序訪問。
本發(fā)明的另一個目的是提供可移植性,使得在諸如桌面機操作系統(tǒng)等內存受較少約束的環(huán)境中使用的應用程序,不改變應用程序代碼就能在嵌入式平臺上使用。
按照這些和其它目的,本發(fā)明提供一種系統(tǒng)來處理直接來自只讀存儲器中某位置的資源數據,系統(tǒng)包括至少一個邏輯表,邏輯表中含有用于程序調用資源的鍵字,并將該鍵字與標識資源數據在只讀存儲器中位置的值關聯(lián)。系統(tǒng)還包括一個將對資源數據的調用重定向到至少一個邏輯表的機構。最好該值是一個指向資源數據在只讀存儲器中位置的指針,并且鍵字是一個字符串。
本發(fā)明也提供一種對直接來自只讀存儲器中某位置的資源數據進行處理的方法。在系統(tǒng)啟動時,生成一個鍵字-值對的數組,其中,對中的鍵字與某個命名的資源關聯(lián),對中的對應值是用于訪問只讀存儲器中位置上的資源數據的信息。在該系統(tǒng)中的程序啟動時,接合一個全程開關(global switch),它將程序對資源的調用定向到該數組。
現在將結合以下各附圖詳細說明本發(fā)明的實施例,其中
圖1是表示按照現有技術,描繪快速文件系統(tǒng)中存儲的資源數據的示意圖;圖2是表示按照本發(fā)明,描述用于訪問ROM中存儲的資源文件的鍵字-值對的數組或表的示意圖。
圖3是表示按照本發(fā)明,訪問ROM中存儲的資源數據的步驟的流程圖。
Java是一種面向對象的解釋程序設計語言。Java應用通常是從磁盤上的許多類文件和與這些類文件有關的目錄中的許多位圖中展開的。按照常規(guī)技術,可以建立一個占據全部類和資源目錄樹的JAR文件。從概念上來說這些方法是相同的-JAR文件不過是所有所需文件的一個容器。
參看圖1,一個想顯示位圖或使用字型的Java應用2,一般要引用一個或多個在ROM 6中的文件中存儲的位圖(例如foo.bmp)。圖中將位圖統(tǒng)一標記為4。
資源的數據由Java應用2從ROM 6讀入RAM 8中的Java字節(jié)數組,將其轉換成Java對象10。Java對象10被傳送給Java類12去顯示。經常,資源數據根本就不被Java類12使用,而是經系統(tǒng)的Java本機接口(JNI-Java Native Interface)的本機過程(Nativemethod)14被直接傳送到C代碼16,適當地描繪出來18。即使它僅僅是一個對被傳送到Java類12的Java對象10的引用,也要在本機過程14上復制Java對象的副本。然而,本機過程14也不使用這個Java對象10的副本。它請求一個指向字節(jié)數組的C指針來發(fā)現如何在顯示屏上寫象素。
如果是這樣,則完全不必在RAM存儲器中復制數據(Java字節(jié)數組)的副本。本發(fā)明不需要在RAM中以Java對象的形式來創(chuàng)建資源數據的字節(jié)數組并到處復制該數據。
本發(fā)明認識到,這種類型的資源數據在許多類型的嵌入式系統(tǒng)上使用時不變化。所以,它是能在ROM中存儲并能在運行時安全地直接從ROM存取的一種數據類型。
參看圖2,在本發(fā)明中,每個資源文件都與一個值24關聯(lián),該值代表資源數據,但實際上并不再生資源數據。在本發(fā)明最佳實施例中,這個值24是一個操作系統(tǒng)的內存指針(例如OX0A000),它尋址ROM存儲器中的實際資源數據(例如位圖等等)。每個指針都與一個鍵字22關聯(lián)。該鍵字22由程序員選定,一般是個描述該資源數據的人類可讀的字符串。
許多鍵字-值對被收集到數組或邏輯表20中。在最佳實施例中,這種數組或邏輯表被稱為ROM資源束(RRB-ROM Resource Bundle),下文將作詳細說明。對于某個應用來說,RRB的大小和數量取決于程序員對該應用劃分的方式。然而,在某個應用中使用的所有在ROM資源束中標識了的資源,都被包含它們的RRB及它們的鍵字唯一地標識。
例如,圖2表示用于非常簡單的用戶界面中普通的控制的RRB。字符串“ON”和“OFF”分別與代表指向設備顯示器的開、關按鈕的含有位圖或GIFF的數據文件相關聯(lián)。類似地,“LEFT”和“RIGHT”是指向用于顯示左和右滾動箭頭的位圖數據的指針的鍵字。
RRB被從常規(guī)應用訪問的方法是在應用被啟動加入一個全程開關。響應應用中的資源調用,該開關通過在RAM中創(chuàng)建一個對象,來決定是將數據從ROM存儲器讀出還是動態(tài)地讀取數據。這在圖3的流程圖中表示。
在具有全程開關的環(huán)境中啟動的應用(框30)將處理資源請求(框32),首先在RRB中查找該請求對應的資源鍵字(框34)。RRB中的鍵字提供指向ROM存儲器中數據的指針(框36),該指針被傳送(復制)給本機過程(框38),以便在硬件上描繪該數據(例如位圖)(框48)。
如果該應用的資源請求的鍵字不在RRB中(框34),應用就試圖以以上討論的傳統(tǒng)方式動態(tài)地提供資源,方法是將數據字節(jié)讀入字節(jié)數組(框44),將該Java字節(jié)數組復制到本機過程(框46),供在硬件上描繪(框48)。如果ROM中不存在該程序調用的對應的資源數據,就向應用返回一個出錯信息(框40、42)。
由應用請求的所有資源都這樣被反復處理(框50),直到應用的處理完成或結束(框52)。
已經在Java程序設計環(huán)境中實現了本發(fā)明的一個最佳實施例。在Java類層次結構中,有一個叫ResourceBundle的類,它是一種通過隔離數據的邏輯描述與其物理位置來存儲相關位圖的邏輯方法。在常規(guī)的Java系統(tǒng)中,資源束是一種數組或表,其中的字符串與實際數據/文件相關聯(lián)。所以,從圖2的例子中,字符串“ON”在資源束中應當與稱為“on.gif”的圖象文件關聯(lián)。
在本發(fā)明中,RomResourceBundle是ResourceBundle類的一個抽象子類。用戶用RomResourceBundle的一個實例來訪問ROM中存儲的資源。一個RomResourceBundle可能含有多個資源。每個資源都有一個字符串形式的與其關聯(lián)的鍵字。與鍵字關聯(lián)的值是類OSBytes的一個實例。
OSBytes類模擬操作系統(tǒng)指針。實例包含指針值(長整數)和長度。這個類的實例能通過傳遞指針值來向JNI調用傳遞C指針。
要提供具有鍵字和關聯(lián)OSBytes對象的RomResourceBundle,就要不考慮getContents()過程。這個過程返回多個數組的一個數組。內部數組的長度是2,其第一項是鍵字(串),第二項是RomResourceSpec的一個實例。
RomResourceBundleManager類提供一些用于RomResourceBundle的公共或專用的通用靜態(tài)過程。
RomResourceSpec的實例用來確定在RomResourceBundle中與某鍵字關聯(lián)的數據。實例的創(chuàng)建是通過向這個類的構造器傳遞一個Java類和一個URL。一旦創(chuàng)建,就可以通過以下的代碼片斷來獲得該資源的數據。
ResClass.geResourceAsStream(resURL);
這個調用返回InputStream,它允許資源數據被讀取。這個類提供過程來讀取所有資源數據并將其作為Java字節(jié)數組返回。
RomResourceBundle在最佳實施例中的操作,可由以下情形得到闡釋。
類EGMasksBundle被IBM嵌入式樣本(IBM Embedded Samples)包含。這個類是RomResourceBundle類的子類。它含有一個過程,過程體是<pre listing-type="program-listing"><![CDATA[/** *以鍵字或值回答內容 * *<p> *IBM公司版權所有1998 * */ public java.lang.Object[][]getContent(){ String dirSeparator=“/”; return new Object[][]{ { “black”, new RomResourceSpec( getClass(), “Masks”+dirSeparator+“black.efrm”)}, { “dark gray”, new RomResourceSpec( getClass(), “Masks”+dirSeparator+“darkgray.efrm”)}, { “gray”, new RomResourceSpec( getClass(), “Masks”+dirSeparator+“gray.efrm”)}, { “l(fā)ight gray”, new RomResourceSpec( getClass(),“Masks”+dirSeparator+“l(fā)ightgray.efrm”)}, {“very light gray”, new RomResourceSpec( getClass(), “Masks”+dirSeparator+“verylightgray.efrm”)}, { “white”, new RomResourceSpec( getClass(), “Masks”+dirSeparator+“white.efrm”)}, }]]></pre>這個RomResourceBundle描述了6個鍵字-值對。例如鍵字“black”與EGMaskBundle類關聯(lián)的資源(如getClass()調用所表示的)以及URL black.efrm相關聯(lián)。
這個URL是通過典型的資源解決方案來解決的。由于該類的全名是com.ibm.ive.egfx.EGMasksBundle,所以,預期含有數據的實際文件名是com/ibm/I’ve.egfx/Masks/black.efrm,它位于Java類加載器從其讀取EGMasksBundle的同一個類路徑中。
以下的調用集導致返回一個指向包含在前一次命名的文件中的數據的OSBytes實例。
RomResourceBundle rrBundle;OSBytes value;rrBundle=new EGMasksBundle();value=rrBundle.getOSBytes(“black”);要向JNI過程傳遞指向該數據的指針,指針的值被去引用someJniMethod(value.getPointer());有兩種不同的方法在運行時獲得ROM資源束中的數據。第一種方法通常在開發(fā)期間使用,即通過以上描述的過程從文件系統(tǒng)(或網絡)檢索數據。第二種方法通常在生產應用中使用,即創(chuàng)建一個RRB文件,在程序運行之前,文件中將含有RRB中的所有鍵字和數據。盡管這個文件是在RAM中創(chuàng)建的,它能被裝入例如嵌入式設備的ROM存儲器。當應用啟動時,指向RRB文件裝入存儲器中的位置的指針被傳遞到RomResourceBundleMaganer類中的過程。這個類將讀取RRB的內容并創(chuàng)建RomResourceBundle類的一個實例。當RRB被應用代碼請求時,這個副本將被返回,它現在提供一個指向在ROM中留下的數據的指針。
用這個技術開發(fā)的應用,能移植到無論使用基于文件還是基于ROM存取方法的環(huán)境。如上所述,作出決定的時間是在應用啟動時,而不是數據被訪問時。
盡管本發(fā)明的最佳實施例是在特定的平臺內結合特定的類層次結構說明的,應當明白,對于本領域的熟練人員顯而易見的對本發(fā)明的改進都應視為包含在后附的權利要求的范圍內。
權利要求
1.一種用于處理直接來自只讀存儲器中某位置的資源數據的系統(tǒng),包含至少一個邏輯表,邏輯表含有用于程序對資源的調用的鍵字,并將該鍵字與一個標識資源數據在只讀存儲器中位置的值相關聯(lián);一種用于將對資源數據的調用重定向到至少一個邏輯表的機構。
2.按照權利要求1的系統(tǒng),其中的值是一個指向資源數據在只讀存儲器中位置的指針。
3.按照權利要求1或2的系統(tǒng),其中的鍵字是個字符串。
4.在計算機系統(tǒng)中,一種處理直接來自只讀存儲器中某位置的資源數據的方法,包含在系統(tǒng)啟動時,生成一個鍵字-值對的數組,其中,對中的鍵字與某個命名的資源關聯(lián),而對中的鍵字的對應值是用于訪問只讀存儲器中該位置上的資源數據的信息;在該系統(tǒng)中的程序啟動時,接合一個全程開關,將程序對資源的調用定向到所述數組。
5.按照權利要求4的方法,進一步包含以下步驟定位對應于在程序中指名的資源的值;將該值傳遞到處理該資源數據的過程;以及處理來自只讀存儲器中該位置的資源數據。
6.在一個面向對象的解釋程序設計環(huán)境中,該環(huán)境具有的管理器類具有一個適應于向隨機存取存儲器(RAM)返回只讀存儲器(ROM)中存儲的永久數據的get_Contents過程,一種處理直接來自只讀存儲器中某位置的資源數據的方法,包含不考慮(overriding)get_Contents過程;向RAM返回多個數組的一個數組,每個內部數組長度為兩項,第一項是一個鍵字,第二項是對ROM中存儲的資源數據的說明的一個實例;將各內部數組存儲在RAM中的某個存儲位置;以及將各內部數組的存儲位置的指針傳遞給應用管理器中的過程。
7.一種計算機可讀的用于存儲在計算機中執(zhí)行權利要求4到6中任一種方法中使用的指令的存儲器。
8.一種計算機程序產品,包含一個計算機可用的介質,介質上有實現在其中的計算機可讀的程序代碼裝置,其內容用于使計算機處理直接來自只讀存儲器中位置的資源數據,所述計算機程序產品中的計算機可讀程序代碼裝置包含用于使計算機在計算機內的系統(tǒng)啟動時生成鍵字-值對數組的計算機可讀程序產品代碼裝置,其中,對中的鍵字與某個命名的資源關聯(lián),對中的鍵字的對應值是用于訪問只讀存儲器中位置上的資源數據的信息;用于使計算機在計算機內的所述系統(tǒng)啟動時采用一個全程開關將程序對資源的調用定向到所述數組的計算機可讀的程序代碼裝置。
全文摘要
提供一種存取諸如位圖、字型和聲音文件的資源的系統(tǒng)。數據以Java對象中的字節(jié)數組被讀入動態(tài)(RAM)存儲器,至少要復制字節(jié)數組的另一個副本,才能處理資源數據。本發(fā)明提供一種直接從ROM訪問資源數據而不在RAM中復制中間副本的機制。每個資源可在邏輯表中有獨有的鍵字或字符串。與鍵字關聯(lián)的值是指向ROM中存儲的數據的指針。指針被直接傳遞到負責在硬件上處理數據的過程,無需使數據變成臨時的Java對象。
文檔編號G06F9/445GK1271125SQ0010475
公開日2000年10月25日 申請日期2000年3月24日 優(yōu)先權日1999年3月30日
發(fā)明者C·R·馬利奧德, P·J·米勒, P·C·魯貝辛 申請人:國際商業(yè)機器公司