一种动态库的代理方法及设备与流程

文档序号:14990125发布日期:2018-07-20 22:03阅读:140来源:国知局

本发明涉及计算机领域,更具体地,涉及一种动态库的代理方法及设备。



背景技术:

java语言中,java代码经过编译成字节码之后运行于java虚拟机(javavirtualmachine)。但因为java虚拟机是加在当前主机操作系统上的,java字节码执行速度目前要会比本机运行慢,会导致程序的性能下降,并且为保证安全性,java虚拟机中包含了安全沙箱,限制了不被信任的代码不能访问重要的系统资源,只能访问沙箱内提供的有限资源,也使得单纯java语言能实现的功能受到限制。所以java平台中引入了jni(javanativeinterface),jni提供若干的应用程序接口实现java与其他语言通信(主要是c/c++),允许java代码与其他语言写的代码进行交互,扩展java的功能和解决性能问题。

而jni一般使用c/c++编写,编译成动态库,在windows中表现为dll文件(dynamiclinklibrary,动态链接库),在linux中表现为so文件(sharedobject,共享对象)。在java中调用jni的接口,需要将java函数使用native修饰符修饰,java虚拟机加载jni动态库之后,通常使用两种方式将jni动态库中的函数与java中的函数关联(即函数注册):

一种是静态注册方法,由java虚拟机在jni动态库中,导出与待注册函数对应的符合约定格式的函数名(例如,常见的jni函数名格式为:java_包名_类名_函数名),从而建立java函数与jni函数的关联;

一种是动态注册方法,通过jni提供的接口,将预置的java函数与jni函数的关联关系(或映射关系)注册给java虚拟机(常见的方法使用jni中registernatives函数实现:(*env)->registernatives(env,类的引用,函数描述,注册数量))。

而在加载jni动态库将jni动态库中的函数与java中的函数关联后,java函数中的代码与对应的jni动态库中函数的代码(一般为c/c++代码)需要严格匹配,因此,当java函数中的代码被修改(例如函数名被修改),与之对应的jni动态库中函数的c/c++代码也需要随之修改。

但是发明人发现,现有技术中java语言编程开发中,存在将java函数中的代码修改后,无法修改对应的jni动态库中函数代码的问题,导致这个问题出现的原因可能有多种:例如,jni动态库由他方(非java程序开放方)提供不支持修改,又例如,jni动态库编译上下文复杂,互相依赖过多,很难实现修改,或者例如,jni动态库的源代码已经丢失无法再修改重新编译,还有可能jni动态库重新开放成本比较高修改代价太大。

因此,发明人认为,有必要针对上述现有技术存在的问题进行改进。



技术实现要素:

本发明的一个目的是提供一种用于代理动态库的新技术方案。

根据本发明的第一方面,提供了一种动态库的代理方法,其特征在于,所述动态库中包含与第一函数关联的第二函数,所述方法包括:

获取被修改的第一函数的修改信息,所述修改信息至少包含所述第一函数的被修改前的接口信息和被修改后的接口信息;

根据所述第一函数的修改信息以及所述第二函数的函数信息,生成用于代理所述第二函数与所述第一函数关联的代理函数。

在另一个实施例中,所述根据所述第一函数的修改信息以及所述第二函数的函数信息,生成用于代理所述第二函数与所述第一函数关联的代理函数的步骤,包括:

根据所述第一函数的修改信息,生成第一函数的修改映射表,所述修改映射表用于描述修改前的第一函数与修改后的第一函数的映射关系;

根据所述修改映射表以及第二函数的函数信息,生成用于代理所述第二函数被所述第一函数调用的代理函数。

在另一个实施例中,所述动态库中包含将被修改前的所述第一函数与所述第二函数关联的关联函数,所述根据所述第一函数的修改信息以及所述第二函数的函数信息,生成用于代理所述第二函数与所述第一函数关联的代理函数的步骤,包括:

