一種Java卡虛擬機(jī)中本地函數(shù)的調(diào)用方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及Java卡虛擬機(jī)系統(tǒng),特別涉及一種Java卡虛擬機(jī)中本地函數(shù)的調(diào)用 方法及相關(guān)的裝置。
【背景技術(shù)】
[0002]Java卡虛擬機(jī)中本地函數(shù)是指用native關(guān)鍵字修飾的函數(shù),其實(shí)現(xiàn)不采用Java 代碼語言。由于Java卡虛擬機(jī)是一個虛擬的計(jì)算機(jī),其具有獨(dú)立的指令集和堆棧,但只依 靠其自身的指令集系統(tǒng),無法直接訪問智能卡芯片的硬件資源,為此,Java卡虛擬機(jī)使用了 本地函數(shù)來擴(kuò)展其功能。
[0003]Java卡虛擬機(jī)對于本地函數(shù)的調(diào)用與其他函數(shù)(以下稱為普通函數(shù))沒有區(qū)別, 在Java卡虛擬機(jī)規(guī)范中涉及函數(shù)的調(diào)用指令共有四條:invokestatic、invokespecial、 invokevirtual、invokeinterface。對于本地函數(shù)的調(diào)用,同樣需要這四條調(diào)用指令(以 下稱為普通指令)完成。其中,invokestatic指令用于調(diào)用Java卡虛擬機(jī)中的靜態(tài)函數(shù), invokespecial指令用于調(diào)用父類函數(shù)、私有函數(shù)和實(shí)例初始化函數(shù),invokevirtual指令 用于調(diào)用實(shí)例函數(shù),invokeinterface用于調(diào)用接口函數(shù)。
[0004] 圖1是目前本地函數(shù)的執(zhí)行過程框圖,如圖1所示,上述四條調(diào)用指令都帶一個 調(diào)用參數(shù),這個參數(shù)代表Java卡中常量池信息,而常量池信息用于定位目標(biāo)函數(shù)的位置信 息,在Java卡虛擬機(jī)執(zhí)行過程中,根據(jù)常量池信息定位到目標(biāo)函數(shù)的位置,然后根據(jù)目標(biāo) 函數(shù)的內(nèi)容進(jìn)行執(zhí)行。該技術(shù)應(yīng)用于Java卡虛擬機(jī)系統(tǒng)的研發(fā)階段,對Java卡虛擬機(jī)系 統(tǒng)中的函數(shù)調(diào)用方式的處理。
[0005] 在Java卡虛擬機(jī)技術(shù)規(guī)范中,Java卡本地函數(shù)和普通函數(shù)沒有區(qū)別,都需要根據(jù) 調(diào)用指令的參數(shù)值,去定位參數(shù)指定的常量池信息,再根據(jù)常量池信息定位目標(biāo)函數(shù)的位 置,進(jìn)而執(zhí)行目標(biāo)函數(shù)的內(nèi)容。這必然導(dǎo)致本地函數(shù)執(zhí)行效率的低下。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明的目的在于提供一種Java卡虛擬機(jī)中本地函數(shù)的調(diào)用方法及裝置,能更 好地解決本地函數(shù)執(zhí)行效率低的問題。
[0007] 根據(jù)本發(fā)明的一個方面,提供了一種Java卡虛擬機(jī)中本地函數(shù)的調(diào)用方法,包 括:
[0008] 對已生成的Java卡匯編文件中是否含有本地函數(shù)進(jìn)行判斷;
[0009] 若所述Java卡匯編文件中含有本地函數(shù),則將所述本地函數(shù)的原有鏈接關(guān)系修 改為能夠直接執(zhí)行所述本地函數(shù)的本地函數(shù)鏈接關(guān)系;
[0010] 利用所述本地函數(shù)鏈接關(guān)系,調(diào)用所述本地函數(shù)。
[0011] 優(yōu)選地,在所述的對已生成的Java卡匯編文件中是否含有本地函數(shù)進(jìn)行判斷的 步驟之前,還包括:
[0012] 通過對所述Java卡匯編文件進(jìn)行解析,得到普通指令、函數(shù)、函數(shù)的位置。
[0013] 優(yōu)選地,所述的對已生成的Java卡匯編文件中是否含有本地函數(shù)進(jìn)行判斷的步 驟具體為:
[0014] 判斷所述Java卡匯編文件中的函數(shù)是否已用native關(guān)鍵字進(jìn)行聲明;
[0015] 若所述函數(shù)已用native關(guān)鍵字進(jìn)行聲明,則將所述函數(shù)確定為本地函數(shù),否則將 所述函數(shù)確定為普通函數(shù)。
[0016] 優(yōu)選地,所述的將所述本地函數(shù)的原有鏈接關(guān)系修改為能夠直接執(zhí)行所述本地函 數(shù)的本地函數(shù)鏈接關(guān)系的步驟具體為:
[0017] 將所述普通指令替換為用來直接調(diào)用所述本地函數(shù)的專用指令;
[0018] 在所述專用指令之后,添加用來指示所述本地函數(shù)的位置的索引值。
[0019] 優(yōu)選地,所述的利用所述本地函數(shù)鏈接關(guān)系,調(diào)用所述本地函數(shù)的步驟具體為:
[0020] 根據(jù)所述本地函數(shù)鏈接關(guān)系中的專用指令,找到所述索引值對應(yīng)的本地函數(shù)并直 接執(zhí)行。
[0021] 根據(jù)本發(fā)明的另一方面,提供了一種Java卡虛擬機(jī)中本地函數(shù)的調(diào)用裝置,包 括:
[0022] 判斷模塊,用于對已生成的Java卡匯編文件中是否含有本地函數(shù)進(jìn)行判斷;
[0023] 處理模塊,若所述Java卡匯編文件中含有本地函數(shù),則將所述本地函數(shù)的原有鏈 接關(guān)系修改為能夠直接執(zhí)行所述本地函數(shù)的本地函數(shù)鏈接關(guān)系;
[0024] 調(diào)用模塊,用于利用所述本地函數(shù)鏈接關(guān)系,調(diào)用所述本地函數(shù)。
[0025] 優(yōu)選地,還包括:
[0026] 解析模塊,用于通過對所述Java卡匯編文件進(jìn)行解析,得到普通指令、函數(shù)、函數(shù) 的位置。
[0027] 優(yōu)選地,所述判斷模塊判斷所述Java卡匯編文件中的函數(shù)是否已用native關(guān)鍵 字進(jìn)行聲明,若所述函數(shù)已用native關(guān)鍵字進(jìn)行聲明,則將所述函數(shù)確定為本地函數(shù),否 則將所述函數(shù)確定為普通函數(shù)。
[0028] 優(yōu)選地,所述處理模塊將所述普通指令替換為用來直接調(diào)用所述本地函數(shù)的專用 指令,并在所述專用指令之后,添加用來指示所述本地函數(shù)的位置的索引值。
[0029] 優(yōu)選地,所述調(diào)用模塊根據(jù)所述本地函數(shù)鏈接關(guān)系中的專用指令,找到所述索引 值對應(yīng)的本地函數(shù)并直接執(zhí)行。
[0030] 與現(xiàn)有技術(shù)相比較,本發(fā)明的有益效果在于:
[0031] 本發(fā)明通過將本地函數(shù)和普通函數(shù)進(jìn)行區(qū)分,使本地函數(shù)的調(diào)用不再需要根據(jù)常 量池信息進(jìn)行定位,省去了搜索過程,從而使本地函數(shù)可以直接執(zhí)行,提高了Java卡虛擬 機(jī)執(zhí)行的效率。
【附圖說明】
[0032] 圖1是現(xiàn)有技術(shù)提供的本地函數(shù)的執(zhí)行過程框圖;
[0033] 圖2是本發(fā)明提供的Java卡虛擬機(jī)中本地函數(shù)的調(diào)用方法框圖;
[0034] 圖3是本發(fā)明提供的Java卡虛擬機(jī)中本地函數(shù)的調(diào)用裝置框圖;
[0035] 圖4是本發(fā)明實(shí)施例提供的掩膜文件生成過程示意圖;
[0036] 圖5是本發(fā)明實(shí)施例提供的本地函數(shù)調(diào)用流程圖。
【具體實(shí)施方式】
[0037] 以下結(jié)合附圖對本發(fā)明的優(yōu)選實(shí)施例進(jìn)行詳細(xì)說明,應(yīng)當(dāng)理解,以下所說明的優(yōu) 選實(shí)施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。
[0038] 圖2是本發(fā)明提供的Java卡虛擬機(jī)中本地函數(shù)的調(diào)用方法框圖,如圖2所示,步 驟包括:
[0039] 步驟201:對已生成的Java卡匯編文件中是否含有本地函數(shù)進(jìn)行判斷。
[0040] 在執(zhí)行所述步驟201之前,對所述Java卡匯編文件進(jìn)行解析,得到普通指令、函 數(shù)、函數(shù)的位置。然后,對所述Java卡匯編文件中的函數(shù)是否已用native關(guān)鍵字聲明進(jìn)行 判斷,若所述函數(shù)已用native關(guān)鍵字進(jìn)行聲明,則將所述函數(shù)確定為本地函數(shù),否則將所 述函數(shù)確定為普通函數(shù)。
[0041] 步驟202:若所述Java卡匯編文件中含有本地函數(shù),則將所述本地函數(shù)的原有鏈 接關(guān)系修改為能夠直接執(zhí)行所述本地函數(shù)的本地函數(shù)鏈接關(guān)系。
[0042] 具體地說,首先將所述普通指令替換為用來直接調(diào)用所述本地函數(shù)的專用指令, 也就是說,本發(fā)明將本地函數(shù)的調(diào)用與Java卡普通函數(shù)的調(diào)用進(jìn)行了區(qū)分,根據(jù)本地函數(shù) 的特點(diǎn),將本地函數(shù)調(diào)用進(jìn)行了指令擴(kuò)展,即使用專用指令invokenative對本地函數(shù)進(jìn)行 調(diào)用。然后在所述專用指令之后,添加用來指示所述本地函數(shù)的位置的索引值。例如:在所 述Java卡匯編文件中有條普通指令,其調(diào)用本地函數(shù)X,具體為:Invokespecial+本地函數(shù) X。在經(jīng)過鏈接過程后,將在鏈接文件中形成所述本地函數(shù)X的本地函數(shù)鏈接關(guān)系,具體為 invokenative+n。其中,n是所述本地函數(shù)X的索引值,其值的多少視鏈接時本地函數(shù)X的 位置而定。
[0043] 步驟203:利用所述本地函數(shù)鏈接關(guān)系,調(diào)用所述本地函數(shù)。
[0044] 具體地說,根據(jù)所述本地函數(shù)鏈接關(guān)系中的專用指令,找到所述索引值對應(yīng)的本 地函數(shù)并直接執(zhí)行。
[0045] 現(xiàn)有技術(shù)的鏈接過程,對本地函數(shù)和java卡普通函數(shù)不加以區(qū)分,本地函數(shù)的調(diào) 用指令可以是invokevirtual、invokespecial、invokestatic三條指令,執(zhí)行過程也與普 通函數(shù)沒有區(qū)別。本發(fā)明中,針對本地函數(shù)的調(diào)用擴(kuò)展了新指令invokenative,將本地函數(shù) 的執(zhí)行與普通java函數(shù)區(qū)分開來,使java卡虛擬機(jī)的效率得到了很大提升。
[0046] 此外,現(xiàn)有技術(shù)中,本地函數(shù)的存儲也和普通函數(shù)沒有區(qū)別,都存在于包中的函數(shù) 組件中,在函數(shù)組件中,本地函數(shù)和普通函數(shù)根據(jù)函數(shù)頭信息進(jìn)行區(qū)分。這樣的存儲方式, 由于本地函數(shù)沒有實(shí)際的內(nèi)容,只是存儲一份函數(shù)頭信息,以標(biāo)識本地函數(shù)類型和其索引 值,因而導(dǎo)致了存儲空間的浪費(fèi)。例如,未采用本發(fā)明時,掩膜文件的本地函數(shù)信息如下:
[0047] /*methodi0x00003214:0x001b:publicstaticnative
[0048]javacard/framework/service/RMINativeMethods/rmi_invoker_void(IS[BB) V*/
[0049] 0x20,
[0050] 0x18,
[0051] /*methodi0x00003216:0x001d:publicstaticnative
[0052]javacard/framework/service/RMINativeMethods/rmi_invoker_ boolean(IS[BB)Z*/
[0053] 0x20,
[0054] 0x19,
[0055] 而采用本發(fā)明時,掩膜文件中不含有上述本地函數(shù)信息,因此節(jié)省了存儲空間。
[0056] 本發(fā)明不需要存儲本地函數(shù)頭信息,函數(shù)的信息已經(jīng)在調(diào)用方法時進(jìn)行了存儲, 例如,在掩膜文件中含有如下信息:INV0KENATIVE,0x00,0x7C。INV0KENATIVE指令的后續(xù) 兩字節(jié)即為存儲的調(diào)用方法索引信息,因此能夠節(jié)省Java卡的存儲空間。
[0057] 圖3是本發(fā)明提供的Java卡虛擬機(jī)中本地函數(shù)的調(diào)用裝置框圖,如圖3所示,包 括解析模塊、判斷模塊、處理模塊和調(diào)用模塊。其中:
[0058] 所述解析模塊,用于通過對所述Java卡匯編文件進(jìn)行解析,得到普通指令 (invok