一种Java本地接口一致性检查方法及系统、存储介质及终端转让专利

申请号 : CN201910497314.X

文献号 : CN110275710A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王全福张璐波谢巍盛马骏杰

申请人 : 天翼电子商务有限公司

摘要 :

本发明提供一种Java本地接口一致性检查方法及系统、存储介质及终端,包括以下步骤:在编译阶段引入记录函数的JNI参数信息的插件;在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息;JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。本发明的Java本地接口一致性检查方法及系统、存储介质及终端,在Native库链接阶段由JVM检查Native库中的symbol的完整信息,以确保Java声明中的接口与Native中的实现完全一致,并在不一致的情况下,立即抛出异常,从而避免出现不可预知的行为。

权利要求 :

1.一种Java本地接口一致性检查方法,其特征在于,包括以下步骤:在编译阶段引入记录函数的JNI参数信息的插件;

在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息;

JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。

2.根据权利要求1所述的Java本地接口一致性检查方法,其特征在于:当Native中的JNI参数信息和Java中的JNI参数信息不一致时,立即抛出异常。

3.根据权利要求1所述的Java本地接口一致性检查方法,其特征在于:还包括建立基于函数名到JNI参数信息的索引,以在JNI动态链接过程中根据函数名获取对应的Native中的JNI参数信息。

4.根据权利要求1所述的Java本地接口一致性检查方法,其特征在于:还包括在Native库中增加一个段,并将所述JNI参数信息记录到所述段中。

5.一种Java本地接口一致性检查系统,其特征在于,包括引入模块、修改模块和检查模块;

所述引入模块用于在编译阶段引入记录函数的JNI参数信息的插件;

所述修改模块用于在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息;

所述检查模块用于JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。

6.根据权利要求5所述的Java本地接口一致性检查方法,其特征在于:所述检测模块还用于当Native中的JNI参数信息和Java中的JNI参数信息不一致时,立即抛出异常。

7.根据权利要求5所述的Java本地接口一致性检查方法,其特征在于:所述引入模块还用于建立基于函数名到JNI参数信息的索引,以在JNI动态链接过程中根据函数名获取对应的Native中的JNI参数信息。

8.根据权利要求5所述的Java本地接口一致性检查方法,其特征在于:所述修改模块还用于在Native库中增加一个段,并将所述JNI参数信息记录到所述段中。

9.一种存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1至4中任一项所述的Java本地接口一致性检查方法。

10.一种终端,其特征在于,包括处理器及存储器;

所述存储器用于存储计算机程序;

所述处理器用于执行所述存储器存储的计算机程序,以使所述终端执行权利要求1至4中任一项所述的Java本地接口一致性检查方法。

说明书 :

一种Java本地接口一致性检查方法及系统、存储介质及终端

技术领域

[0001] 本发明涉及IT的技术领域,特别是涉及一种Java本地接口一致性检查方法及系统、存储介质及终端。

背景技术

[0002] Java本地接口(Java Native Interface,JNI)是一种编程框架,提供了若干的应用程序编程接口(Application Programming Interface,API)实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是并不妨碍使用其他编程语言,只要调用约定受支持就可以。使用Java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java虚拟机环境。
[0003] 具体地,Java程序通过JNI可以调用Native程序,反之亦然。Native程序通常由C/C++或者汇编语言编写而成,这使得联合Java与C/C++/ASM等多语言开发成为可能。很多时候都需要诉诸于JNI,例如想在JAVA层面去控制硬件,或者使用一些Native算法优化库,甚至是有时候是需要直接访问底层操作系统的一些服务。
[0004] 具体地,JNI的示例如下:
[0005]
[0006]
[0007] 由上可知,Native部分包含一个头文件与一个实现文件,Java部分包含接口的声明,Native库的加载与调用。
[0008] 由于Java代码与Native代码分开编译、打包或链接。如果发生了Native接口实现与Java声明接口之间不一致的问题,则没有办法在编译阶段发现这个问题。
[0009] 更可怕的是,对于C语言实现的JNI来说,即使在Native库加载过程中也没有办法发现此问题。这会导致在程序运行过程中出现不可预料的问题。
[0010] 现有技术中缺乏有效的JNI一致性检查方案。通常的做法是在Java中声明Native方法,然后利用Javah等工具生成Native code头文件,Native引用该头文件并按照接口定义进行实现,然后让Native code编译器识别接口不一致的现象。上述做法可以一定程度上避免JNI不一致的问题。但是,很多时候开发者并不会按照这个开发流程进行开发,甚至很多开发者完全手动开发Native。由于编码上的失误与测试上的不严密,导致这种不一致的JNI被部属,直到运行时发生不确定的行为。

发明内容

