一种Java卡虚拟机中本地函数的调用方法及装置的制造方法

文档序号:9288343阅读:331来源:国知局
一种Java卡虚拟机中本地函数的调用方法及装置的制造方法
【技术领域】
[0001] 本发明涉及Java卡虚拟机系统,特别涉及一种Java卡虚拟机中本地函数的调用 方法及相关的装置。
【背景技术】
[0002]Java卡虚拟机中本地函数是指用native关键字修饰的函数,其实现不采用Java 代码语言。由于Java卡虚拟机是一个虚拟的计算机,其具有独立的指令集和堆栈,但只依 靠其自身的指令集系统,无法直接访问智能卡芯片的硬件资源,为此,Java卡虚拟机使用了 本地函数来扩展其功能。
[0003]Java卡虚拟机对于本地函数的调用与其他函数(以下称为普通函数)没有区别, 在Java卡虚拟机规范中涉及函数的调用指令共有四条:invokestatic、invokespecial、 invokevirtual、invokeinterface。对于本地函数的调用,同样需要这四条调用指令(以 下称为普通指令)完成。其中,invokestatic指令用于调用Java卡虚拟机中的静态函数, invokespecial指令用于调用父类函数、私有函数和实例初始化函数,invokevirtual指令 用于调用实例函数,invokeinterface用于调用接口函数。
[0004] 图1是目前本地函数的执行过程框图,如图1所示,上述四条调用指令都带一个 调用参数,这个参数代表Java卡中常量池信息,而常量池信息用于定位目标函数的位置信 息,在Java卡虚拟机执行过程中,根据常量池信息定位到目标函数的位置,然后根据目标 函数的内容进行执行。该技术应用于Java卡虚拟机系统的研发阶段,对Java卡虚拟机系 统中的函数调用方式的处理。
[0005] 在Java卡虚拟机技术规范中,Java卡本地函数和普通函数没有区别,都需要根据 调用指令的参数值,去定位参数指定的常量池信息,再根据常量池信息定位目标函数的位 置,进而执行目标函数的内容。这必然导致本地函数执行效率的低下。

【发明内容】