根据所述第一函数的修改信息以及所述关联函数中用于关联所述第一函数与所述第二函数的关联对象,生成新的关联对象;

根据所述第二函数的信息以及所述新的关联对象,生成用于根据新的关联对象代理所述第二函数与所述第一函数关联的代理函数。

可选地,所述代理函数,还用于在所述第一函数属于非法函数时,代理所述第二函数取消与所述第一函数的关联。

可选地,所述第一函数由java语言开发且所述第二函数由c/c++语言开发。

再可选地,所述接口信息至少包括对应函数的类名和函数名。

根据本发明的第二方面,还提出一种动态库代理设备,所述动态库中包含与第一函数关联的第二函数,所述代理设备包括:

信息获取单元,用于获取被修改的第一函数的修改信息,所述修改信息至少包含所述第一函数的被修改前的接口信息和被修改后的接口信息;

函数生成单元,用于根据所述第一函数的修改信息以及所述第二函数的函数信息,生成用于代理所述第二函数与所述第一函数关联的代理函数。

在一个实施例中,所述函数生成单元包括:

用于根据所述第一函数的修改信息生成第一函数的修改映射表的装置,所述修改映射表用于描述修改前的第一函数与修改后的第一函数的映射关系;

用于根据所述修改映射表以及第二函数的函数信息,生成用于代理所述第二函数被所述第一函数调用的代理函数的装置。

在另一个实施例中,所述动态库中包含将所述第一函数与所述第二函数关联的关联函数,所述函数生成单元包括:

用于根据所述第一函数的修改信息以及所述关联函数中用于关联所述第一函数与所述第二函数的关联对象生成新的关联对象的装置;

用于根据所述第二函数的信息以及所述新的关联对象生成用于根据新的关联对象代理所述第二函数与所述第一函数关联的代理函数的装置。

可选地,所述代理函数,还用于在所述第一函数非法时代理所述第二函数取消与所述第一函数的关联。

本发明的发明人发现,在现有技术中,尚未提出一种动态库的代理方法及设备,可以在某个第一函数被修改后,无需修改与第一函数关联的动态库中的第二函数,实现第二函数与修改后的第一函数中匹配,使得该动态库可以正常工作。因此,本发明所要实现的技术任务或者所要解决的技术问题是本领域技术人员从未想到的或者没有预期到的,故本发明是一种新的技术方案。

通过以下参照附图对本发明的示例性实施例的详细描述,本发明的其它特征及其优点将会变得清楚。

附图说明

被结合在说明书中并构成说明书的一部分的附图示出了本发明的实施例,并且连同其说明一起用于解释本发明的原理。

图1是显示可用于实现本发明的实施例的计算系统的硬件配置的例子的框图。

图2示出了本发明的实施例的动态库代理方法的一个流程图。

图3示出了本发明的实施例的动态库代理方法的又一个流程图。

图4示出了本发明的实施例的动态库代理方法的另一个流程图。

图5示出了本发明的实施例的动态库代理方法的一个例子的示意图。

图6示出了本发明的实施例的动态库代理设备的示意性框图。

具体实施方式

现在将参照附图来详细描述本发明的各种示例性实施例。应注意到:除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置、数字表达式和数值不限制本发明的范围。

以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本发明及其应用或使用的任何限制。

对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为说明书的一部分。

在这里示出和讨论的所有例子中,任何具体值应被解释为仅仅是示例性的,而不是作为限制。因此,示例性实施例的其它例子可以具有不同的值。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。

<硬件配置>

图1是显示可用于实现本发明的实施例的计算系统1000的硬件配置的例子的框图。

如图1所示,计算系统包括计算装置1110。计算装置1110包含通过系统总线1121连接的处理单元1120、系统存储器1130、不可拆卸非易失性存储器接口1140、可拆卸非易失性存储器接口1150、用户输入接口1160、网络接口1170、视频接口1190和输出外设接口1195。

