对rom中存储的资源文件的访问的制作方法

文档序号:6404968阅读:137来源:国知局
专利名称:对rom中存储的资源文件的访问的制作方法
技术领域
本发明涉及在诸如嵌入式设备等存储器资源受约束的环境中对诸如图象、位图和声音文件之类的资源的存储。本发明提供一种在这种资源存储在只读存储器(ROM)的情况下在运行期间访问资源的方法。
嵌入式设备诸如蜂窝式电话、寻呼机和PDA(个人数字助理)一般包括复杂的用户界面、听觉信号和其它功能部件,以执行为这些设备所设计的消费者功能。
必备资源的通常形式是预先构建的数据文件,内含位图、字型或声音记录。程序访问一个或多个资源文件中的数据,以便在设备的显示器上描绘用户界面或者从设备的音频系统发出声音。
问题是如何存储诸如图象、位图和声音文件等之类的资源以及从诸如JAVA应用程序等运行程序中访问它们。在桌面计算机中,简单的方法是使用快速文件系统,像正常文件一样对待这些资源的,在被运行程序访问时被拷贝到随机存取存储器(RAM)。
然而,这种方法不适合嵌入式系统。原因有两个第一,复杂的位象可能非常大—有时长达数万字节。如果将这些图象拷贝到RAM供在显示器上描绘,会大大地增加对内存的耗费。嵌入式设备一般只有1到14MB的内存,所以,如果为访问资源、特别是再现大型位象而增加RAM的使用,会影响能在设备上存储和运行的应用程序的数量和复杂程度。
第二,许多嵌入式系统只有一个薄薄的实时操作系统(RTOS),或者根本没有。经常不含有文件系统。
因此,本发明的一个目的是提供一种方法,按照这个方法,资源数据不用文件系统就能在ROM中存储,并且能在ROM存储器中从运行程序访问。
本发明的另一个目的是提供可移植性,使得在诸如桌面机操作系统等内存受较少约束的环境中使用的应用程序,不改变应用程序代码就能在嵌入式平台上使用。
按照这些和其它目的,本发明提供一种系统来处理直接来自只读存储器中某位置的资源数据,系统包括至少一个逻辑表,逻辑表中含有用于程序调用资源的键字,并将该键字与标识资源数据在只读存储器中位置的值关联。系统还包括一个将对资源数据的调用重定向到至少一个逻辑表的机构。最好该值是一个指向资源数据在只读存储器中位置的指针,并且键字是一个字符串。
本发明也提供一种对直接来自只读存储器中某位置的资源数据进行处理的方法。在系统启动时,生成一个键字-值对的数组,其中,对中的键字与某个命名的资源关联,对中的对应值是用于访问只读存储器中位置上的资源数据的信息。在该系统中的程序启动时,接合一个全程开关(global switch),它将程序对资源的调用定向到该数组。
现在将结合以下各附图详细说明本发明的实施例,其中