[0006] 本发明的目的在于提供一种Java卡虚拟机中本地函数的调用方法及装置,能更 好地解决本地函数执行效率低的问题。
[0007] 根据本发明的一个方面,提供了一种Java卡虚拟机中本地函数的调用方法,包 括:
[0008] 对已生成的Java卡汇编文件中是否含有本地函数进行判断;
[0009] 若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修 改为能够直接执行所述本地函数的本地函数链接关系;
[0010] 利用所述本地函数链接关系,调用所述本地函数。
[0011] 优选地,在所述的对已生成的Java卡汇编文件中是否含有本地函数进行判断的 步骤之前,还包括:
[0012] 通过对所述Java卡汇编文件进行解析,得到普通指令、函数、函数的位置。
[0013] 优选地,所述的对已生成的Java卡汇编文件中是否含有本地函数进行判断的步 骤具体为:
[0014] 判断所述Java卡汇编文件中的函数是否已用native关键字进行声明;
[0015] 若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将 所述函数确定为普通函数。
[0016] 优选地,所述的将所述本地函数的原有链接关系修改为能够直接执行所述本地函 数的本地函数链接关系的步骤具体为:
[0017] 将所述普通指令替换为用来直接调用所述本地函数的专用指令;
[0018] 在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。
[0019] 优选地,所述的利用所述本地函数链接关系,调用所述本地函数的步骤具体为:
[0020] 根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直 接执行。
[0021] 根据本发明的另一方面,提供了一种Java卡虚拟机中本地函数的调用装置,包 括:
[0022] 判断模块,用于对已生成的Java卡汇编文件中是否含有本地函数进行判断;
[0023] 处理模块,若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链 接关系修改为能够直接执行所述本地函数的本地函数链接关系;
[0024] 调用模块,用于利用所述本地函数链接关系,调用所述本地函数。
[0025] 优选地,还包括:
[0026] 解析模块,用于通过对所述Java卡汇编文件进行解析,得到普通指令、函数、函数 的位置。
[0027] 优选地,所述判断模块判断所述Java卡汇编文件中的函数是否已用native关键 字进行声明,若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否 则将所述函数确定为普通函数。
[0028] 优选地,所述处理模块将所述普通指令替换为用来直接调用所述本地函数的专用 指令,并在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。
[0029] 优选地,所述调用模块根据所述本地函数链接关系中的专用指令,找到所述索引 值对应的本地函数并直接执行。
[0030] 与现有技术相比较,本发明的有益效果在于:
[0031] 本发明通过将本地函数和普通函数进行区分,使本地函数的调用不再需要根据常 量池信息进行定位,省去了搜索过程,从而使本地函数可以直接执行,提高了Java卡虚拟 机执行的效率。
【附图说明】
[0032] 图1是现有技术提供的本地函数的执行过程框图;
[0033] 图2是本发明提供的Java卡虚拟机中本地函数的调用方法框图;
[0034] 图3是本发明提供的Java卡虚拟机中本地函数的调用装置框图;
[0035] 图4是本发明实施例提供的掩膜文件生成过程示意图;
[0036] 图5是本发明实施例提供的本地函数调用流程图。
【具体实施方式】
[0037] 以下结合附图对本发明的优选实施例进行详细说明,应当理解,以下所说明的优 选实施例仅用于说明和解释本发明,并不用于限定本发明。
[0038] 图2是本发明提供的Java卡虚拟机中本地函数的调用方法框图,如图2所示,步 骤包括:
[0039] 步骤201:对已生成的Java卡汇编文件中是否含有本地函数进行判断。
[0040] 在执行所述步骤201之前,对所述Java卡汇编文件进行解析,得到普通指令、函 数、函数的位置。然后,对所述Java卡汇编文件中的函数是否已用native关键字声明进行 判断,若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将所 述函数确定为普通函数。
[0041] 步骤202:若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链 接关系修改为能够直接执行所述本地函数的本地函数链接关系。
[0042] 具体地说,首先将所述普通指令替换为用来直接调用所述本地函数的专用指令, 也就是说,本发明将本地函数的调用与Java卡普通函数的调用进行了区分,根据本地函数 的特点,将本地函数调用进行了指令扩展,即使用专用指令invokenative对本地函数进行 调用。然后在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。例如:在所 述Java卡汇编文件中有条普通指令,其调用本地函数X,具体为:Invokespecial+本地函数 X。在经过链接过程后,将在链接文件中形成所述本地函数X的本地函数链接关系,具体为 invokenative+n。其中,n是所述本地函数X的索引值,其值的多少视链接时本地函数X的 位置而定。
[0043] 步骤203:利用所述本地函数链接关系,调用所述本地函数。
[0044] 具体地说,根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本 地函数并直接执行。
[0045] 现有技术的链接过程,对本地函数和java卡普通函数不加以区分,本地函数的调 用指令可以是invokevirtual、invokespecial、invokestatic三条指令,执行过程也与普 通函数没有区别。本发明中,针对本地函数的调用扩展了新指令invokenative,将本地函数 的执行与普通java函数区分开来,使java卡虚拟机的效率得到了很大提升。
[0046] 此外,现有技术中,本地函数的存储也和普通函数没有区别,都存在于包中的函数 组件中,在函数组件中,本地函数和普通函数根据函数头信息进行区分。这样的存储方式, 由于本地函数没有实际的内容,只是存储一份函数头信息,以标识本地函数类型和其索引 值,因而导致了存储空间的浪费。例如,未采用本发明时,掩膜文件的本地函数信息如下:
[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] 而采用本发明时,掩膜文件中不含有上述本地函数信息,因此节省了存储空间。
[0056] 本发明不需要存储本地函数头信息,函数的信息已经在调用方法时进行了存储, 例如,在掩膜文件中含有如下信息:INV0KENATIVE,0x00,0x7C。INV0KENATIVE指令的后续 两字节即为存储的调用方法索引信息,因此能够节省Java卡的存储空间。
[0057] 图3是本发明提供的Java卡虚拟机中本地函数的调用装置框图,如图3所示,包 括解析模块、判断模块、处理模块和调用模块。其中:
[0058] 所述解析模块,用于通过对所述Java卡汇编文件进行解析,得到普通指令 (invok
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1