系统存储器1130包含rom(只读存储器)1131和ram(随机存取存储器)1132。bios(基本输入输出系统)1133驻留于rom1131中。操作系统1134、应用程序1135、其它的程序模块1136和一些程序数据1137驻留于ram1132中。

诸如硬盘的不可拆卸非易失性存储器1141与不可拆卸非易失性存储器接口1140连接。例如,不可拆卸非易失性存储器1141可存储操作系统1144、应用程序1145、其它的程序模块1146和一些程序数据1147。

诸如软盘驱动器1151和cd-rom驱动器1155的可拆卸非易失性存储器与可拆卸非易失性存储器接口1150连接。例如,软盘可被插入软盘驱动器1151中,并且,cd(光盘)可被插入cd-rom驱动器1155中。

诸如鼠标1161和键盘1162的输入设备与用户输入接口1160连接。

计算装置1110可通过网络接口1170与远程计算装置1180连接。例如,网络接口1170可通过局域网络1171与远程计算装置1180连接。作为替代方案,网络接口1170可与调制解调器(调制器-解调器)1172连接,并且调制解调器1172通过广域网络1173与远程计算装置1180连接。

远程计算装置1180可包含存储远程应用程序1185的诸如硬盘的存储器1181。

视频接口1190与监视器1191连接。

输出外设接口1195与打印机1196和扬声器1197连接。

图1所示的计算系统仅是解释性的,并且决不是为了要限制本发明、其应用或用途。

<实施例>

本实施例中提供一种动态库的代理方法,所述动态库中包含与第一函数关联的第二函数。所述动态库(又称动态链接库,英文为dll,是dynamiclinklibrary的缩写形式),是一个包含可由多个程序同时使用的代码和数据的库,不是可执行文件。动态库可以动态链接提供一种方法,使进程可以调用不属于其可执行代码的函数。而函数的可执行代码位于一个动态库中,该动态库包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。动态库有助于共享数据和资源。多个应用程序可同时访问内存中单个动态库副本的内容。windows下动态库为.dll后缀,在linux在为.so后缀。在动态库中包含与第一函数关联的第二函数。所述第二函数是可执行代码位于动态库中的函数。所述第一函数定义在与第二函数不同的语言中。当第一函数被调用时,对应执行与该第一函数关联的第二函数的执行代码。

在一个例子中,动态库可以是jni(javanativeinterface),用于提供若干应用程序接口,实现java与其他语言通信(主要是c/c++),允许java代码与其他语言写的代码进行交互,扩展java的功能和解决性能问题。对应地,所述第一函数由java语言开发,且所述第二函数由c/c++语言开发。

本实施例中提供的一种动态库的代理方法,如图2所示,所述方法包括:

步骤s2100,获取被修改的第一函数的修改信息,所述修改信息至少包含所述第一函数的被修改前的接口信息和被修改后的接口信息。

在开发过程中,第一函数会因为应用场景的需求或者功能实现的目的被修改。例如,第一函数为java虚拟机中的系统函数(java语言开发的函数)。系统函数被修改的部分包括系统函数的接口,例如,类名或者函数名的改变。在一个例子中,接口信息至少包括对应函数的类名和函数名。对应的,第一函数的修改信息包括被修改前的类名和函数名,以及被修改后的类名和函数名。例如,第一函数被修改前为hello.world.say(),被修改为hello.earth.speak(),则第一函数的修改信息包括:修改前的类名为hello.world、函数名为say,修改后的类名声hello.earth、修改后函数名是speak。

在步骤s2100之后,进入步骤s2200,根据所述第一函数的修改信息以及所述第二函数的函数信息,生成用于代理所述第二函数与所述第一函数关联的代理函数。

在本实施例中,第二函数的函数信息是可以唯一标识某个第二函数以去区分该第二函数与其他第二函数的信息。在一个例子中,第二函数的函数信息可以是该第二函数的函数名和/或该第二函数的原始地址。还可以是该第二函数的函数名、类名、成员名和原始地址这四者的其一或任意组合。