图1是表示按照现有技术,描绘快速文件系统中存储的资源数据的示意图;图2是表示按照本发明,描述用于访问ROM中存储的资源文件的键字-值对的数组或表的示意图。
图3是表示按照本发明,访问ROM中存储的资源数据的步骤的流程图。
Java是一种面向对象的解释程序设计语言。Java应用通常是从磁盘上的许多类文件和与这些类文件有关的目录中的许多位图中展开的。按照常规技术,可以建立一个占据全部类和资源目录树的JAR文件。从概念上来说这些方法是相同的-JAR文件不过是所有所需文件的一个容器。
参看图1,一个想显示位图或使用字型的Java应用2,一般要引用一个或多个在ROM 6中的文件中存储的位图(例如foo.bmp)。图中将位图统一标记为4。
资源的数据由Java应用2从ROM 6读入RAM 8中的Java字节数组,将其转换成Java对象10。Java对象10被传送给Java类12去显示。经常,资源数据根本就不被Java类12使用,而是经系统的Java本机接口(JNI-Java Native Interface)的本机过程(Nativemethod)14被直接传送到C代码16,适当地描绘出来18。即使它仅仅是一个对被传送到Java类12的Java对象10的引用,也要在本机过程14上复制Java对象的副本。然而,本机过程14也不使用这个Java对象10的副本。它请求一个指向字节数组的C指针来发现如何在显示屏上写象素。
如果是这样,则完全不必在RAM存储器中复制数据(Java字节数组)的副本。本发明不需要在RAM中以Java对象的形式来创建资源数据的字节数组并到处复制该数据。
本发明认识到,这种类型的资源数据在许多类型的嵌入式系统上使用时不变化。所以,它是能在ROM中存储并能在运行时安全地直接从ROM存取的一种数据类型。
参看图2,在本发明中,每个资源文件都与一个值24关联,该值代表资源数据,但实际上并不再生资源数据。在本发明最佳实施例中,这个值24是一个操作系统的内存指针(例如OX0A000),它寻址ROM存储器中的实际资源数据(例如位图等等)。每个指针都与一个键字22关联。该键字22由程序员选定,一般是个描述该资源数据的人类可读的字符串。
许多键字-值对被收集到数组或逻辑表20中。在最佳实施例中,这种数组或逻辑表被称为ROM资源束(RRB-ROM Resource Bundle),下文将作详细说明。对于某个应用来说,RRB的大小和数量取决于程序员对该应用划分的方式。然而,在某个应用中使用的所有在ROM资源束中标识了的资源,都被包含它们的RRB及它们的键字唯一地标识。
例如,图2表示用于非常简单的用户界面中普通的控制的RRB。字符串“ON”和“OFF”分别与代表指向设备显示器的开、关按钮的含有位图或GIFF的数据文件相关联。类似地,“LEFT”和“RIGHT”是指向用于显示左和右滚动箭头的位图数据的指针的键字。
RRB被从常规应用访问的方法是在应用被启动加入一个全程开关。响应应用中的资源调用,该开关通过在RAM中创建一个对象,来决定是将数据从ROM存储器读出还是动态地读取数据。这在图3的流程图中表示。
在具有全程开关的环境中启动的应用(框30)将处理资源请求(框32),首先在RRB中查找该请求对应的资源键字(框34)。RRB中的键字提供指向ROM存储器中数据的指针(框36),该指针被传送(复制)给本机过程(框38),以便在硬件上描绘该数据(例如位图)(框48)。
如果该应用的资源请求的键字不在RRB中(框34),应用就试图以以上讨论的传统方式动态地提供资源,方法是将数据字节读入字节数组(框44),将该Java字节数组复制到本机过程(框46),供在硬件上描绘(框48)。如果ROM中不存在该程序调用的对应的资源数据,就向应用返回一个出错信息(框40、42)。
由应用请求的所有资源都这样被反复处理(框50),直到应用的处理完成或结束(框52)。
已经在Java程序设计环境中实现了本发明的一个最佳实施例。在Java类层次结构中,有一个叫ResourceBundle的类,它是一种通过隔离数据的逻辑描述与其物理位置来存储相关位图的逻辑方法。在常规的Java系统中,资源束是一种数组或表,其中的字符串与实际数据/文件相关联。所以,从图2的例子中,字符串“ON”在资源束中应当与称为“on.gif”的图象文件关联。
在本发明中,RomResourceBundle是ResourceBundle类的一个抽象子类。用户用RomResourceBundle的一个实例来访问ROM中存储的资源。一个RomResourceBundle可能含有多个资源。每个资源都有一个字符串形式的与其关联的键字。与键字关联的值是类OSBytes的一个实例。
OSBytes类模拟操作系统指针。实例包含指针值(长整数)和长度。这个类的实例能通过传递指针值来向JNI调用传递C指针。
要提供具有键字和关联OSBytes对象的RomResourceBundle,就要不考虑getContents()过程。这个过程返回多个数组的一个数组。内部数组的长度是2,其第一项是键字(串),第二项是RomResourceSpec的一个实例。
RomResourceBundleManager类提供一些用于RomResourceBundle的公共或专用的通用静态过程。
RomResourceSpec的实例用来确定在RomResourceBundle中与某键字关联的数据。实例的创建是通过向这个类的构造器传递一个Java类和一个URL。一旦创建,就可以通过以下的代码片断来获得该资源的数据。
ResClass.geResourceAsStream(resURL);
这个调用返回InputStream,它允许资源数据被读取。这个类提供过程来读取所有资源数据并将其作为Java字节数组返回。
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”)},   { “light gray”,  new RomResourceSpec(   getClass(),“Masks”+dirSeparator+“lightgray.efrm”)},   {“very light gray”,   new RomResourceSpec(   getClass(),  “Masks”+dirSeparator+“verylightgray.efrm”)},   { “white”,  new RomResourceSpec(   getClass(),   “Masks”+dirSeparator+“white.efrm”)},  }]]></pre>这个RomResourceBundle描述了6个键字-值对。例如键字“black”与EGMaskBundle类关联的资源(如getClass()调用所表示的)以及URL black.efrm相关联。
这个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资源束中的数据。第一种方法通常在开发期间使用,即通过以上描述的过程从文件系统(或网络)检索数据。第二种方法通常在生产应用中使用,即创建一个RRB文件,在程序运行之前,文件中将含有RRB中的所有键字和数据。尽管这个文件是在RAM中创建的,它能被装入例如嵌入式设备的ROM存储器。当应用启动时,指向RRB文件装入存储器中的位置的指针被传递到RomResourceBundleMaganer类中的过程。这个类将读取RRB的内容并创建RomResourceBundle类的一个实例。当RRB被应用代码请求时,这个副本将被返回,它现在提供一个指向在ROM中留下的数据的指针。
用这个技术开发的应用,能移植到无论使用基于文件还是基于ROM存取方法的环境。如上所述,作出决定的时间是在应用启动时,而不是数据被访问时。
尽管本发明的最佳实施例是在特定的平台内结合特定的类层次结构说明的,应当明白,对于本领域的熟练人员显而易见的对本发明的改进都应视为包含在后附的权利要求的范围内。
权利要求
1.一种用于处理直接来自只读存储器中某位置的资源数据的系统,包含至少一个逻辑表,逻辑表含有用于程序对资源的调用的键字,并将该键字与一个标识资源数据在只读存储器中位置的值相关联;一种用于将对资源数据的调用重定向到至少一个逻辑表的机构。
2.按照权利要求1的系统,其中的值是一个指向资源数据在只读存储器中位置的指针。
3.按照权利要求1或2的系统,其中的键字是个字符串。
4.在计算机系统中,一种处理直接来自只读存储器中某位置的资源数据的方法,包含在系统启动时,生成一个键字-值对的数组,其中,对中的键字与某个命名的资源关联,而对中的键字的对应值是用于访问只读存储器中该位置上的资源数据的信息;在该系统中的程序启动时,接合一个全程开关,将程序对资源的调用定向到所述数组。
5.按照权利要求4的方法,进一步包含以下步骤定位对应于在程序中指名的资源的值;将该值传递到处理该资源数据的过程;以及处理来自只读存储器中该位置的资源数据。
6.在一个面向对象的解释程序设计环境中,该环境具有的管理器类具有一个适应于向随机存取存储器(RAM)返回只读存储器(ROM)中存储的永久数据的get_Contents过程,一种处理直接来自只读存储器中某位置的资源数据的方法,包含不考虑(overriding)get_Contents过程;向RAM返回多个数组的一个数组,每个内部数组长度为两项,第一项是一个键字,第二项是对ROM中存储的资源数据的说明的一个实例;将各内部数组存储在RAM中的某个存储位置;以及将各内部数组的存储位置的指针传递给应用管理器中的过程。
7.一种计算机可读的用于存储在计算机中执行权利要求4到6中任一种方法中使用的指令的存储器。
8.一种计算机程序产品,包含一个计算机可用的介质,介质上有实现在其中的计算机可读的程序代码装置,其内容用于使计算机处理直接来自只读存储器中位置的资源数据,所述计算机程序产品中的计算机可读程序代码装置包含用于使计算机在计算机内的系统启动时生成键字-值对数组的计算机可读程序产品代码装置,其中,对中的键字与某个命名的资源关联,对中的键字的对应值是用于访问只读存储器中位置上的资源数据的信息;用于使计算机在计算机内的所述系统启动时采用一个全程开关将程序对资源的调用定向到所述数组的计算机可读的程序代码装置。
全文摘要
提供一种存取诸如位图、字型和声音文件的资源的系统。数据以Java对象中的字节数组被读入动态(RAM)存储器,至少要复制字节数组的另一个副本,才能处理资源数据。本发明提供一种直接从ROM访问资源数据而不在RAM中复制中间副本的机制。每个资源可在逻辑表中有独有的键字或字符串。与键字关联的值是指向ROM中存储的数据的指针。指针被直接传递到负责在硬件上处理数据的过程,无需使数据变成临时的Java对象。
文档编号G06F9/445GK1271125SQ0010475
公开日2000年10月25日 申请日期2000年3月24日 优先权日1999年3月30日
发明者C·R·马利奥德, P·J·米勒, P·C·鲁贝辛 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1