[0011] 鉴于以上所述现有技术的缺点,本发明的目的在于提供一种Java本地接口一致性检查方法及系统、存储介质及终端,在Native库链接阶段由Java虚拟机(Java Virtual Machine,JVM)检查Native库中的symbol的完整信息,以确保Java声明中的接口与Native中的实现完全一致,并在不一致的情况下,立即抛出异常,从而避免出现不可预知的行为。
[0012] 为实现上述目的及其他相关目的,本发明提供一种Java本地接口一致性检查方法,包括以下步骤:在编译阶段引入记录函数的JNI参数信息的插件;在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息;JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。
[0013] 于本发明一实施例中,当Native中的JNI参数信息和Java中的JNI参数信息不一致时,立即抛出异常。
[0014] 于本发明一实施例中,还包括建立基于函数名到JNI参数信息的索引,以在JNI动态链接过程中根据函数名获取对应的Native中的JNI参数信息。
[0015] 于本发明一实施例中,还包括在Native库中增加一个段,并将所述JNI参数信息记录到所述段中。
[0016] 对应地,本发明提供一种Java本地接口一致性检查系统,包括引入模块、修改模块和检查模块;
[0017] 所述引入模块用于在编译阶段引入记录函数的JNI参数信息的插件;
[0018] 所述修改模块用于在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息;
[0019] 所述检查模块用于JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。
[0020] 于本发明一实施例中,所述检测模块还用于当Native中的JNI参数信息和Java中的JNI参数信息不一致时,立即抛出异常。
[0021] 于本发明一实施例中,所述引入模块还用于建立基于函数名到JNI参数信息的索引,以在JNI动态链接过程中根据函数名获取对应的Native中的JNI参数信息。
[0022] 于本发明一实施例中,所述修改模块还用于在Native库中增加一个段,并将所述JNI参数信息记录到所述段中。
[0023] 本发明提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的Java本地接口一致性检查方法。
[0024] 最后,本发明提供一种终端,包括处理器及存储器;
[0025] 所述存储器用于存储计算机程序;
[0026] 所述处理器用于执行所述存储器存储的计算机程序,以使所述终端执行上述的Java本地接口一致性检查方法。
[0027] 如上所述,本发明的Java本地接口一致性检查方法及系统、存储介质及终端,具有以下有益效果:
[0028] (1)在Native库链接阶段由JVM检查Native库中的symbol的完整信息,以确保Java声明中的接口与Native中的实现完全一致;
[0029] (2)在运行时对JNI一致性进行准确的检查,并在Java声明中的接口与Native中的实现不一致的情况下,立即抛出异常,完全可以避免由于JNI不一致所引起的程序不确定性行为。

附图说明

[0030] 图1显示为本发明的Java本地接口一致性检查方法于一实施例中的流程图;
[0031] 图2显示为本发明的Java本地接口一致性检查系统于一实施例中的结构示意图;
[0032] 图3显示为本发明的终端于一实施例中的结构示意图。
[0033] 组件标号说明
[0034] 21                     引入模块
[0035] 22                     修改模块
[0036] 23                     检查模块
[0037] 31                     处理器
[0038] 32                     存储器

具体实施方式