通过根据第一函数的修改信息和第二函数的函数信息生成的代理函数,代理第二函数与第一函数关联。因此,在第一函数被修改后,无需对应修改第二函数,通过代理函数依然保持第一函数与第二函数的关联,保证包含第二函数的动态库的正常工作。降低修改第一函数的实现难度。此外,也降低修改第一函数带来的成本。特别是在第二函数无法修改的情况下。

例如,动态库为jni动态库,第一函数为java语言开发的函数,第二函数为c/c++语言开发的函数。就存在将第一函数的代码修改后,无法修改对应的jni动态库中第二函数代码的情况:例如,jni动态库由他方(非java程序开放方)提供不支持修改,又例如,jni动态库编译上下文复杂,互相依赖过多,很难实现修改,或者例如,jni动态库的源代码已经丢失无法再修改重新编译,还有可能jni动态库重新开放成本比较高修改代价太大。在这种情况下,应用本实施例中提供的动态库代理方法,通过代理函数,代理第二函数与第一函数关联。使得第一函数被修改后,可以无需修改第二函数,包含第二函数的动态库仍能正常工作。实现较简单。此外,实现成本较低。

在本实施例中,所述代理函数,可以包含在一个独立于包含第二函数的动态库的代理动态库中,也可以包含在扩充包含第二函数的动态库后得到的新的动态库中。本实施例中不限制代理函数的存在形式。本领域的技术人员以已有的无创造性的技术手段,获取类似本实施例的代理函数的功能的函数或者类似函数的功能形式,均在本实施例披露的范围内。

在一个例子中,步骤s2200的具体实施方法如图3所示,具体包括:

步骤s3100,根据所述第一函数的修改信息,生成第一函数的修改映射表,所述修改映射表用于描述修改前的第一函数与修改后的第一函数的映射关系。

以动态库为jni动态库,第一函数为java虚拟机的函数(java语言开发的函数),第二函数为jni动态库中的函数(c/c++语言开发的函数)为例。jni动态库中jni函数(第二函数)与java中的java函数(第一函数)的一种关联方法是静态注册方法:由java虚拟机在jni动态库中,导出与待注册的第一函数对应的符合约定格式的第二函数的函数名(例如,常见的jni函数名格式为:java_包名_类名_函数名),从而建立java函数与jni函数的关联。例如,第一函数为java函数hello.world.say(),则与其关联的第二函数为jni函数java_hello_world_say。

当第一函数hello.world.say()为hello.earth.speak(),则获取第一函数的修改信息包括:修改前的类名为hello.world以及函数名为say,修改后的类名声hello.earth以及修改后函数名是speak。则生成的修改映射表如下表表1所示。

表1

在步骤s3100之后,进入步骤s3200,根据所述修改映射表以及第二函数的函数信息,生成用于代理所述第二函数被所述第一函数调用的代理函数。

继续以步骤s3100中的例子举例说明。本例中,第二函数的函数信息可以是第二函数的函数名。根据表1以及第二函数的函数名java_hello_world_say,生成代理函数为java_hello_world_speak,该地理函数的伪代码如下:

jniexportjvoidjava_hello_earth_speek(jnienv*env){

//获取第二函数地址:

void*fn=find(“java_hello_world_say”);

//代理java虚拟机的env对象:

jnienv*proxyenv=proxy(env);

//调用第二函数函数:

fn(proxyenv);}。

在一个更具体的例子中,jni动态库中包含多个第二函数,例如,用于动态注册的函数registernatives()、通过类名获取类引用的函数findclass()、通过函数名获取函数引用的函数getmethodid()、通过成员名获取成员引用的函数getfieldid()等等,可以模仿其对应的第二函数结构创建出对应的新的jnienv对象,生成的代理函数,并使得该新的jnienv对象的第一个元素是指向第二函数,得到对应的代理函数proxy_registernatives()\proxy_findclass()\proxy_getmethodid()\proxy_getfieldid(),如图5所示。

