一种应用层接口的动态注册方法及相关装置与流程

文档序号:18059226发布日期:2019-07-03 02:56阅读:141来源:国知局
本申请涉及软件开发领域,尤其涉及一种应用层接口的动态注册方法及相关装置。
背景技术
::随着android系统越来越普及,为了实现android系统的高性能,安全性,功能复用性,会将一些通用的底层功能编写成共享对象(so,shareobject)文件,需要理解的是,android系统中的so文件是动态链接库,是二进制文件,即可执行可关联的文件(executableandlinkingformat,elf),使得android系统可以更为独立并且具备高性能和安全性。实际应用中,由于so文件的通用型和功能的完善性,可以增加很多接口来提供丰富多样的功能。例如对于直播应用来说,会将网络接口的鉴权库编写成独立的so文件,提供服务器鉴别客户端的应用程序编程接口(applicationprogramminginterface,api)的请求是否是合法的。然而随着鉴权库的功能的逐渐完善,接口也在不断增多。而每增加一个新的接口,所有使用了此so的应用都必须实现所有的接口,即使用不到该接口也必须实现对应的接口,方式很僵化且不利于系统的维护,因此如何实现接口的动态注册,即实现应用层需要存在的接口才进行注册,是一个需要解决的问题。技术实现要素:本申请实施例提供了一种应用层接口的动态注册方法及相关装置,用于更加灵活的实现接口的注册,有利于系统的维护。本申请实施例的第一方面提供了一种应用层接口的动态注册方法,应用于android系统,包括:定义第一数组,所述第一数组用于列举共享对象so文件中所有对应用层提供的接口信息,所述接口信息包括所述应用层对应的接口名称和接口函数;在所述so文件中编写一个单件类,所述单件类用于管理所述第一数组中的接口函数;遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数,所述目标函数包含于所述so文件中的所有接口函数;若存在,则将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数。在一种可能的实施例中,所述定义第一数组包括:调用所述andriod系统中的存储结构,所述存储结构用于存储所述so文件中的所有接口函数,所述存储结构包括变量name、变量signature和变量fnptr,所述变量name用于表示所述应用层中函数的名称,所述变量signature用于表示所述应用层中函数的参数和返回值类型,所述变量fnptr用于表示指向所述so文件中接口函数的函数指针;根据所述存储结构定义所述第一数组,所述第一数组包括第一变量至第三变量,所述第一变量用于表示第一函数的名称,所述第一函数包含于所述应用层中函数,所述第二变量用于表示所述第一函数对应于所述so文件中的接口名称,所述第三变量用于表示所述接口名称对应的接口函数的参数和返回值类型。在一种可能的实施例中,所述遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数包括:获取所述应用层的类;基于循环函数,根据所述应用层的类和所述单件类遍历所述so文件中的所有接口函数,以确定是否存在目标接口函数在所述应用层中有对应的接口函数。在一种可能的实施例中,所述获取应用层的类包括:通过java本地接口jni的函数findclass获取应用层的类,所述接口函数findclass包括参数env和参数java_class,所述参数env表示所述应用层的运行环境,所述参数java_class用于表示所述应用层的类的名称,所述接口函数findclass的输出参数clazz用于表示所述应用层的类的对象。在一种可能的实施例中,所述根据所述应用层的类和所述单件类遍历所述so文件中的所有接口函数,以确定是否存在目标接口函数在所述应用层中有对应的接口函数包括:通过所述单件类获取所述so文件中所有接口函数的函数列表;遍历所述函数列表,通过jni的函数getstaticmethodid获取所述应用层中与第i个函数对应的接口函数,所述第i个函数包含于所述函数列表,其中,所述接口函数getstaticmethodid包括参数clazz,参数func[i].name,参数func[i].signature,所述参数clazz用于表示所述应用层的类的对象,所述参数func[i].name用于表示所述第i个函数对应的接口名称,所述参数func[i].signature用于表示所述第i个函数的参数类型和返回值,所述函数getstaticmethodid的返回值用于表示是否存在所述目标接口函数。在一种可能的实施例中,所述将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数包括:按照遍历所述函数列表的先后顺序将所述目标接口函数依次存储在所述待注册数组中,所述待注册数组包括所述目标接口函数的名称,所述目标接口函数的参数类型和返回值,以及指向所述目标接口函数的函数指针;根据所述待注册数组和所述应用层的类注册所述目标接口函数。在一种可能的实施例中,所述根据所述待注册数组和所述应用层的类注册所述目标接口函数包括:通过函数registernatives对所述目标接口函数进行注册,所述函数registernatives包括第一参数至第三参数,所述第一参数用于表示所述应用层的类,所述第二参数用于表示所述待注册数组,所述第三参数用于表示所述待注册数组中函数的总个数。本申请实施例的第二方面提供了一种注册装置,所述注册装置应用于android系统,包括:定义单元,用于定义第一数组,所述第一数组用于列举共享对象so文件中所有对应用层提供的接口信息,所述接口信息包括所述应用层对应的接口名称和接口函数;编写单元,用于在所述so文件中编写一个单件类,所述单件类用于管理所述第一数组中的接口函数;判断单元,用于遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数,所述目标函数包含于所述so文件中的所有接口函数;注册单元,用于若存在,则将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数。本申请第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的方法的步骤。本申请第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的方法的步骤。从以上技术方案可以看出,本申请实施例具有以下优点:定义第一数组,所述第一数组用于列举共享对象so文件中所有对应用层提供的接口信息,所述接口信息包括所述应用层对应的接口名称和接口函数;在所述so文件中编写一个单件类,所述单件类用于管理所述第一数组中的接口函数;遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数,所述目标函数包含于所述so文件中的所有接口函数;若存在,则将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数。本申请实施例中,通过在so文件中编写自适应的接口注册,并根据应用层有实现哪些接口,来动态注册这些接口,从而可以不需要所有的应用层来实现so文件的所有接口。即对于同一个so文件里面有众多接口,但是注册实现时会依据应用层的接口来实现动态注册不同的接口,这样只有应用层需要的存在的接口才进行注册,对于一些用不到或者应用层没有的其他接口则不进行注册,更加灵活的实现接口的注册,有利于系统的维护。附图说明图1为本申请实施例提供的一种可能的应用层接口的动态注册方法的流程图;图2为本申请实施例提供的一种可能的注册装置的结构示意图;图3为本申请实施例提供的一种可能的电子设备的硬件结构示意图;图4为本申请实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。具体实施方式本申请实施例提供了一种应用层接口的动态注册方法及相关装置,用于更加灵活的实现接口的注册,有利于系统的维护。下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。本申请提供了一种应用层接口的动态注册方法,请参阅图1,为本申请实施例提供的一种应用层接口的动态注册方法的流程图,具体包括:101、定义第一数组;由于应用层,也称java应用层中的java代码是一种动态执行语言,容易被反编译使得黑客等可以很轻易的读懂其中的代码实现逻辑,导致代码容易被破解;而so文件,是一个动态链接库,也可以理解为是一个基础的底层功能库,它会提供很多接口给到应用层来使用,so文件中的代码包括c和c++代码不易于被反编译,反编译出来的是机器码无法阅读,因此安全性较高。故基于此,本申请实施例中,将涉及到安全隐蔽的功能都编写到so文件中,例如鉴权及加解密库,将所有与服务器接口的鉴权功能封装到一个so文件中,同时也会将应用层的数据加解密功能也封装到此so文件中,一个是可以很大程度的保障算法的安全性不被黑客所破解和逆向,另一个是可以提高程序的执行效率。因此,本申请实施例中,首先定义第一数组,来列举so文件中所有对应用层提供的接口信息,该接口信息包括应用层对应的接口名称和接口函数,即编写一个第一数组来列举出so文件提供的所有接口以及接口的参数规范和应用层对应的接口名称。需要说明的是,在android系统中,提供了一个用于存储so文件中的所有接口函数的存储结构,该存储结构的函数实现如下:typedefstruct{constchar*name;constchar*signature;void*fnptr;}jninativemethod;即,该存储结构包括三个变量,分别是变量name、变量signature和变量fnptr。其中,变量name用于表示应用层中函数的名称,即java中函数的名字;变量signature用于通过字符串表示应用层中函数的参数和返回值类型;变量fnptr是函数指针,用于指向so文件中的接口函数。再通过调用该存储结构定义第一数组,该第一数组包括第一变量至第三变量,第一变量用于表示第一函数的名称,第一函数包含于应用层中函数,第二变量用于表示第一函数对应于so文件中的接口名称,第三变量用于表示接口名称对应的接口函数的参数和返回值类型。为便于理解,设该第一数组为数组ssomethods,其数组最大值为max。第一数组通过第一至第三变量的值,为应用层提供不同的功能。例如,则该第一数组的函数结构具体可以如下:jninativemethodssomethods[max]={"native_so_version","()ljava/lang/string;",(void*)so_version},其中"native_so_version"对应第一变量,用于表示应用层中第一函数的名称,即对应于java代码中的名称;"()ljava/lang/string;"对应第三变量,用于表示接口名称对应的接口函数的参数和返回值类型;(void*)so_version对应第二变量,用于表示第一函数对应于so文件中的接口名称,即应用层的java代码对应于so中的函数名称。则通过名称为native_so_version的第一函数,为应用层提供了获取so文件的版本号的接口。类似的,jninativemethodssomethods[max]={"native_encode","(landroid/content/context;ljava/lang/string;ljava/lang/string;)ljava/lang/string;",(void*)encode},其中,"native_encode"对应第一变量;"(landroid/content/context;ljava/lang/string;ljava/lang/string;)ljava/lang/string;"对应第三变量;(void*)encode对应第二变量。则通过名称为native_encode的第一函数,为应用层提供了数据加密的接口。类似的,{"native_decode","(landroid/content/context;ljava/lang/string;ljava/lang/string;)ljava/lang/string;",(void*)decode},其中"native_decode"对应第一变量;"(landroid/content/context;ljava/lang/string;ljava/lang/string;)ljava/lang/string;"对应第三变量;(void*)decode对应第二此native_decode则是实现对应的给应用层来提供数据加密的接口。通过该第一数组,可以为应用层提供多种功能的接口,例如获取直播的视频流地址的鉴权接口等,具体此处不再一一赘述。102、在so文件中编写一个单件类;在定义编写了第一数组后,为了更好的封装和管理提供统一的接口,本申请实施例在so文件中编写一个单件类来对动态数组进行管理和提供接口的访问,之所以定义为单件类因为单件类在整个so文件中只有一份,并且在so文件中的任意地方都可以进行访问,且单件类有更好的封装性和统一性。具体地,本申请实施例中,编写单件类的方式可以如下:首先定义一个单件类managerfunction,并将其的构造函数定义为私有的,具体函数实现如下:classmanagerfunction{private:通过函数m_psingleton定义一个静态的对象指针,并将该对象实例化,且在so文件中只有此一个实例。另外,为了确保对象实例化成功,通过函数getinstance()编写公开的对外访问此实例的接口,需要说明的是,在java中函数getinstance(),用于调用单例模式创建类的实例,所谓单例模式就是一个类有且只有一个实例。通过函数getinstance()调用实例化的对象后,判断是否已经实例化成功,如果没有则通过函数newmanagerfunction()进行实例化创建对象,如果有则直接返回该实例对象。具体函数实现如下:staticmanagerfunction*m_psingleton;staticmanagerfunction*getinstance(){if(m_psingleton==null){m_psingleton=newmanagerfunction();}returnm_psingleton。}}另外,在编写好了单价类后,通过此单件类管理所有的so文件的接口函数,并提供统一的对外访问方法和存储所有的接口函数定义。具体地,在创建的单件类managerfunction中增加属性和接口,其构造函数定义为私有的,并通过函数ssomethods[]将第一数组放到该单件类,其中,函数ssomethods[]用于单点登录该单件类,即实现对编写的第一数组的统一管理。具体函数实现如下:classmanagerfunction{private:jninativemethodssomethods[max]={};在实现对第一数组进行统一管理的同时,再在公开方法中增加一个接口来对其进行访问,即通过函数getfunc()调用该第一数组,并返回访问该第一数组的统一接口函数ssomethods,具体函数实现如下:public:jninativemethodgetfunc(){returnssomethods;}}需要说明的是,其他调用者也可以通过函数getfunc()来获取所有的函数,具体调用则是:jninativemethodfunc=managerfunction::getinstance()->getfunc();即可得到所有的函数数组。故通过本步骤,编写了单件类,并通过此单件类管理所有的so文件的接口函数,且提供了统一的对外访问方法和存储所有的接口函数定义。103、遍历so文件中的所有接口函数;104、确定是否存在目标接口函数在应用层中有对应的接口函数;需要说明的是,由于android系统提供了反射机制,故可以在so文件的代码中反射应用层的接口,本申请实施例中,应用层也可以称为应用java层或者java层,具体此处不做限定。即通过该反射机制,可以查询接口是否存在于应用层中,也可以调用对应的应用层接口。本申请实施例中,通过遍历so文件中的所有接口函数,来查看对应的应用层实现了那些接口,从而最终so文件在进行注册函数接口时,只注册应用层有实现的接口,需要注意的是,注册未实现的接口会导致程序崩溃,因为有接口在应用层中没有实现。本申请实施例中,会使用一个待注册数组如ssomethodsregister数组来保存所有应用层实现了的接口,从而后续可以方便的进行注册,该ssomethodsregister数组的函数表达可以为jninativemethodssomethodsregister[max]={}。另外,为了遍历so文件中的所有接口函数,在应用层中会使用应用层的类来编写所有so文件对应的接口函数。故本申请实施例中,首先获取该应用层的类,再基于循环函数如for循环函数,根据应用层的类和单件类遍历so文件中的所有接口函数。具体地,获取该应用层的类的方式可以如下:通过java本地接口(javanativeinterface,jni)的函数findclass获取应用层的类,函数实现可以如下:jclassclazz=(*env)->findclass(env,java_class);其中,接口函数findclass包括参数env和参数java_class,参数env用于表示应用层的运行环境,参数java_class用于表示应用层的类的名称,接口函数findclass的输出参数clazz用于表示应用层的类的对象。获取到应用层的类后,再基于for循环函数,根据应用层的类和单件类遍历so文件中的所有接口函数,即遍历so中的所有接口来查询此类中是否有so中函数对应的接口。具体地,通过单件类获取so文件中所有接口函数的函数列表;遍历函数列表,通过jni的函数getstaticmethodid获取应用层中与第i个函数对应的接口函数,其中第i个函数包含于函数列表,函数实现可以如下:for(inti=0;i<max;i++){通过单件类管理so文件的所有接口的实例来获取对应的函数列表,具体实现函数如下:jninativemethodfunc=managerfunction::getinstance()->getfunc();遍历函数列表,再根据函数getstaticmethodid获取应用层中与第i个函数对应的接口函数,具体实现函数如下:jmethodidmethod=env->getstaticmethodid(clazz,func[i].name,func[i].signature);其中,接口函数getstaticmethodid包括参数clazz,参数func[i].name,参数func[i].signature,参数clazz用于表示应用层的类的对象,参数func[i].name用于表示第i个函数对应的接口名称,参数func[i].signature用于表示第i个函数的参数类型和返回值,函数getstaticmethodid的返回值method则是对应的方法,用于表示是否存在目标接口函数,若存在则method不为空,否则method为空。105、若存在,则将目标接口函数记录在待注册数组中;若确定存在目标接口函数在应用层中有对应的接口函数,即method不为空,说明应用层实现了对应的接口函数,则将目标接口函数记录在待注册数组中,具体地,按照遍历函数列表的先后顺序将目标接口函数依次存储在待注册数组中,具体实现函数如下:if(method!=null){定义一个静态变量记录待注册数组的元素顺序,staticintindex=0;ssomethodsregister[index].name=func[i].name;ssomethodsregister[index].signature=func[i].signature;ssomethodsregister[index].fnptr=func[i].fnptr;在遍历函数列表的过程中,同时将顺序加1,用于存储下个元素即下个目标接口函数:index=index+1;}}其中,待注册数组包括参数ssomethodsregister[index].name,即目标接口函数的名称func[i].name,参数ssomethodsregister[index].signature,即目标接口函数的参数类型和返回值func[i].signature,以及参数ssomethodsregister[index].fnptr,即指向目标接口函数的函数指针func[i].fnptr。通过上述赋值,则将so文件中的目标接口函数定义赋值到了待注册数组即数组ssomethodsregister中。因此,在通过for循环遍历了so文件中的所有接口函数后,在待注册数组即数组ssomethodsregister中存储了所有应用层实现了对应接口的方法,后续则需要在so文件中来注册这些有实现的方法。106、根据待注册数组注册目标接口函数。实际应用中,andriod系统提供了两种方式来进行so文件中函数的注册,一种是静态注册,另一种则是动态注册。而静态注册则不具有灵活性,即所有so文件的接口必须在应用层有对应的接口。而本申请实施例使用动态注册则可以灵活的依据实际情况来选择注册哪些函数。具体地,通过对so文件中的所有函数进行遍历,并对每个函数判断其在应用层是否有对应的接口函数,如果有对应的接口则将其记录在待注册数组,即数组ssomethodsregister中,那么接下来则需要将待注册数组中的目标接口函数进行注册,从而应用层可以调用so文件中对应的接口,本申请实施例中,使用系统提供的接口registernatives来进行目标接口函数的注册,具体实现如下:env->registernatives(clazz,ssomethodsregister,index);jintregisternatives(jclassclazz,constjninativemethod*methods,jintnmethods);其中,函数registernatives包括第一参数至第三参数,第一参数jclassclazz用于表示应用层的类,第二参数constjninativemethod*methods用于表示待注册数组,本申请中即数组ssomethodsregister,第三参数jintnmethods用于表示待注册数组中函数的总个数参数,本申请中即index。故通过调用函数registernatives即实现了将so文件的函数注册到系统,从而对于应用层的java代码则可以直接调用so文件中提供的功能。本申请实施例中,通过在so文件中编写自适应的接口注册,并根据应用层有实现哪些接口,来动态注册这些接口,从而可以不需要所有的应用层来实现so文件的所有接口。即对于同一个so文件里面有众多接口,但是注册实现时会依据应用层的接口来实现动态注册不同的接口,这样只有应用层需要的存在的接口才进行注册,对于一些用不到或者应用层没有的其他接口则不进行注册,更加灵活的实现了接口的注册,有利于系统的维护。上面从应用层接口的动态注册方法的角度对本申请实施例进行了描述,下面从注册装置的角度对本申请实施例进行描述。请参阅图2,图2为本申请实施例提供的一种可能的注册装置的实施例示意图,其中,该注册装置具体包括:定义单元201,用于定义第一数组,所述第一数组用于列举共享对象so文件中所有对应用层提供的接口信息,所述接口信息包括所述应用层对应的接口名称和接口函数;编写单元202,用于在所述so文件中编写一个单件类,所述单件类用于管理所述第一数组中的接口函数;判断单元203,用于遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数,所述目标函数包含于所述so文件中的所有接口函数;注册单元204,用于若存在,则将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数。请参阅图3,图3为本申请实施例提供的电子设备的实施例示意图。如图3所示,本申请实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:定义第一数组,所述第一数组用于列举共享对象so文件中所有对应用层提供的接口信息,所述接口信息包括所述应用层对应的接口名称和接口函数;在所述so文件中编写一个单件类,所述单件类用于管理所述第一数组中的接口函数;遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数,所述目标函数包含于所述so文件中的所有接口函数;若存在,则将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数。可选的,在一种可能的实施例中,所述处理器320具体用于:调用所述andriod系统中的存储结构,所述存储结构用于存储所述so文件中的所有接口函数,所述存储结构包括变量name、变量signature和变量fnptr,所述变量name用于表示所述应用层中函数的名称,所述变量signature用于表示所述应用层中函数的参数和返回值类型,所述变量fnptr用于表示指向所述so文件中接口函数的函数指针;根据所述存储结构定义所述第一数组,所述第一数组包括第一变量至第三变量,所述第一变量用于表示第一函数的名称,所述第一函数包含于所述应用层中函数,所述第二变量用于表示所述第一函数对应于所述so文件中的接口名称,所述第三变量用于表示所述接口名称对应的接口函数的参数和返回值类型。可选的,在一种可能的实施例中,所述处理器320具体用于:获取所述应用层的类;基于循环函数,根据所述应用层的类和所述单件类遍历所述so文件中的所有接口函数,以确定是否存在目标接口函数在所述应用层中有对应的接口函数。可选的,在一种可能的实施例中,所述处理器320具体用于:通过java本地接口jni的函数findclass获取应用层的类,所述接口函数findclass包括参数env和参数java_class,所述参数env表示所述应用层的运行环境,所述参数java_class用于表示所述应用层的类的名称,所述接口函数findclass的输出参数clazz用于表示所述应用层的类的对象。可选的,在一种可能的实施例中,所述处理器320具体用于:通过所述单件类获取所述so文件中所有接口函数的函数列表;遍历所述函数列表,通过jni的函数getstaticmethodid获取所述应用层中与第i个函数对应的接口函数,所述第i个函数包含于所述函数列表,其中,所述接口函数getstaticmethodid包括参数clazz,参数func[i].name,参数func[i].signature,所述参数clazz用于表示所述应用层的类的对象,所述参数func[i].name用于表示所述第i个函数对应的接口名称,所述参数func[i].signature用于表示所述第i个函数的参数类型和返回值,所述函数getstaticmethodid的返回值用于表示是否存在所述目标接口函数。可选的,在一种可能的实施例中,所述处理器320具体用于:按照遍历所述函数列表的先后顺序将所述目标接口函数依次存储在所述待注册数组中,所述待注册数组包括所述目标接口函数的名称,所述目标接口函数的参数类型和返回值,以及指向所述目标接口函数的函数指针;根据所述待注册数组和所述应用层的类注册所述目标接口函数。可选的,在一种可能的实施例中,所述处理器320具体用于:通过函数registernatives对所述目标接口函数进行注册,所述函数registernatives包括第一参数至第三参数,所述第一参数用于表示所述应用层的类,所述第二参数用于表示所述待注册数组,所述第三参数用于表示所述待注册数组中函数的总个数。由于本实施例所介绍的电子设备为实施本申请实施例中一种注册装置所采用的设备,故而基于本申请实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本申请实施例中的方法不再详细介绍,只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。请参阅图4,图4为本申请实施例提供的一种计算机可读存储介质的实施例示意图。如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:定义第一数组,所述第一数组用于列举共享对象so文件中所有对应用层提供的接口信息,所述接口信息包括所述应用层对应的接口名称和接口函数;在所述so文件中编写一个单件类,所述单件类用于管理所述第一数组中的接口函数;遍历所述so文件中的所有接口函数,并确定是否存在目标接口函数在所述应用层中有对应的接口函数,所述目标函数包含于所述so文件中的所有接口函数;若存在,则将所述目标接口函数记录在待注册数组中,并注册所述目标接口函数。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用所述andriod系统中的存储结构,所述存储结构用于存储所述so文件中的所有接口函数,所述存储结构包括变量name、变量signature和变量fnptr,所述变量name用于表示所述应用层中函数的名称,所述变量signature用于表示所述应用层中函数的参数和返回值类型,所述变量fnptr用于表示指向所述so文件中接口函数的函数指针;根据所述存储结构定义所述第一数组,所述第一数组包括第一变量至第三变量,所述第一变量用于表示第一函数的名称,所述第一函数包含于所述应用层中函数,所述第二变量用于表示所述第一函数对应于所述so文件中的接口名称,所述第三变量用于表示所述接口名称对应的接口函数的参数和返回值类型。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:获取所述应用层的类;基于循环函数,根据所述应用层的类和所述单件类遍历所述so文件中的所有接口函数,以确定是否存在目标接口函数在所述应用层中有对应的接口函数。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过java本地接口jni的函数findclass获取应用层的类,所述接口函数findclass包括参数env和参数java_class,所述参数env表示所述应用层的运行环境,所述参数java_class用于表示所述应用层的类的名称,所述接口函数findclass的输出参数clazz用于表示所述应用层的类的对象。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过所述单件类获取所述so文件中所有接口函数的函数列表;遍历所述函数列表,通过jni的函数getstaticmethodid获取所述应用层中与第i个函数对应的接口函数,所述第i个函数包含于所述函数列表,其中,所述接口函数getstaticmethodid包括参数clazz,参数func[i].name,参数func[i].signature,所述参数clazz用于表示所述应用层的类的对象,所述参数func[i].name用于表示所述第i个函数对应的接口名称,所述参数func[i].signature用于表示所述第i个函数的参数类型和返回值,所述函数getstaticmethodid的返回值用于表示是否存在所述目标接口函数。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时还用于实现如下步骤:按照遍历所述函数列表的先后顺序将所述目标接口函数依次存储在所述待注册数组中,所述待注册数组包括所述目标接口函数的名称,所述目标接口函数的参数类型和返回值,以及指向所述目标接口函数的函数指针;根据所述待注册数组和所述应用层的类注册所述目标接口函数。可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过函数registernatives对所述目标接口函数进行注册,所述函数registernatives包括第一参数至第三参数,所述第一参数用于表示所述应用层的类,所述第二参数用于表示所述待注册数组,所述第三参数用于表示所述待注册数组中函数的总个数。需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包括这些改动和变型在内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1