專利名稱:Java卡的數(shù)據(jù)處理方法及裝置的制作方法
技術(shù)領(lǐng)域:
本申請涉及智能卡技術(shù)領(lǐng)域,特別是涉及一種JAVA卡的數(shù)據(jù)處理方法及裝置。
背景技術(shù):
JAVA卡是一種可以運行JAVA程序的CPU智能卡。通過JAVA卡,開發(fā)人員可以任意選擇他們所熟悉和喜歡的開發(fā)工具。由于對JAVA卡的編程是用JAVA語言,所以幾乎當(dāng)今所有流行的JAVA開發(fā)環(huán)境,如VJ++,Vcafe等,都可以被用來進(jìn)行JAVA卡的開發(fā),從而使得快速完成和調(diào)試JAVA卡的應(yīng)用程序變?yōu)榱丝赡?。此外,也使得任何JAVA開發(fā)人員都可以變?yōu)镴AVA卡開發(fā)人員,為智能卡的發(fā)展提供強(qiáng)有力的人才保證和更好的應(yīng)用前景。目前,在JAVA智能卡的開發(fā)過程中,開發(fā)人員需要在JAVA層定義大量的靜態(tài)全局變量(即靜態(tài)成員變量),這些靜態(tài)全局變量在運行過程中放在EEPROM (Electrically Erasable Programmable Read-Only Memory,電可擦可編程只讀存儲器)中。因為JAVA應(yīng)用中的靜態(tài)全局變量是存放在EEPROM中,所以對靜態(tài)全局變量的訪問要通過靜態(tài)全局變量的相對于靜態(tài)組件的偏移地址來計算出靜態(tài)全局變量的實際地址,進(jìn)而進(jìn)行相應(yīng)的訪問和處理,如圖I所示。這樣,在開發(fā)過程中,需要操作這些變量時就會有大量的讀寫EEPROM 的過程,然而讀寫EEPROM非常耗時,從而影響JAVA卡開發(fā)和JAVA程序的執(zhí)行效率??傊?,需要本領(lǐng)域技術(shù)人員迫切解決的一個技術(shù)問題就是如何提高JAVA卡開發(fā)和JAVA程序執(zhí)行的效率。
發(fā)明內(nèi)容
本申請所要解決的技術(shù)問題是提供一種JAVA卡的數(shù)據(jù)處理方法及裝置,以解決如何提高JAVA卡開發(fā)和JAVA程序執(zhí)行的效率的問題。為了解決上述問題,本申請公開了一種JAVA卡的數(shù)據(jù)處理方法,用于在內(nèi)存中訪問靜態(tài)全局變量,包括為靜態(tài)全局變量設(shè)置內(nèi)存屬性,用于指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對應(yīng)的處理;根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行訪問。優(yōu)選地,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性從所述JAVA卡的電可擦可編程只讀存儲器 EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,在所述根據(jù)所述內(nèi)存屬性從所述JAVA卡的EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址的步驟之前,還包括使用至少一個數(shù)組表示多個所述靜態(tài)全局變量,每個所述數(shù)組具有一個數(shù)組標(biāo)識;將每個所述數(shù)組以對象的形式存儲到所述EEPROM中,每個數(shù)組對象中存儲有該數(shù)組中每個所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址。
優(yōu)選地,在所述將每個所述數(shù)組以對象的形式存儲到所述EEPROM中的步驟之后, 還包括使用所述數(shù)組標(biāo)識生成對象表,所述對象表中的每一個所述數(shù)組標(biāo)識指向該數(shù)組標(biāo)識所標(biāo)識的數(shù)組在所述EEPROM中存儲的數(shù)組對象的地址。優(yōu)選地,所述根據(jù)所述內(nèi)存屬性從EEPROM中獲取所述靜態(tài)全局變量在所述JAVA 卡的內(nèi)存中的偏移地址的步驟包括獲取所述靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識;根據(jù)該數(shù)組標(biāo)識從所述對象表中獲取該數(shù)組在所述EEPROM中存儲的數(shù)組對象的地址;根據(jù)該數(shù)組對象的地址,獲取該地址的數(shù)組對象中的所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址。優(yōu)選地,在所述為靜態(tài)全局變量設(shè)置內(nèi)存屬性的步驟之后,還包括生成包括所述靜態(tài)全局變量的JAVA類文件;對所述JAVA類文件進(jìn)行解析,輸出所述靜態(tài)全局變量的內(nèi)存屬性。優(yōu)選地,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址;根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,在所述根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址的步驟之后,還包括使用設(shè)置的私有字節(jié)碼指令替換對所述靜態(tài)全局變量進(jìn)行處理的原字節(jié)碼指令,所述私有字節(jié)碼指令用于在所述JAVA卡的內(nèi)存中操作所述
靜態(tài)全局變量。優(yōu)選地,若存在多個所述靜態(tài)全局變量,則在所述根據(jù)偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟之前或之后,還包括獲取所述多個靜態(tài)全局變量的總偏移值,作為下一次指定具有所述內(nèi)存屬性的靜態(tài)全局變量偏移地址的基址。為了解決上述問題,本申請還公開了一種JAVA卡的數(shù)據(jù)處理裝置,用于在內(nèi)存中訪問靜態(tài)全局變量,所述裝置包括設(shè)置模塊,用于為靜態(tài)全局變量設(shè)置內(nèi)存屬性,以指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對應(yīng)的處理;獲取模塊,用于根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;處理模塊,用于根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行訪問。優(yōu)選地,所述獲取模塊包括第一地址獲取模塊,用于根據(jù)所述內(nèi)存屬性從所述 JAVA卡的電可擦可編程只讀存儲器EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;第二地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述 JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,所述獲取模塊包括地址指定模塊,用于根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址;第三地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。與現(xiàn)有技術(shù)相比,本申請具有以下優(yōu)點本申請通過為JAVA卡中設(shè)置的靜態(tài)全局變量設(shè)置內(nèi)存屬性,明確了對靜態(tài)全局變量的處理(包括寫入、修改、刪除等等),在JAVA卡的內(nèi)存中進(jìn)行。進(jìn)而根據(jù)該內(nèi)存屬性, 獲取具有該屬性的靜態(tài)全局變量在JAVA卡內(nèi)存中的地址,從而實現(xiàn)了在JAVA卡的內(nèi)存中對靜態(tài)全局變量的處理,避免了多次、反復(fù)訪問EEPR0M造成的耗時和低效率,提高了 JAVA 卡開發(fā)和JAVA程序執(zhí)行的效率。
圖1是根據(jù)現(xiàn)有技術(shù)的一種JAVA卡的靜態(tài)全局變量的處理方法的示意圖;圖2是根據(jù)本申請實施例一的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖;圖3是根據(jù)本申請實施例二的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖;圖4是圖3所示實施例的JAVA卡數(shù)據(jù)處理的示意圖;圖5是根據(jù)本申請實施例三的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖;圖6是圖5所示實施例中的RTP初始化示意圖;圖7是圖5所示實施例中的DTP初始化示意圖;圖8是圖5所示實施例的JAVA卡數(shù)據(jù)處理的示意圖;圖9是根據(jù)本申請實施例四的一種JAVA卡的數(shù)據(jù)處理裝置的結(jié)構(gòu)框圖。
具體實施例方式為使本申請的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖和具體實 施方式對本申請作進(jìn)一步詳細(xì)的說明。實施例一參照圖2,示出了根據(jù)本申請實施例一的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程 圖。本實施例的JAVA卡的數(shù)據(jù)處理方法用于在內(nèi)存中訪問靜態(tài)全局變量,包括以下 步驟步驟S202 :為靜態(tài)全局變量設(shè)置內(nèi)存屬性。其中,所述內(nèi)存屬性用于指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與內(nèi) 存屬性相對應(yīng)的處理。本步驟中,對于那些無須長時間或永久保存的靜態(tài)全局變量的數(shù)據(jù),為其設(shè)置內(nèi) 存屬性,以指示對其的處理(如讀、寫、刪除、修改等等)在內(nèi)存中進(jìn)行,無須再多次、重復(fù)地 訪問 EEPR0M。步驟S204 :根據(jù)內(nèi)存屬性確定靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址。當(dāng)一個靜態(tài)全局變量具有內(nèi)存屬性時,其需要有內(nèi)存地址,以便在內(nèi)存中的相應(yīng) 位置對其進(jìn)行處理。內(nèi)存地址的獲取有多種方式,比如在確定情況下直接指定靜態(tài)全局變 量在內(nèi)存中的絕對地址,但更常用的是,指定靜態(tài)全局變量在內(nèi)存中的偏移地址,然后再根 據(jù)內(nèi)存的基地址,確定靜態(tài)全局變量在內(nèi)存中的絕對地址。步驟S206 :根據(jù)內(nèi)存地址在JAVA卡的內(nèi)存中對靜態(tài)全局變量進(jìn)行訪問。本實施例通過為JAVA卡中設(shè)置的靜態(tài)全局變量設(shè)置內(nèi)存屬性,明確了對靜態(tài)全 局變量的訪問(包括寫入、修改、刪除等等),在JAVA卡的內(nèi)存中進(jìn)行。進(jìn)而根據(jù)該內(nèi)存屬 性,獲取具有該屬性的靜態(tài)全局變量在JAVA卡內(nèi)存中的地址,從而實現(xiàn)了在JAVA卡的內(nèi) 存中對靜態(tài)全局變量的處理,避免了多次、反復(fù)訪問EEPR0M造成的耗時和低效率,提高了 JAVA卡開發(fā)和JAVA程序執(zhí)行的效率。CN 102591787 A說明書3/9 頁
對靜態(tài)全局變量的處理,避免了多次、反復(fù)訪問EEPR0M造成的耗時和低效率,提高了 JAVA 卡開發(fā)和JAVA程序執(zhí)行的效率。
實施例二參照圖3,示出了根據(jù)本申請實施例二的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖。本實施例的JAVA卡的數(shù)據(jù)處理方法用于在內(nèi)存中訪問靜態(tài)全局變量,包括以下步驟步驟S302 :為多個靜態(tài)全局變量設(shè)置內(nèi)存屬性。步驟S304 :使用一個數(shù)組放置多個靜態(tài)全局變量。該數(shù)組具有一個數(shù)組標(biāo)識,如數(shù)組ID。需要說明的是,當(dāng)靜態(tài)全局變量較多時,可以使用多個數(shù)組,每個數(shù)組都具有一個數(shù)組標(biāo)識。優(yōu)選地,使用臨時數(shù)組,既可以滿足實際需要,又不會長時間占用空間。步驟S306 :將該數(shù)組以對象的形式存儲到EEPROM中。其中,該數(shù)組對象中存儲有該數(shù)組中每個靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。若有多個數(shù)組,則每個數(shù)組都以對象的形式存儲到EEPROM中,每個數(shù)組對象中存儲有該數(shù)組中每個靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。步驟S308 :使用數(shù)組標(biāo)識生成對象表,對象表中的每一個數(shù)組標(biāo)識指向該數(shù)組標(biāo)識所標(biāo)識的數(shù)組在EEPROM中存儲的數(shù)組對象的地址。該步驟為可選步驟,尤其適用于存在多個數(shù)組的情形。使用每個數(shù)組的數(shù)組標(biāo)識生成對象表,獲取靜態(tài)全局變量在JAVA卡中的內(nèi)存地址時,先通過該靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識,在對象表中找到該數(shù)組的數(shù)組對象在EEPROM中的地址,然后再從該數(shù)組對象中獲取靜態(tài)全局變量的內(nèi)存偏移地址。通過對象表,在數(shù)組較多時,可以方便地對數(shù)組在EEPROM中對應(yīng)的數(shù)組對象進(jìn)行組織和管理,提高JAVA卡的數(shù)據(jù)訪問和處理效率。步驟S310 :當(dāng)需要對一個靜態(tài)全局變量進(jìn)行處理時,若確定該靜態(tài)全局變量具有內(nèi)存屬性,則進(jìn)行后續(xù)處理。步驟S312 :確定該靜態(tài)全局變量所在的數(shù)組,獲取該數(shù)組的數(shù)組標(biāo)識。步驟S314 :根據(jù)該數(shù)組的數(shù)組標(biāo)識,通過對象表確定該數(shù)組對應(yīng)的數(shù)組對象在 EEPROM中的地址。步驟S316 :從確定的EEPROM地址的數(shù)組對象中獲取該數(shù)組在JAVA卡內(nèi)存中的偏移地址。步驟S318 :結(jié)合獲得的偏移地址和內(nèi)存基地址,確定靜態(tài)全局變量在內(nèi)存中的內(nèi)存地址,即絕對地址。步驟S320 :在該內(nèi)存地址對該靜態(tài)全局變量進(jìn)行處理。如寫入、修改、刪除等。上述JAVA卡的數(shù)據(jù)處理方法的整體流程如圖4所示。在圖4中,系統(tǒng)定義一個臨時數(shù)組,用該數(shù)組的下標(biāo)來表示靜態(tài)全局變量,數(shù)組以對象的形式存儲在EEPROM里的對象表里,從對象表可以獲得該數(shù)組的ID號,通過ID號可以找到數(shù)組對象,數(shù)組對象中存儲有該數(shù)組每個變量在內(nèi)存中的偏移地址,通過偏移地址找到內(nèi)存中變量相對應(yīng)的地址。具體訪問變量的過程是,首先要找到這個變量所在的數(shù)組在對象表中的ID號,通過這個ID號找到相應(yīng)的數(shù)組對象在EEPROM中的地址,然后通過對象找到全局靜態(tài)變量存放在RAM中的具體地址。通過這種方式,在訪問(讀)靜態(tài)全局變量時因需要訪問EEPROM的對象表,因此并沒有節(jié)省時間,但是在為靜態(tài)全局變量賦值(寫變量)時,因為寫操作的是內(nèi)存空間,所以節(jié)省了大量時間。從而在解決EEPROM中讀寫變量帶來的效率問題時,盡可能地減少了讀寫EEPROM的操作,相應(yīng)地提高了 JAVA卡開發(fā)和JAVA程序執(zhí)行的效率。實施例三參照圖5,示出了根據(jù)本申請實施例三的一種JAVA卡的數(shù)據(jù)處理方法的步驟流程圖。本實施例以具體JAVA開發(fā)為例,說明JAVA卡的數(shù)據(jù)處理方法,包括以下步驟步驟S502 :為靜態(tài)全局變量設(shè)置內(nèi)存屬性。首先,為字段(field,也即變量,該處字段是指靜態(tài)全局變量形式的字段)添加一個annotation屬性(內(nèi)存屬性),屬性的值分別為COD(clear_on_deselect)或C0R(clear_ on_reset)。COD或COR屬性,使得在生成JAVA類文件時,會在被聲明字段的annotation屬性中出現(xiàn)COD值或COR值。通常,在JAVA類文件中,一個attribute (屬性)是以一個attribute_info (屬性
信息)結(jié)構(gòu)來表示的,該結(jié)構(gòu)如下所示
attribute—info {
u2 attribute—name—index u4 attribute—length u I info [attribute—length]
}在設(shè)置內(nèi)存屬性,即annotation屬性時,可以在JAVA類文件格式中的attributes 屬性中添加一個RuntimeAnnotation屬性。這個RuntimeAnnotation只可能在field— info(字段信息)結(jié)構(gòu)的attribute!!]數(shù)組中看到這個RuntimeAnnotation屬性。也就是說,RuntimeAnnotation屬性是用來定義class (類)或interface (接口)中某個field (字段)的性質(zhì)的。如果某個field擁有static (靜態(tài))特性,并且想把該field分配到COD或COR 空間(C0D和COR均為內(nèi)存空間)中,那么在代表該field的field—info結(jié)構(gòu)中就會使用一個,并且是唯一的一個RuntimeAnnotation屬性來代表該static field的值是COD還是 COR0在為字段定義了 annotation屬性后,如果某個字段的attribute (屬性)是個 RuntimeAnnotation屬性的話,之前的attribute—info結(jié)構(gòu)可更詳細(xì)地解釋為如下所示attribute—info {
u2 attribute—name—index u4 attribute」ength u2 mntimeannotation—index
}其中,attribute_name_index代表一個指到 constant_pool []數(shù)組中某
個項目的索引值,通過這個項目可以找到代表這個attribute (屬性)的名字-
RunteimeAnnotation0 attribute_length 在 RuntimeAnnotation 屬性結(jié)構(gòu)中的 attribute_length 等于 14,表不接下來存儲了 14 個 bytes 的信息。runtimeannotation_ index代表一個指到constant_pool []數(shù)組中某個項目的索引值,通過這個項目可以找到這個runtimeannotation屬性所屬的field_info結(jié)構(gòu)所代表的static field是COD還是 COR空間的數(shù)據(jù)。步驟S504 :生成具有COD或COR屬性的類文件。在JAVA 類文件格式中的 ClassFile, field_info,以及 method_info, Code_ attributes結(jié)構(gòu)中都會使用到attributes (屬性)。在定義了上述內(nèi)存屬性后,將會生成具有內(nèi)存屬性,即上述定義的COD或COR屬性的類文件。步驟S506 生成JCA文件。JCA(Java Connector Architecture,或 J2EE Connector Architecture)即 Java 連接器體系,是J2EE體系架構(gòu)的一部分,為開發(fā)人員提供了一套連接各種異類的企業(yè)信息系統(tǒng)的體系架構(gòu)。本實施例中,通過converter (轉(zhuǎn)換)工具來解析生成的類文件的field_info,最后把帶有COD和COR屬性的字段信息輸出到JCA文件中。以步驟S502中為字段定義的runtimeannotation屬性為例,若某個字段為靜態(tài)字段,且定義了 runtimeannotation屬性,則生成的類文件中包括該字段的 runtimeannotation屬性信息,即存在如下信息
attribute—info {
u2 attribute—name—index u4 attribute」ength u2 mntimeannotation—index
}在解析類文件時,先找到類文件中的field信息;解析其靜態(tài)域;判斷該靜態(tài)域是否具有 COD 或 COR 屬性(attribute_info 屬性結(jié)構(gòu)中 runtimeannotation_index 代表一個指到constant_pool []數(shù)組中某個項目的索引值,通過這個項目可以找到這個 runtimeannotation 屬性所屬的 field_info 結(jié)構(gòu)所代表的 static field 是 COD 還是 COR 空間的數(shù)據(jù));在輸出JCA文件時將靜態(tài)域的COD或COR屬性輸出,即完成了 JCA文件的處理。在對類文件進(jìn)行了解析后,生成的JCA文件中是否定義了 COD或COR的static field的field結(jié)構(gòu)分別如下其中,沒有定義COD或COR的field結(jié)構(gòu)如下
fields {
static byte ramField; "B static byte ramFieldCor=0; //B
}
定義了 COD或COR的field結(jié)構(gòu)如下
fields {
static byte ramField COD; //B static byte ramFieldCor=0 COR; //B
}步驟S508 :生成mask(掩模)文件。通過將輸入的JCA文件進(jìn)行轉(zhuǎn)化解析來生成mask文件,其中包括解析每個包的 field信息,如果field具有COR屬性,則存儲靜態(tài)全局變量在COR空間中的偏移值;如果 field具有COD屬性,則存儲靜態(tài)全局變量在指定邏輯通道所對應(yīng)的COD空間上的偏移。在輸出mask文件中字節(jié)碼時,如果是操作靜態(tài)field的字節(jié)碼,貝U判斷field是否是COD或是COR空間的,如果是,則將當(dāng)前的這條字節(jié)碼替換成對應(yīng)的操作COD或COR的私有字節(jié)碼指令。優(yōu)選地,在mask文件中要輸出COR靜態(tài)字段的總的偏移值,以便以后在COR分配內(nèi)存對象時以總的偏移值為基址向后分配空間,如圖6所示,總的偏移值用來初始化 RTP (C0R已分配的空間的偏移,從O開始)的值。優(yōu)選地,mask文件要輸出每個APPLET包中的COD靜態(tài)field總的偏移值,然后會按包的上下文ID來輸出每個包的COD靜態(tài)field總的偏移值,以便以后在COD空間分配內(nèi)存對象時以總的偏移值為基址向后分配空間,如圖7所示,總的偏移值用來初始化DTP (DTP 是APPLET包所對應(yīng)的COD空間己分配的偏移,從O開始)的值。通過輸出總的偏移值,為下一次靜態(tài)全局變量的內(nèi)存分配提供了參考和依據(jù),提高了靜態(tài)全局變量內(nèi)存分配的速度和效率。步驟S510 :初始化RTP和DTP的值。在將mask文件寫到rom后,會讀出靜態(tài)field對應(yīng)COR空間的總偏移值,用這個值來初始化RTP。然后,讀出每個APPLET包中的COD靜態(tài)field總的偏移值來初始化每個 DTP值(DTP共有16個)。步驟S512 :靜態(tài)域字節(jié)碼的操作。包括(I)靜態(tài)域字節(jié)碼的處理過程中會將標(biāo)示COR或COD的標(biāo)志讀出來,也會讀
10出靜態(tài)域相對于COR或COD空間的偏移值。(2)判斷靜態(tài)域是COR還是C0D,如果靜態(tài)域是COR空間的則獲取COR的基地址,用這個基地址加上讀取出的偏移值,便是操作變量的地址;如果靜態(tài)域是COD空間的則根據(jù)當(dāng)前的通道ID號,根據(jù)這個ID號確定是哪塊COD空間并得到這塊COD空間的基地址,用這個基地址加上讀取出的偏移值,便是操作變量的地址。上述JAVA卡的數(shù)據(jù)處理方法的示意流程如圖8所示。在圖8中,系統(tǒng)定義具有內(nèi)存屬性的靜態(tài)全局變量,通過這個屬性可以得知該變量是存儲在內(nèi)存空間中的,每個變量映射到一個屬于自己的偏移地址,通過這個偏移地址可以找到內(nèi)存中變量相對應(yīng)的地址。訪問變量時,通過變量對應(yīng)的偏移地址計算出變量的絕對地址,這個地址是存儲在內(nèi)存空間中的。因為變量是存儲在內(nèi)存中的,所以讀寫變量時就是在操作內(nèi)存,這樣要比讀寫 EEPROM節(jié)省大量的時間,同時比實施例二的方案節(jié)省了占用EEPROM的空間。具體實現(xiàn)時,可以通過自定義私有指令的方法來實現(xiàn),包括將靜態(tài)全局變量直接指定到內(nèi)存的COD或COR空間中(簡稱內(nèi)存靜態(tài)變量),通過添加私有指令來操作COD或 COR中的靜態(tài)變量。這樣做的優(yōu)點是1、使用方便,只需用一個@符號和一個COD或COR字符來確定靜態(tài)變量是COD還是COR空間;2、操作內(nèi)存靜態(tài)變量時可以通過靜態(tài)變量在COD 或COR中的偏移值來直接找到變量。本實施例中,將靜態(tài)全局變量定義到內(nèi)存中,通過靜態(tài)全局變量在內(nèi)存中的偏移值來訪問靜態(tài)全局變量;并且,通過屬性來識別靜態(tài)域是在COD空間還是在COR空間,并通過轉(zhuǎn)換工具輸出到MASK文件,進(jìn)而實現(xiàn)了靜態(tài)全局變量的內(nèi)存處理。本實施例通過對空間和性能的分析,將靜態(tài)全局變量直接指定到內(nèi)存中,與實施例二的方案相比,既能節(jié)省訪問變量的時間又能節(jié)省變量賦值的時間,并且可以節(jié)省占用 EEPROM的空間,提高了空間使用率和執(zhí)行速度。實施例四參照圖9,示出了根據(jù)本申請實施例四的一種JAVA卡的數(shù)據(jù)處理裝置的結(jié)構(gòu)框圖。本實施例的JAVA卡的數(shù)據(jù)處理裝置用于在內(nèi)存中訪問靜態(tài)全局變量,包括設(shè)置模塊902,用于為靜態(tài)全局變量設(shè)置內(nèi)存屬性,以指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與內(nèi)存屬性相對應(yīng)的處理;獲取模塊904,用于根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址;處理模塊906,用于根據(jù)所述內(nèi)存地址在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行訪問。優(yōu)選地,獲取模塊904包括第一地址獲取模塊9042,用于根據(jù)內(nèi)存屬性從JAVA 卡的EEPROM中獲取靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址;第二地址獲取模塊 9044,用于根據(jù)偏移地址確定靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,本實施例的JAVA卡的數(shù)據(jù)處理裝置還包括數(shù)組模塊908,用于在第一地址獲取模塊9042根據(jù)內(nèi)存屬性從JAVA卡的EEPROM中獲取靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址之前,使用至少一個數(shù)組表示多個靜態(tài)全局變量,每個數(shù)組具有一個數(shù)組標(biāo)識;將每個數(shù)組以對象的形式存儲到EEPROM中,每個數(shù)組對象中存儲有該數(shù)組中每個靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。優(yōu)選地,數(shù)組模塊908還用于,在將每個數(shù)組以對象的形式存儲到EEPROM中之后, 使用數(shù)組標(biāo)識生成對象表,對象表中的每一個數(shù)組標(biāo)識指向該數(shù)組標(biāo)識所標(biāo)識的數(shù)組在EEPROM中存儲的數(shù)組對象的地址。優(yōu)選地,第一地址獲取模塊9042,用于獲取靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識; 根據(jù)該數(shù)組標(biāo)識從對象表中獲取該數(shù)組在EEPROM中存儲的數(shù)組對象的地址;根據(jù)該數(shù)組對象的地址,獲取該地址的數(shù)組對象中的靜態(tài)全局變量在JAVA卡的內(nèi)存中的偏移地址。優(yōu)選地,本實施例的JAVA卡的數(shù)據(jù)處理裝置還包括類生成模塊910,用于在設(shè)置模塊902為靜態(tài)全局變量設(shè)置內(nèi)存屬性之后,生成包括所述靜態(tài)全局變量的JAVA類文件; 對JAVA類文件進(jìn)行解析,輸出所述靜態(tài)全局變量的內(nèi)存屬性。優(yōu)選地,獲取模塊904包括地址指定模塊9046,用于根據(jù)內(nèi)存屬性,為靜態(tài)全局變量指定在JAVA卡的內(nèi)存中的偏移地址;第三地址獲取模塊9048,用于根據(jù)指定的偏移地址確定靜態(tài)全局變量在JAVA卡的內(nèi)存中的內(nèi)存地址。優(yōu)選地,獲取模塊904還包括替換模塊90410,用于在地址指定模塊9046根據(jù)內(nèi)存屬性,為靜態(tài)全局變量指定在JAVA卡的內(nèi)存中的偏移地址后,使用設(shè)置的私有字節(jié)碼指令替換對靜態(tài)全局變量進(jìn)行處理的原字節(jié)碼指令,私有字節(jié)碼指令用于在JAVA卡的內(nèi)存中操作靜態(tài)全局變量。優(yōu)選地,本實施例的JAVA卡的數(shù)據(jù)處理裝置還包括總偏移輸出模塊912,用于若存在多個靜態(tài)全局變量,則在第三地址獲取模塊9048根據(jù)偏移地址獲取靜態(tài)全局變量在 JAVA卡的內(nèi)存中的內(nèi)存地址之前或之后,獲取多個靜態(tài)全局變量的總偏移值,作為下一次指定具有內(nèi)存屬性的靜態(tài)全局變量偏移地址的基址。本實施例的JAVA卡的數(shù)據(jù)處理裝置用于實現(xiàn)前述多個方法實施例中相應(yīng)的JAVA 卡數(shù)據(jù)處理方法,并具有相應(yīng)的JAVA卡數(shù)據(jù)處理方法的有益效果,在此不再贅述。通過本申請的JAVA卡數(shù)據(jù)處理方案,提供了一種將EEPROM中的靜態(tài)全局變量轉(zhuǎn)換成內(nèi)存變量的實現(xiàn)方式,解決了在EEPROM中讀寫變量帶來的效率問題,盡量減少了讀寫 EEPROM的操作,避免了多次、反復(fù)訪問EEPROM造成的耗時和低效率,提高了 JAVA卡開發(fā)和 JAVA程序執(zhí)行的效率。本說明書中的各個實施例均采用遞進(jìn)的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。對于裝置實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。以上對本申請所提供的一種JAVA卡的數(shù)據(jù)處理方法和裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本申請的原理及實施方式進(jìn)行了闡述,以上實施例的說明只是用于幫助理解本申請的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本申請的限制。
權(quán)利要求
1.一種JAVA卡的數(shù)據(jù)處理方法,其特征在于,用于在內(nèi)存中訪問靜態(tài)全局變量,包括 為靜態(tài)全局變量設(shè)置內(nèi)存屬性,用于指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對應(yīng)的處理;根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行訪問。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性從所述JAVA卡的電可擦可編程只讀存儲器EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,在所述根據(jù)所述內(nèi)存屬性從所述JAVA卡的EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址的步驟之前,還包括使用至少一個數(shù)組表示多個所述靜態(tài)全局變量,每個所述數(shù)組具有一個數(shù)組標(biāo)識; 將每個所述數(shù)組以對象的形式存儲到所述EEPROM中,每個數(shù)組對象中存儲有該數(shù)組中每個所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,在所述將每個所述數(shù)組以對象的形式存儲到所述EEPROM中的步驟之后,還包括使用所述數(shù)組標(biāo)識生成對象表,所述對象表中的每一個所述數(shù)組標(biāo)識指向該數(shù)組標(biāo)識所標(biāo)識的數(shù)組在所述EEPROM中存儲的數(shù)組對象的地址。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述根據(jù)所述內(nèi)存屬性從EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址的步驟包括獲取所述靜態(tài)全局變量所在數(shù)組的數(shù)組標(biāo)識;根據(jù)該數(shù)組標(biāo)識從所述對象表中獲取該數(shù)組在所述EEPROM中存儲的數(shù)組對象的地址;根據(jù)該數(shù)組對象的地址,獲取該地址的數(shù)組對象中的所述靜態(tài)全局變量在所述JAVA 卡的內(nèi)存中的偏移地址。
6.根據(jù)權(quán)利要求I所述的方法,其特征在于,在所述為靜態(tài)全局變量設(shè)置內(nèi)存屬性的步驟之后,還包括生成包括所述靜態(tài)全局變量的JAVA類文件;對所述JAVA類文件進(jìn)行解析,輸出所述靜態(tài)全局變量的內(nèi)存屬性。
7.根據(jù)權(quán)利要求I或6所述的方法,其特征在于,所述根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟包括根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址; 根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,在所述根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址的步驟之后,還包括使用設(shè)置的私有字節(jié)碼指令替換對所述靜態(tài)全局變量進(jìn)行處理的原字節(jié)碼指令,所述私有字節(jié)碼指令用于在所述JAVA卡的內(nèi)存中操作所述靜態(tài)全局變量。
9.根據(jù)權(quán)利要求7所述的方法,其特征在于,若存在多個所述靜態(tài)全局變量,則在所述根據(jù)偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址的步驟之前或之后,還包括獲取所述多個靜態(tài)全局變量的總偏移值,作為下一次指定具有所述內(nèi)存屬性的靜態(tài)全局變量偏移地址的基址。
10.一種JAVA卡的數(shù)據(jù)處理裝置,其特征在于,用于在內(nèi)存中訪問靜態(tài)全局變量,所述裝置包括設(shè)置模塊,用于為靜態(tài)全局變量設(shè)置內(nèi)存屬性,以指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對應(yīng)的處理;獲取模塊,用于根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;處理模塊,用于根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行訪問。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述獲取模塊包括第一地址獲取模塊,用于根據(jù)所述內(nèi)存屬性從所述JAVA卡的電可擦可編程只讀存儲器EEPROM中獲取所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的偏移地址;第二地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
12.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述獲取模塊包括地址指定模塊,用于根據(jù)所述內(nèi)存屬性,為所述靜態(tài)全局變量指定在所述JAVA卡的內(nèi)存中的偏移地址;第三地址獲取模塊,用于根據(jù)所述偏移地址確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址。
全文摘要
本申請?zhí)峁┝艘环NJAVA卡的數(shù)據(jù)處理方法及裝置,其中,JAVA卡的數(shù)據(jù)處理方法用于在內(nèi)存中訪問靜態(tài)全局變量,包括為靜態(tài)全局變量設(shè)置內(nèi)存屬性,用于指示在JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行與所述內(nèi)存屬性相對應(yīng)的處理;根據(jù)所述內(nèi)存屬性確定所述靜態(tài)全局變量在所述JAVA卡的內(nèi)存中的內(nèi)存地址;根據(jù)所述內(nèi)存地址在所述JAVA卡的內(nèi)存中對所述靜態(tài)全局變量進(jìn)行訪問。通過本申請,避免了多次、反復(fù)訪問EEPROM造成的耗時和低效率,提高了JAVA卡開發(fā)和JAVA程序執(zhí)行的效率。
文檔編號G06F12/02GK102591787SQ201110427789
公開日2012年7月18日 申請日期2011年12月19日 優(yōu)先權(quán)日2011年12月19日
發(fā)明者董吉昌 申請人:北京握奇數(shù)據(jù)系統(tǒng)有限公司