在另一个例子中,所述动态库中包含将被修改前的所述第一函数与所述第二函数关联的关联函数,步骤s2200的具体实施方法如图4所示,具体包括:

步骤s4100,根据所述第一函数的修改信息以及所述关联函数中用于关联所述第一函数与所述第二函数的关联对象,生成新的关联对象。

以动态库为jni动态库,第一函数为java虚拟机的函数(java语言开发的函数),第二函数为jni动态库中的函数(c/c++语言开发的函数)为例。jni动态库中jni函数(第二函数)与java中的java函数(第一函数)的一种关联方法是动态注册方法:通过jni动态库提供的接口将第一函数(java函数)与第二函数(jni函数)的预先设置的关联关系注册给java虚拟机,常见的方法使用jni动态库提供的jni_onload函数调用registernatives函数实现。在本例中,将第一函数与第二函数关联的关联函数为jni动态库中的jni_onload函数(包括其中调用的registernatives函数)。通常的关联对象为第一函数的类引用、第一函数的函数名以及第一函数的成员名等。具体地,以关联对象为第一函数的类名(可获取类引用)、第一函数的函数名(可获取函数引用)为例。在本步骤中,可以根据第一函数的修改信息,获取修改后的新的关联对象:新的第一函数的类名、第一函数的函数名。

在步骤s4100之后,进入步骤s4200,根据所述第二函数的信息以及所述新的关联对象,生成用于根据新的关联对象代理所述第二函数与所述第一函数关联的代理函数。

基于以步骤s4100中的例子举例说明。本例中,第二函数的信息为第二函数的函数名。已有的关联函数jni_onload函数(包括其中调用的registernatives函数)可以将被修改前的第一函数与第二函数关联。根据新的关联对象(新的第一函数的类名、第一函数的函数名)以及第二函数的函数名,生成代理函数jni_onload(包括其中调用的proxy_registernatives函数,此函数的参数methods用于传入第二函数以及与第二函数关联的第一函数的关联关系,通过替换参数methods可以将新的第一函数与第二函数关联),伪代码如下:

jniexportjintjni_onload(javavm*vm,...){

//获取关联函数的地址:

void*fn=find(“jni_onload”);

//代理虚拟机的vm和env对象,拦截registernatives为proxy_registernatives

javavm*proxyvm=proxy(vm);

//调用关联函数

fn(proxyvm);}

voidproxy_registernatives(jnienv*proxyenv,jclassclz,methods){

jnienv*origenv=getorigianl(proxyenv);

nmethods=replace(methods);//替换新的第一函数的函数名(获取新的函数引用)

origenv->registernatives(clz,nmethods);

}

在一个更具体的例子中,jni动态库中提供通过类名获取类引用的函数findclass()、通过函数名获取函数引用的函数getmethodid()、通过成员名获取成员引用的函数getfieldid()等,在本例通过代理函数代理第二函数与第一函数关联的过程中,可以通过拦截这些函数,将对应的关联对象替换为新的关联对象。例如,拦截findclass()将类名替换为第一函数修改后的新类名,拦截getmethodid()将函数名替换为第一函数修改后的新函数名,拦截getfieldid()将成员名替换为第一函数修改后的新成员名。

上述例子示出了本实施例的生成代理第二函数与第一函数关联的代理函数的方法。在本实施例中,代理函数代理第二函数与第一函数关联。因此,一旦代理函数生成完成(或开始运行),第一函数不再与第二函数直接关联。第一函数在运行过程中,需要调用第二函数进行工作时,需要通过代理函数进行调用。一个具体的例子中,当包含第二函数的动态库为jni动态库,第一函数为java函数,在未修改前通过加载jni动态库与jni动态库中对应的第二函数(jni函数)关联,在通过本实施例提供的方法生成代理函数后,代理函数被包含在独立于jni动态库的代理动态库中,本实施例中提供的jni动态库的代理方法,还包括,第一函数将加载jni动态库修改为加载包含代理函数的代理动态库。