[0039] 以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
[0040] 本发明的Java本地接口一致性检查方法及系统、存储介质及终端在Java系统的Native库链接阶段由JVM检查Native库中的symbol的完整信息,以确保Java声明中的接口与Native中的实现完全一致,并在不一致的情况下,立即抛出异常,从而避免出现不可预知的行为,保证了系统运行的稳定性。
[0041] 如图1所示,于一实施例中,本发明的Java本地接口一致性检查方法包括以下步骤:
[0042] 步骤S1、在编译阶段引入记录函数的JNI参数信息的插件。
[0043] 具体地,JNI的链接过程中,JVM会先查找symbol对应的JNI实现。对于C++来说,其symbol是mangling name,其由编译器根据函数名和参数信息生成,这本身已经包含了参数信息,所以可以确保在symbol查找成功的情况下JNI的一致性。而对于C语言来说,其编译器并不会由参数信息产生mangling name。因此,本发明在C编译阶段引入插件。该插件可以记录函数的JNI参数信息,并建立基于函数名到JNI参数信息的索引。
[0044] 步骤S2、在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息。
[0045] 于本发明一实施例中,由所述插件对生成的Native库进行修改时,在Native库中增加一个段,并将所述JNI参数信息记录到所述段中。
[0046] 步骤S3、JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。
[0047] 具体地,在JNI动态链接过程中,首先基于函数名到JNI参数信息的索引,在JNI动态链接过程中根据函数名获取对应的Native中的JNI参数信息;然后比较Native中的JNI参数信息和Java中的JNI参数信息是否一致。其中,当二者一致时,通过JNI动态链接;当二者不一致时,立即抛出异常,从而避免由于JNI不一致所引起的程序不确定性行为。
[0048] 如图2所示,于一实施例中,本发明的Java本地接口一致性检查系统包括引入模块21、修改模块22和检查模块23。
[0049] 引入模块21用于在编译阶段引入记录函数的JNI参数信息的插件。
[0050] 具体地,JNI的链接过程中,JVM会先查找symbol对应的JNI实现。对于C++来说,其symbol是mangling name,其由编译器根据函数名和参数信息生成,这本身已经包含了参数信息,所以可以确保在symbol查找成功的情况下JNI的一致性。而对于C语言来说,其编译器并不会由参数信息产生mangling name。因此,本发明在C编译阶段引入插件。该插件可以记录函数的JNI参数信息,并建立基于函数名到JNI参数信息的索引。
[0051] 修改模块22与引入模块21相连,用于在Native库生成过程中,由所述插件对生成的Native库进行修改,以使所述Native库中增加所述JNI参数信息。
[0052] 于本发明一实施例中,由所述插件对生成的Native库进行修改时,在Native库中增加一个段,并将所述JNI参数信息记录到所述段中。
[0053] 检查模块23与修改模块22相连,用于JVM运行时,在JNI动态链接过程中,比较Native中的JNI参数信息和Java中的JNI参数信息是否一致,并在一致时通过所述JNI动态链接。
[0054] 具体地,在JNI动态链接过程中,首先基于函数名到JNI参数信息的索引,在JNI动态链接过程中根据函数名获取对应的Native中的JNI参数信息;然后比较Native中的JNI参数信息和Java中的JNI参数信息是否一致。其中,当二者一致时,通过JNI动态链接;当二者不一致时,立即抛出异常,从而避免由于JNI不一致所引起的程序不确定性行为。
[0055] 需要说明的是,应理解以上装置的各个模块的划分仅仅是一种逻辑功能的划分,实际实现时可以全部或部分集成到一个物理实体上,也可以物理上分开。且这些模块可以全部以软件通过处理组件调用的形式实现;也可以全部以硬件的形式实现;还可以部分模块通过处理组件调用软件的形式实现,部分模块通过硬件的形式实现。例如,x模块可以为单独设立的处理组件,也可以集成在上述装置的某一个芯片中实现,此外,也可以以程序代码的形式存储于上述装置的存储器中,由上述装置的某一个处理组件调用并执行以上x模块的功能。其它模块的实现与之类似。此外这些模块全部或部分可以集成在一起,也可以独立实现。这里所述的处理组件可以是一种集成电路,具有信号的处理能力。在实现过程中,上述方法的各步骤或以上各个模块可以通过处理器组件中的硬件的集成逻辑电路或者软件形式的指令完成。
[0056] 例如,以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(Application Specific Integrated Circuit,简称ASIC),或,一个或多个微处理器(Digital Singnal Processor,简称DSP),或,一个或者多个现场可编程门阵列(Field Programmable Gate Array,简称FPGA)等。再如,当以上某个模块通过处理组件调度程序代码的形式实现时,该处理组件可以是通用处理器,例如中央处理器(Central Processing Unit,简称CPU)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一起,以片上系统(system-on-a-chip,简称SOC)的形式实现。
[0057] 本发明的存储介质上存储有计算机程序,该程序被处理器执行时实现上述的Java本地接口一致性检查方法。所述存储介质包括:ROM、RAM、磁盘、U盘、存储卡或者光盘等各种可以存储程序代码的介质。
[0058] 如图3所示,于一实施例中,本发明的终端包括:处理器31及存储器32。
[0059] 所述存储器32用于存储计算机程序。
[0060] 所述存储器32包括:ROM、RAM、磁盘、U盘、存储卡或者光盘等各种可以存储程序代码的介质。
[0061] 所述处理器31与所述存储器32相连,用于执行所述存储器32存储的计算机程序,以使所述终端执行上述的Java本地接口一致性检查方法。
[0062] 优选地,所述处理器31可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(Digital Signal Processor,简称DSP)、专用集成电路(Application Specific Integrated Circuit,简称ASIC)、现场可编程门阵列(Field Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
[0063] 综上所述,本发明的Java本地接口一致性检查方法及系统、存储介质及终端在Native库链接阶段由JVM检查Native库中的symbol的完整信息,以确保Java声明中的接口与Native中的实现完全一致;在运行时对JNI一致性进行准确的检查,并在Java声明中的接口与Native中的实现不一致的情况下,立即抛出异常,完全可以避免由于JNI不一致所引起的程序不确定性行为。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
[0064] 上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。