CN105005497A - 一种Java卡虚拟机中本地函数的调用方法及装置 - Google Patents
一种Java卡虚拟机中本地函数的调用方法及装置 Download PDFInfo
- Publication number
- CN105005497A CN105005497A CN201410156084.8A CN201410156084A CN105005497A CN 105005497 A CN105005497 A CN 105005497A CN 201410156084 A CN201410156084 A CN 201410156084A CN 105005497 A CN105005497 A CN 105005497A
- Authority
- CN
- China
- Prior art keywords
- function
- local function
- java card
- local
- calling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种Java卡虚拟机中本地函数的调用方法及装置,涉及Java卡虚拟机系统,所述方法包括:对已生成的Java卡汇编文件中是否含有本地函数进行判断;若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系;利用所述本地函数链接关系,调用所述本地函数。本发明不仅可以提高Java卡虚拟机执行本地函数的效率,而且还可以节省Java卡的存储空间。
Description
技术领域
本发明涉及Java卡虚拟机系统,特别涉及一种Java卡虚拟机中本地函数的调用方法及相关的装置。
背景技术
Java卡虚拟机中本地函数是指用native关键字修饰的函数,其实现不采用Java代码语言。由于Java卡虚拟机是一个虚拟的计算机,其具有独立的指令集和堆栈,但只依靠其自身的指令集系统,无法直接访问智能卡芯片的硬件资源,为此,Java卡虚拟机使用了本地函数来扩展其功能。
Java卡虚拟机对于本地函数的调用与其他函数(以下称为普通函数)没有区别,在Java卡虚拟机规范中涉及函数的调用指令共有四条:invokestatic、invokespecial、invokevirtual、invokeinterface。对于本地函数的调用,同样需要这四条调用指令(以下称为普通指令)完成。其中,invokestatic指令用于调用Java卡虚拟机中的静态函数,invokespecial指令用于调用父类函数、私有函数和实例初始化函数,invokevirtual指令用于调用实例函数,invokeinterface用于调用接口函数。
图1是目前本地函数的执行过程框图,如图1所示,上述四条调用指令都带一个调用参数,这个参数代表Java卡中常量池信息,而常量池信息用于定位目标函数的位置信息,在Java卡虚拟机执行过程中,根据常量池信息定位到目标函数的位置,然后根据目标函数的内容进行执行。该技术应用于Java卡虚拟机系统的研发阶段,对Java卡虚拟机系统中的函数调用方式的处理。
在Java卡虚拟机技术规范中,Java卡本地函数和普通函数没有区别,都需要根据调用指令的参数值,去定位参数指定的常量池信息,再根据常量池信息定位目标函数的位置,进而执行目标函数的内容。这必然导致本地函数执行效率的低下。
发明内容
本发明的目的在于提供一种Java卡虚拟机中本地函数的调用方法及装置,能更好地解决本地函数执行效率低的问题。
根据本发明的一个方面,提供了一种Java卡虚拟机中本地函数的调用方法,包括:
对已生成的Java卡汇编文件中是否含有本地函数进行判断;
若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系;
利用所述本地函数链接关系,调用所述本地函数。
优选地,在所述的对已生成的Java卡汇编文件中是否含有本地函数进行判断的步骤之前,还包括:
通过对所述Java卡汇编文件进行解析,得到普通指令、函数、函数的位置。
优选地,所述的对已生成的Java卡汇编文件中是否含有本地函数进行判断的步骤具体为:
判断所述Java卡汇编文件中的函数是否已用native关键字进行声明;
若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将所述函数确定为普通函数。
优选地,所述的将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系的步骤具体为:
将所述普通指令替换为用来直接调用所述本地函数的专用指令;
在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。
优选地,所述的利用所述本地函数链接关系,调用所述本地函数的步骤具体为:
根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直接执行。
根据本发明的另一方面,提供了一种Java卡虚拟机中本地函数的调用装置,包括:
判断模块,用于对已生成的Java卡汇编文件中是否含有本地函数进行判断;
处理模块,若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系;
调用模块,用于利用所述本地函数链接关系,调用所述本地函数。
优选地,还包括:
解析模块,用于通过对所述Java卡汇编文件进行解析,得到普通指令、函数、函数的位置。
优选地,所述判断模块判断所述Java卡汇编文件中的函数是否已用native关键字进行声明,若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将所述函数确定为普通函数。
优选地,所述处理模块将所述普通指令替换为用来直接调用所述本地函数的专用指令,并在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。
优选地,所述调用模块根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直接执行。
与现有技术相比较,本发明的有益效果在于:
本发明通过将本地函数和普通函数进行区分,使本地函数的调用不再需要根据常量池信息进行定位,省去了搜索过程,从而使本地函数可以直接执行,提高了Java卡虚拟机执行的效率。
附图说明
图1是现有技术提供的本地函数的执行过程框图;
图2是本发明提供的Java卡虚拟机中本地函数的调用方法框图;
图3是本发明提供的Java卡虚拟机中本地函数的调用装置框图;
图4是本发明实施例提供的掩膜文件生成过程示意图;
图5是本发明实施例提供的本地函数调用流程图。
具体实施方式
以下结合附图对本发明的优选实施例进行详细说明,应当理解,以下所说明的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
图2是本发明提供的Java卡虚拟机中本地函数的调用方法框图,如图2所示,步骤包括:
步骤201:对已生成的Java卡汇编文件中是否含有本地函数进行判断。
在执行所述步骤201之前,对所述Java卡汇编文件进行解析,得到普通指令、函数、函数的位置。然后,对所述Java卡汇编文件中的函数是否已用native关键字声明进行判断,若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将所述函数确定为普通函数。
步骤202:若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系。
具体地说,首先将所述普通指令替换为用来直接调用所述本地函数的专用指令,也就是说,本发明将本地函数的调用与Java卡普通函数的调用进行了区分,根据本地函数的特点,将本地函数调用进行了指令扩展,即使用专用指令invokenative对本地函数进行调用。然后在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。例如:在所述Java卡汇编文件中有条普通指令,其调用本地函数X,具体为:Invokespecial+本地函数X。在经过链接过程后,将在链接文件中形成所述本地函数X的本地函数链接关系,具体为invokenative+n。其中,n是所述本地函数X的索引值,其值的多少视链接时本地函数X的位置而定。
步骤203:利用所述本地函数链接关系,调用所述本地函数。
具体地说,根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直接执行。
现有技术的链接过程,对本地函数和java卡普通函数不加以区分,本地函数的调用指令可以是invokevirtual、invokespecial、invokestatic三条指令,执行过程也与普通函数没有区别。本发明中,针对本地函数的调用扩展了新指令invokenative,将本地函数的执行与普通java函数区分开来,使java卡虚拟机的效率得到了很大提升。
此外,现有技术中,本地函数的存储也和普通函数没有区别,都存在于包中的函数组件中,在函数组件中,本地函数和普通函数根据函数头信息进行区分。这样的存储方式,由于本地函数没有实际的内容,只是存储一份函数头信息,以标识本地函数类型和其索引值,因而导致了存储空间的浪费。例如,未采用本发明时,掩膜文件的本地函数信息如下:
/*method0x00003214:0x001b:public static native
javacard/framework/service/RMINativeMethods/rmi_invoker_void(IS[BB)V*/
0x20,
0x18,
/*method0x00003216:0x001d:public static native
javacard/framework/service/RMINativeMethods/rmi_invoker_boolean(IS[BB)Z*/
0x20,
0x19,
而采用本发明时,掩膜文件中不含有上述本地函数信息,因此节省了存储空间。
本发明不需要存储本地函数头信息,函数的信息已经在调用方法时进行了存储,例如,在掩膜文件中含有如下信息:INVOKENATIVE,0x00,0x7C。INVOKENATIVE指令的后续两字节即为存储的调用方法索引信息,因此能够节省Java卡的存储空间。
图3是本发明提供的Java卡虚拟机中本地函数的调用装置框图,如图3所示,包括解析模块、判断模块、处理模块和调用模块。其中:
所述解析模块,用于通过对所述Java卡汇编文件进行解析,得到普通指令(invokevirtual/invokespecial/invokestatic)、函数(普通函数/本地函数)、函数的位置。
所述判断模块,用于对已生成的Java卡汇编文件中是否含有本地函数进行判断。Java卡虚拟机中本地函数是指用native关键字修饰的函数,因此,所述判断模块通过判断所述Java卡汇编文件中的函数是否已用native关键字进行声明,确定所述Java卡汇编文件中是否含有本地函数。具体地说,如果所述函数已用native关键字进行声明,那么将所述函数确定为本地函数,否则将所述函数确定为普通函数。
所述处理模块,若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系。具体地说,所述处理模块将所述普通指令替换为用来直接调用所述本地函数的专用指令,然后在所述专用指令之后,加上用来指示所述本地函数的位置的索引值。例如在所述Java卡汇编文件中有条普通指令,其调用本地函数Y,具体为:invokespecial+本地函数Y。在经过链接过程后,将在链接文件中形成所述本地函数Y的本地函数链接关系,具体为invokenative+m。其中,m是所述本地函数Y的索引值,其值的多少视链接时本地函数Y的位置而定。
所述调用模块,用于利用所述本地函数链接关系,调用所述本地函数。具体地说,所述调用模块根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直接执行。例如,当使用invokenative调用本地函数Y时,利用所述索引值m,找到本地函数Y,然后直接执行所述本地函数Y。
本发明所述装置与现有技术相比,具有执行效率更高,存储空间更节省等优点。
本发明将本地函数的调用与Java卡普通函数的调用进行区分,根据本地函数的特点,将本地函数调用进行了指令扩展。在生成Java代码时,将本地函数的调用过程直接用新指令进行了替换。图4是本发明实施例提供的掩膜文件生成过程示意图,如图4所示,具体执行流程如下:
步骤一:编写java代码。
编写含有本地函数的java代码,此过程如普通Java语言的编程没有区别,本地函数用native关键字进行声明。
具体地,在编辑器中编写“.java”源文件,然后在源文件里编写类和方法(即函数)代码。示例如下:
//源文件:HelloWorld.java
public class HelloWorld
{
//native方法
public native void methodNative1();
//普通java方法
public void methodNormal1();
}
所述methodNative1用native关键字修饰,为native方法(即本地函数),methodNormal1无native关键字修饰,为普通java方法(即普通函数)。
步骤二:编译java代码。
用通用java语言编译器对java源文件进行编译,生成class文件。所述class文件用于存储java虚拟机可执行的java字节码。
Java语言编译器不对本地函数和普通函数进行区别,都生成class文件。
步骤三:生成jca文件。
利用converter工具,将步骤二中生成的class文件进行转换,生成jca文件。所述jca文件是java卡汇编文件,用于存放java卡可执行的字节码信息,包括所述jca文件的包AID、导入其他的包信息、常量池信息,类信息及方法信息。所述jca文件是CAP文件的另一种表现形式,cap文件是java卡应用文件。
步骤四:链接jca文件。
将输入的所有jca文件进行链接,输出掩膜文件。在此链接过程中,将普通java函数的链接与本地函数的链接进行区分,把本地函数链接成新指令加本地函数索引值的形式。具体链接过程如下:
1、解析jca文件,分析并记录invokevirtual+函数,invokespecial+函数,invokestatic+函数在jca文件中的位置信息;
2、解析上述三条指令后跟的方法是否为本地方法(本地方法在jca文件中以native关键字进行区分),并记录其位置信息。
3、将上述记录的调用本地函数的指令invokevirtual/invokespecial/invokestatic用自定义的invokenative专用指令进行替换。例如:
在jca文件中有条指令:invokestatic本地方法Z;
在经过上述的链接过程后,将在链接文件中形成:invokenative5;
其中,5是上面本地方法Z的索引值。
图5是本发明实施例提供的本地函数调用流程图,如图5所示,步骤包括:
步骤一:Java卡虚拟机调用本地函数。
步骤二:读取所述本地函数的参数,即本地函数的索引值。
步骤三:根据所述参数直接执行本地函数。
例如本地函数X,其索引值为n,则解析invokenative+n时,取出函数索引n,再以n为参数调用本地函数X。具体实例如下:
综上所述,本发明具有以下技术效果:
1、本发明应用于Java卡虚拟机系统的研发,Java卡虚拟机是Java卡技术的核心,它是一种解释执行的虚拟机技术,其性能指标是Java卡虚拟机的重要指标之一,本发明对于提高Java卡虚拟机的性能具有重要的实用价值;
2、本发明也适用于除Java卡虚拟机之外的其他虚拟机技术,只要该虚拟机技术具有本地函数的调用需求,且本地函数调用没有采用专用指令进行处理的情况。
另外,本方法不需要存储本地函数头信息
尽管上文对本发明进行了详细说明,但是本发明不限于此,本技术领域技术人员可以根据本发明的原理进行各种修改。因此,凡按照本发明原理所作的修改,都应当理解为落入本发明的保护范围。
Claims (10)
1.一种Java卡虚拟机中本地函数的调用方法,其特征在于,包括:
对已生成的Java卡汇编文件中是否含有本地函数进行判断;
若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系;
利用所述本地函数链接关系,调用所述本地函数。
2.根据权利要求1所述的方法,其特征在于,在所述的对已生成的Java卡汇编文件中是否含有本地函数进行判断的步骤之前,还包括:
通过对所述Java卡汇编文件进行解析,得到普通指令、函数、函数的位置。
3.根据权利要求1或2所述的方法,其特征在于,所述的对已生成的Java卡汇编文件中是否含有本地函数进行判断的步骤具体为:
判断所述Java卡汇编文件中的函数是否已用native关键字进行声明;
若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将所述函数确定为普通函数。
4.根据权利要求3所述的方法,其特征在于,所述的将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系的步骤具体为:
将所述普通指令替换为用来直接调用所述本地函数的专用指令;
在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。
5.根据权利要求4所述的方法,所述的利用所述本地函数链接关系,调用所述本地函数的步骤具体为:
根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直接执行。
6.一种Java卡虚拟机中本地函数的调用装置,其特征在于,包括:
判断模块,用于对已生成的Java卡汇编文件中是否含有本地函数进行判断;
处理模块,若所述Java卡汇编文件中含有本地函数,则将所述本地函数的原有链接关系修改为能够直接执行所述本地函数的本地函数链接关系;
调用模块,用于利用所述本地函数链接关系,调用所述本地函数。
7.根据权利要求6所述的装置,其特征在于,还包括:
解析模块,用于通过对所述Java卡汇编文件进行解析,得到普通指令、函数、函数的位置。
8.根据权利要求6或7所述的装置,其特征在于,所述判断模块判断所述Java卡汇编文件中的函数是否已用native关键字进行声明,若所述函数已用native关键字进行声明,则将所述函数确定为本地函数,否则将所述函数确定为普通函数。
9.根据权利要求8所述的装置,其特征在于,所述处理模块将所述普通指令替换为用来直接调用所述本地函数的专用指令,并在所述专用指令之后,添加用来指示所述本地函数的位置的索引值。
10.根据权利要求9所述的装置,其特征在于,所述调用模块根据所述本地函数链接关系中的专用指令,找到所述索引值对应的本地函数并直接执行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410156084.8A CN105005497A (zh) | 2014-04-18 | 2014-04-18 | 一种Java卡虚拟机中本地函数的调用方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410156084.8A CN105005497A (zh) | 2014-04-18 | 2014-04-18 | 一种Java卡虚拟机中本地函数的调用方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105005497A true CN105005497A (zh) | 2015-10-28 |
Family
ID=54378177
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410156084.8A Pending CN105005497A (zh) | 2014-04-18 | 2014-04-18 | 一种Java卡虚拟机中本地函数的调用方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105005497A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105389221A (zh) * | 2015-11-11 | 2016-03-09 | 上海斐讯数据通信技术有限公司 | 一种信号处理方法及系统 |
CN105426239A (zh) * | 2015-11-03 | 2016-03-23 | 大唐微电子技术有限公司 | 一种在Java卡中实现本地方法调用的方法及装置 |
CN109993261A (zh) * | 2017-12-29 | 2019-07-09 | 国民技术股份有限公司 | 一种智能卡、应用实现方法、装置及计算机可读存储介质 |
CN112905271A (zh) * | 2021-03-04 | 2021-06-04 | 上海升途智能系统有限公司 | 一种应用程序接口api的调用方法、装置及电子设备 |
CN115309405A (zh) * | 2022-08-24 | 2022-11-08 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101231597A (zh) * | 2008-02-01 | 2008-07-30 | 东信和平智能卡股份有限公司 | 智能卡中java程序指令的执行方法 |
CN101751247A (zh) * | 2008-11-28 | 2010-06-23 | 爱思开电讯投资(中国)有限公司 | 一种基于标准工具生成Java Card程序库目标代码的方法和设备 |
CN102023885A (zh) * | 2010-12-17 | 2011-04-20 | 北京握奇数据系统有限公司 | 一种存储Java卡运行时环境字节码的方法及系统 |
-
2014
- 2014-04-18 CN CN201410156084.8A patent/CN105005497A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101231597A (zh) * | 2008-02-01 | 2008-07-30 | 东信和平智能卡股份有限公司 | 智能卡中java程序指令的执行方法 |
CN101751247A (zh) * | 2008-11-28 | 2010-06-23 | 爱思开电讯投资(中国)有限公司 | 一种基于标准工具生成Java Card程序库目标代码的方法和设备 |
CN102023885A (zh) * | 2010-12-17 | 2011-04-20 | 北京握奇数据系统有限公司 | 一种存储Java卡运行时环境字节码的方法及系统 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105426239A (zh) * | 2015-11-03 | 2016-03-23 | 大唐微电子技术有限公司 | 一种在Java卡中实现本地方法调用的方法及装置 |
CN105389221A (zh) * | 2015-11-11 | 2016-03-09 | 上海斐讯数据通信技术有限公司 | 一种信号处理方法及系统 |
CN109993261A (zh) * | 2017-12-29 | 2019-07-09 | 国民技术股份有限公司 | 一种智能卡、应用实现方法、装置及计算机可读存储介质 |
CN112905271A (zh) * | 2021-03-04 | 2021-06-04 | 上海升途智能系统有限公司 | 一种应用程序接口api的调用方法、装置及电子设备 |
CN115309405A (zh) * | 2022-08-24 | 2022-11-08 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
CN115309405B (zh) * | 2022-08-24 | 2023-08-04 | 北京熵核科技有限公司 | 一种代码链接优化方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Kim et al. | ScanDal: Static analyzer for detecting privacy leaks in android applications | |
CN111770113A (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
US20140040860A1 (en) | Efficient and Expansive Conversions Between Reference and Primitive | |
CN108733988A (zh) | 安卓平台上可执行程序的保护方法 | |
EP3134808A1 (en) | Metadata-driven dynamic specialization | |
CN102455931B (zh) | 一种Android平台工程的开发方法及系统 | |
CN105005497A (zh) | 一种Java卡虚拟机中本地函数的调用方法及装置 | |
CN107193577A (zh) | 一种应用启动方法、装置和智能终端 | |
CN104298534B (zh) | 基于Lua语言的编程方法和装置 | |
CN110059456B (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
US20110252409A1 (en) | Methods and systems to implement non-abi conforming features across unseen interfaces | |
CN103838572A (zh) | 一种安卓开发包的打包系统和方法 | |
CN108469955B (zh) | 一种基于注解的Android注入框架实现方法 | |
CN107402792B (zh) | 应用软件安装包的集成方法、装置、设备及存储介质 | |
WO2018032653A1 (zh) | 一种Java卡应用的功能实现方法及装置 | |
CN111966357A (zh) | 一种操作系统应用编译方法、装置及电子设备 | |
CN104965687A (zh) | 基于指令集生成的大数据处理方法及装置 | |
WO2018001041A1 (zh) | 接口实现方法、装置、机顶盒及存储介质 | |
CN110333872B (zh) | 一种应用的处理方法、装置、设备和介质 | |
CN111782334B (zh) | 一种动态链接库文件虚拟化方法、存储介质及终端设备 | |
CN103902890A (zh) | 一种Android程序行为的监控方法及监控系统 | |
CN107391099B (zh) | 一种资源预处理方法及装置 | |
CN111158665B (zh) | 代码生成方法及装置、电子设备和存储介质 | |
CN111381816A (zh) | 应用程序的获取方法、装置、设备及存储介质 | |
CN110018831B (zh) | 程序处理方法、装置及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20151028 |