在某些应用场景下,会出现一些非法函数(例如隐含窥探隐私或盗窃隐私功能的函数),试图调用与第一函数关联的第二函数,带来安全隐患。因此,在一个例子中,代理函数还用于在所述第一函数被非法函数调用时,代理所述第二函数取消与所述第一函数的关联。具体地,代理函数判断第一函数是否被非法调用。例如,代理函数在第一函数被调用时,可以根据调用函数的信息生成唯一的校验值(例如哈希值),而非法的函数调用时无法产生正确的校验值,无法通过校验则非法。在第一函数被非法调用时,代理函数代理第二函数取消与第一函数的关联。使得所述非法函数无法调用第二函数。在又一个例子中,本实施例中提供的动态库的代理方法,还包括,代理函数在所述第一函数不被非法调用时,代理所述第二函数恢复与所述第一函数的关联。

本实施例中提提供一种动态库代理设备6000,包括信息获取单元6100、函数生成单元6200,如图6所示,用于实施本实施例提供的任意一种动态库的代理方法,在此不再赘述。

动态库代理设备6000,包括:

信息获取单元6100,用于获取被修改的第一函数的修改信息,所述修改信息至少包含所述第一函数的被修改前的接口信息和被修改后的接口信息;

函数生成单元6200,用于根据所述第一函数的修改信息以及所述第二函数的函数信息,生成用于代理所述第二函数与所述第一函数关联的代理函数。

在一个例子中,所述函数生成单元6200包括:

用于根据所述第一函数的修改信息生成第一函数的修改映射表的装置,所述修改映射表用于描述修改前的第一函数与修改后的第一函数的映射关系;

用于根据所述修改映射表以及第二函数的函数信息,生成用于代理所述第二函数被所述第一函数调用的代理函数的装置。

在另一个例子中,所述动态库中包含将所述第一函数与所述第二函数关联的关联函数,所述函数生成单元6200包括:

用于根据所述第一函数的修改信息以及所述关联函数中用于关联所述第一函数与所述第二函数的关联对象生成新的关联对象的装置;

用于根据所述第二函数的信息以及所述新的关联对象生成用于根据新的关联对象代理所述第二函数与所述第一函数关联的代理函数的装置。

可选地,所述代理函数,还用于在所述第一函数非法时代理所述第二函数取消与所述第一函数的关联。

以上已经结合附图和例子描述本发明的实施例。根据本实施例,通过生成代理函数,代理动态库中的第二函数与动态库之外的第一函数关联。使得第一函数被修改时,无需修改第二函数,包含第二函数的动态库能正常工作。降低修改第一函数的复杂度。降低修改第一函数带来的成本。尤其适用第二函数无法修改的应用场景。

本领域技术人员应当明白,可以通过各种方式来实现代理设备6000。例如,可以通过指令配置处理器来实现代理设备6000。例如,可以将指令存储在rom中,并且当启动设备时,将指令从rom读取到可编程器件中来实现代理设备6000。例如,可以将代理设备6000固化到专用器件(例如asic)中。可以将代理设备6000分成相互独立的单元,或者可以将它们合并在一起实现。代理设备6000可以通过上述各种实现方式中的一种来实现,或者可以通过上述各种实现方式中的两种或更多种方式的组合来实现。

本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(isa)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如smalltalk、c++等,以及常规的过程式编程语言—诸如“c”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。

这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。对于本领域技术人员来说公知的是,通过硬件方式实现、通过软件方式实现以及通过软件和硬件结合的方式实现都是等价的。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。本发明的范围由所附权利要求来限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1