CN104020992B - 由C/C++生成Java Web服务的方法及装置 - Google Patents
由C/C++生成Java Web服务的方法及装置 Download PDFInfo
- Publication number
- CN104020992B CN104020992B CN201410232055.5A CN201410232055A CN104020992B CN 104020992 B CN104020992 B CN 104020992B CN 201410232055 A CN201410232055 A CN 201410232055A CN 104020992 B CN104020992 B CN 104020992B
- Authority
- CN
- China
- Prior art keywords
- class
- service
- type
- code
- data
- 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.)
- Active
Links
Abstract
本发明实施例提供一种由C/C++生成Java Web服务的方法及装置。该方法包括:服务开发工具接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码用于调用动态库文件,所述服务代码用于调用所述底层代码;所述服务开发工具生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述动态库文件。本发明实施例通过服务开发工具根据C/C++头文件和C/C++头文件对应的动态库文件自动生成服务包,以供服务器根据服务包生成Web服务,提高Web服务的生成效率。
Description
技术领域
本发明实施例涉及计算机技术,尤其涉及一种由C/C++生成Java Web服务的方法及装置。
背景技术
随着网络技术的发展,Web服务被越来越多的企业和研究机构所重视和接受,其Web领域也越来越广泛。如何自动化构建Web服务并保留原有应用程序的接口和功能成为一个比较热门的研究课题。而面向服务的体系结构(Service-Oriented Architecture,简称SOA)基于开放的标准,以服务为中心,这些服务具有良好的接口同时又屏蔽了底层的实现细节,通过对这些松散耦合服务的组合构建复合型应用程序以满足不断变化的需求。它作为一种新型的网络化软件应用模式,目前已经被工业界和学术界广泛认可和接受。
目前比较热门的Web服务运行环境有gSOAP、Apache Axis、思讯Web服务运行时。其中gSOAP与Axis支持使用C或者C++开发Web服务,思讯支持Java服务的开发。从将已有的C/C++程序开发为服务角度来分析,gSOAP与Axis均没有提供完全自动的服务开发的功能。
现有技术由C/C++程序生成Web服务的过程中,需要开发人员进行一定量代码的编写工作,导致Web服务生成的效率低。
发明内容
本发明实施例提供一种由C/C++生成Java Web服务的方法及装置,以提高Web服务生成的效率。
本发明实施例的一个方面是提供一种由C/C++生成Java Web服务的方法,包括:
服务开发工具接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码 用于调用与所述C/C++头文件对应的动态库文件,所述服务代码用于调用所述底层代码;
所述服务开发工具生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述C/C++头文件对应的动态库文件。
本发明实施例的另一个方面是提供一种服务开发工具,包括:
代码生成模块,用于接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码用于调用与所述C/C++头文件对应的动态库文件,所述服务代码用于调用所述底层代码;
服务包生成模块,用于生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述C/C++头文件对应的动态库文件。
本发明实施例提供的由C/C++生成Java Web服务的方法及装置,通过服务开发工具根据C/C++头文件和C/C++头文件对应的动态库文件自动生成服务包,以供服务器根据服务包生成Web服务,提高了Web服务的生成效率。
附图说明
图1为本发明实施例提供的由C/C++生成Java Web服务的方法流程图;
图2为本发明实施例提供的由C/C++生成Java Web服务的方法适用的信令图;
图3为本发明另一实施例提供的由C/C++生成Java Web服务的方法流程图;
图4为本发明另一实施例提供的由C/C++生成Java Web服务的方法信令图;
图5为本发明实施例提供的服务开发工具结构图;
图6为本发明另一实施例提供的服务开发工具结构图;
图7为本发明另一实施例提供的服务开发工具结构图;
图8为本发明另一实施例提供的服务开发工具结构图;
图9为本发明另一实施例提供的底层调用类生成子模块的结构图;
图10为本发明另一实施例提供的底层数据类生成子模块的结构图;
图11为本发明另一实施例提供的服务类生成子模块的结构图;
图12为本发明另一实施例提供的服务数据类生成子模块的结构图。
具体实施方式
图1为本发明实施例提供的由C/C++生成Java Web服务的方法流程图。本发明实施例适用于利用服务开发工具根据C/C++头文件和动态库文件自动生成服务包,并通过在服务器上安装服务包生成Web服务,具体的Web服务生成步骤如下:
步骤S101、服务开发工具接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码用于调用与所述C/C++头文件对应的动态库文件,所述服务代码用于调用所述底层代码;
C/C++头文件和C/C++头文件对应的动态库文件作为服务开发工具的输入,服务开发工具对C/C++头文件进行处理生成底层代码和服务代码,底层代码用于调用与C/C++头文件对应的动态库文件,具体为调用动态库文件对应的C/C++程序,传递参数给C/C++程序并接收C/C++程序的返回值;服务代码对外用于向客户端提供服务接口,对内用于调用底层代码,具体为传递参数给底层代码,并接收底层代码返回的数据。
步骤S102、所述服务开发工具生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述C/C++头文件对应的动态库文件。
服务开发工具根据底层代码、服务代码和C/C++头文件对应的动态库文件生成服务包,服务器通过安装服务包生成与所述服务包对应的Web服务,相应的Web服务包括底层代码、服务代码和C/C++头文件对应的动态库文件。
图2为本发明实施例提供的由C/C++生成Java Web服务的方法适用的信令图。如图2所示,服务器安装服务包生成Web服务后,接收客户端发送的服务请求,服务器中的Web服务运行环境调用服务代码,服务代码将参数类型转换成底层代码的参数类型,并将转换后的参数传递给底层代码;底层代码进一步将底层代码的参数类型转换成C/C++数据类型并传递给C/C++程序, 接收C/C++程序的返回值;底层代码将C/C++程序的返回值类型转换成服务代码的参数类型并传递给服务代码,Web服务运行环境将服务代码输出的返回值构造成响应信息后返回给客户端。
本发明实施例通过服务开发工具根据C/C++头文件和C/C++头文件对应的动态库文件自动生成服务包,以供服务器根据服务包生成Web服务,提高了Web服务的生成效率。
在上述实施例的基础上,步骤S101中所述底层代码包括底层调用类和底层数据类,所述底层调用类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的底层方法组成的,所述底层数据类与C/C++中自定义的类一一对应,用于对所述底层数据类类型和服务数据类类型之间进行相互转换;所述服务代码包括服务类和服务数据类,所述服务类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的服务方法组成的,所述服务数据类与所述C/C++中自定义的类一一对应。
服务开发工具生成的底层代码包括底层调用类和底层数据类,所述C/C++头文件包括函数声明和类声明,服务开发工具依据C/C++头文件中的函数声明生成与所述函数声明对应的底层方法,所述底层方法的集合构成了底层调用类;服务开发工具依据C/C++头文件中的类声明生成底层数据类,底层数据类用于对C/C++数据类和底层数据类之间进行相互转换,以及对所述底层数据类和服务数据类之间进行相互转换,其中,C/C++数据类对应C/C++程序中的数据类,底层数据类对应底层代码的数据类,服务数据类对应服务代码的数据类。
服务代码包括服务类和服务数据类,服务开发工具依据C/C++头文件中的函数声明生成与所述函数声明对应的服务方法,服务方法的集合构成了服务类;服务开发工具依据C/C++头文件中的类声明生成服务数据类,服务数据类用于对所述C/C++数据类和所述服务数据类之间进行相互转换。
本发明实施例通过服务开发工具依据C/C++头文件生成底层调用类和底层数据类,以及服务类和服务数据类,提供了底层代码和服务代码的生成方式。
图3为本发明另一实施例提供的由C/C++生成Java Web服务的方法流程 图。在上述实施例的基础上,所述C/C++头文件是所述服务开发工具对初始头文件进行预处理后的文件,所述预处理包括:对所述初始头文件包含的多个子头文件进行完整性验证;若判断获知所述多个子头文件完整,则对所述多个子头文件进行重复过滤,对重复的子头文件只保留一份;合并所述多个子头文件和所述初始头文件获得所述C/C++头文件。
如图3所示,步骤S101之前还包括步骤S100、服务开发工具对初始头文件进行预处理生成C/C++头文件,具体的预处理为:服务开发工具对初始头文件中包含的多个子头文件进行完整性验证,验证各子头文件是否能够正常定位;若判断获知所述多个子头文件完整,则对所述多个子头文件进行重复过滤,对重复的子头文件只保留一份;合并所述多个子头文件和所述初始头文件,具体为提取多个子头文件和初始头文件中的内容,将所有的内容整合在一个文件中,整合后的文件即为C/C++头文件,在整合的过程中,一些预处理指令被移除。
另外,所述服务开发工具生成服务包之前,还包括:所述服务开发工具依据所述服务代码生成服务元素,所述服务元素用于生成客户端应用;相应的,所述服务开发工具生成服务包包括:所述服务开发工具依据所述底层代码和所述服务代码生成二进制文件;所述服务开发工具生成服务包,所述服务包包括二进制文件、所述动态库文件和所述服务元素。
如图3所示,在步骤S101之后还包括:
步骤S103、所述服务开发工具依据所述服务代码生成服务元素,所述服务元素用于生成客户端应用;
相应的步骤S102分为步骤S102a和S102b:
步骤S102a、所述服务开发工具依据所述底层代码和所述服务代码生成二进制文件;
步骤S102b、所述服务开发工具生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述服务包包括二进制文件、所述动态库文件和所述服务元素。
所述服务开发工具生成服务包之前依据所述服务代码生成服务元素,所述服务元素用于生成客户端应用;相应的,所述服务开发工具生成服务包具体为所述服务开发工具依据所述底层代码和所述服务代码生成二进制文件; 所述服务开发工具依据二进制文件、服务元素和动态库文件生成服务包。
本发明实施例通过服务开发工具对初始头文件进行预处理,保证了C/C++头文件的完整性;通过生成服务元素,增加了服务包的内容,增加了服务包的应用范围。
在上述实施例的基础上,所述底层调用类按照如下生成算法获得:
解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;
遍历各函数声明,对所述各函数声明生成对应的Java本地方法,将所述各函数声明的参数添加到所述Java本地方法的参数列表中,如果所述参数不是基本数据类型,则将所述参数转换成底层数据类对应的类型;
设置所述Java本地方法的返回值类型,并将所述Java本地方法添加到Java类中,获得所述底层调用类。
与底层调用类生成算法对应的具体实现如下:
Algorithm generateLibraryClass
Input:C/C++头文件header
Output:底层调用类lcij
Begin
1.var funcs=parseFunctions(header)
2.for each(fd in funcs)do
3.var me=fd
4.for each(para in fd.getParams())do
5.var type=getLibraryType(para.getType())
6.me.addParam(type,para.getName())
7.end for each
8.var retType=fd.getReturnType()
9.if(retType==“void”)then
10.me.setReturnType(“void”)
11.else
12.retType=getLibraryType(retType)
13.me.setReturnType(retType)
14.end if
15.lcij.addMethod(me)
16.end for each
17.return lcij
End
所述底层数据类按照如下生成算法获得:
设置所述底层数据类的类名与所述C/C++头文件中类声明的类名相同,并设置所述底层数据类的超类名;
循环遍历所述C/C++头文件中类声明的成员,如果所述成员是函数则生成对应的native方法;如果所述成员是数据则生成与所述数据同类型的成员变量,并对所述成员变量添加getter和setter方法;如果所述成员变量不是基本数据类型,则将所述成员变量的类型转换为底层数据类对应的类型;
生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法;
生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法。
与底层数据类生成算法对应的具体实现如下:
Algorithm generateLibraryModel
Input:C++中的类声明cic
Output:底层数据类lmij
Begin
1.lmij.setName(cic.getName())
2.if(cic.hasParent())then
3.lmij.setParentName(cic.getParentName())
4.end if
5.for each(md in cic.getMembers())
6.if(md.isFunction())then
7.var me=generateNativeMethod(md)
8.lmij.addMethod(me)
9.else
10.lmij.addMember(md)
11.lmij.addSetter(md)
12.lmij.addGetter(md)
13.end if
14.end for each
//生成从底层数据类型转换为服务数据类型的方法
15.generateAllFieldsGetter(lmij)
//生成从服务数据类型转换为底层数据类型的方法
16.generateAllFieldsSetter(lmij)
17.return lmij
End
所述生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法包括:
如果所述底层数据类派生自超类,则调用所述超类的get方法将所述超类中的成员转换为所述服务数据类对应的类型;
循环遍历底层数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述服务数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述底层数据类的get方法将所述成员变量转换成所述服务数据类对应的类型;以获得由所述底层数据对象转换成的服务数据对象。
与所述生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法对应的具体实现如下:
AlgorithmlibraryModelToServiceModel
Input:底层数据类对象lobj
Output:服务数据类对象sobj
Begin
1.if(lobj.hasParent())then
2.sobj.setParentField(lmij.getParent().get())
3.end if
4.for each(field in lobj.getFields())do
5.if(isPrimitiveType(field))then
6.sobj.setFieldValue(field.getName(),field.getValue)
7.else if(isPrimitivePointer(field))then
8.var ary=convertToArray(field)
9.sobj.setArrayFieldValue(field.getName(),ary.getValue())
10.else if(isComplexType(field)||isClassPointer(field))then
11.var s=convertToServiceModel(field)
12.sobj.setClassValue(field.getName(),s.getValue())
13.end if
14.end for each
15.return sobj
End
所述生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法包括:
如果所述服务数据类派生自超类,则调用所述超类的setAllFields方法将所述超类中的成员转换为所述底层数据类对应的类型;
循环遍历服务数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述底层数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述服务数据类的setAllFields方法将所述成员变量转换成所述底层数据类对应的类型;以获得由所述服务数据对象转换成的底层数据对象。
与所述生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法对应的具体实现如下:
Algorithm serviceModelToLibraryModel
Input:服务数据对象sobj
Output:底层数据对象lobj
Begin
1.if(sobj.hasParent())then
2.super().setAllFields(sobj)
3.end if
4.for each(field in sobj.getFields())do
5.if(isPrimitiveType(field))then
6.lobj.setFieldValue(field.getName(),field.getValue())
7.else if(isPrimitivePointer(field))then
8.var ary=convertToArray(field)
9.lobj.setArrayFieldValue(field.getName(),ary.getValue())
10.else if(isComplexType(field)||isClassPointer(field))then
11.var lo=convertToLibraryModel(field)
12.lo.setAllFields(sobj.get())
13.lobj.setClassValue(field.getName(),lo)
14.end if
15.end for each
16.return lobj
End
所述服务类按照如下生成算法获得:
解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;
遍历各函数声明,对所述各函数声明在所述服务类中生成对应的服务方法;
生成与所述服务方法对应的实现,以获得所述服务类的代码。
与服务类生成算法对应的具体实现如下:
Algorithm generateServiceClass
Input:C/C++头文件header
Output:服务类scij
Begin
1.var funcs=parseFunctions(header)
2.for each(fd in funcs)do
3.var me=generateServiceMethod(fdj)
4.scij.addMethod(me)
5.end for each
6.return scij
End
所述服务方法按照如下生成算法获得:
设置所述服务方法的名称与所述C/C++头文件中函数声明的函数名相同;
确定所述服务方法的参数列表和返回值类型;
若所述参数列表中的参数为非基本数据类型,将所述参数的类型转换成所述底层数据类对应的类型;
根据所述C/C++头文件中函数声明的返回值,生成调用Java本地方法的代码,以获得与所述Java本地方法对应的所述服务方法。
与服务方法生成算法对应的具体实现如下:
Agorithm generateServiceMethod
Input:C/C++函数声明fd
Output:Java类中的方法me
Begin
1.me.setName(fd.getName())
2.for each(para in fd.getParams())do
3.var type=getServiceType(para.getType())
4.me.addParam(type,para.getName())
5.end for each
6.var retType=getServiceType(fd.getReturnType())
7.me.setReturnType(retType)
8.var cs=getNativeClass()+“.”+fd.getName()
9.for each(param in me.getParams())do
10.if(isPrimitiveType(param.getType()))then
11.cs.addParam(param.getName())
12.else
13.var line=convertToNative(param)
14.me.addExpression(line)
15.cs.addParam(line.getVariableName())
16.end if
17.end for each
18.if(fd.getReturnType()!=“void”)then
19.var line=generateInvocation(cs)
20.me.addExpression(line)
21.me.addReturnValue(line.getVariableName())
22.else
23.me.addExpression(cs)
24.end if
25.return me
End
所述服务数据类按照如下生成算法获得:
根据所述C/C++头文件中的类声明,设置所述服务数据类的类名和超类名;
遍历所述C/C++头文件中类声明的成员,如果是所述成员是函数则忽略,否则在所述服务数据类中生成与所述成员同类型的成员变量,并对所述成员变量添加setter方法和getter方法;以获得与所述类声明对应的所述服务数据类。
与服务数据类生成算法对应的具体实现如下:
Algorithm convertServiceModel
Input:C/C++中的类声明cic
Output:Java中的服务数据类smij
Begin
1.smij.setName(cic.getName())
2.if(cic.hasParent())then
3.smij.setParentName(cic.getParentName())
4.end if
5.for each(md in cic.getMembers())
6.if(md.isFunction())then
7.continue
8.end if
9.smij.addMember(md)
10.smij.addSetter(md)
11.smij.addGetter(md)
12.end for each
13.return smij
End
本发明实施例提供了底层调用类和底层数据类,以及服务类和服务数据类的具体生成算法。
图4为本发明另一实施例提供的由C/C++生成Java Web服务的方法信令图。如图4所示,服务开发工具接收初始头文件和动态库文件,对初始头文件依次经过完整性验证、重复过滤和文件合并的预处理后生成C/C++头文件;对C/C++头文件进行头文件解析,生成底层代码和服务代码;并依据服务代码生成服务元素;将底层代码和服务代码经过代码编译生成二进制文件;对二进制文件、动态库文件和服务元素进行文件整理、服务包生成操作生成服务包。
本发明实施例通过服务开发工具根据C/C++头文件和C/C++头文件对应的动态库文件自动生成服务包,以供服务器根据服务包生成Web服务,提高了Web服务的生成效率。
图5为本发明实施例提供的服务开发工具结构图。本发明实施例提供的服务开发工具可以执行由C/C++生成Java Web服务的方法实施例提供的处理流程,如图5所示,服务开发工具50包括代码生成模块51和服务包生成模块52,其中,代码生成模块51用于接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码用于调用与所述C/C++头文件对应的动态库文件,所述服务代码用于调用所述底层代码;服务包生成模块52用于生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述C/C++头文件对应的动态库文件。
本发明实施例通过服务开发工具根据C/C++头文件和C/C++头文件对应的动态库文件自动生成服务包,以供服务器根据服务包生成Web服务,提高 了Web服务的生成效率。
图6为本发明另一实施例提供的服务开发工具结构图。本发明实施例提供的服务开发工具可以执行由C/C++生成Java Web服务的方法实施例提供的处理流程,在上述实施例的基础上,代码生成模块51包括底层代码生成模块61和服务代码生成模块62,其中,底层代码生成模块61用于生成底层代码,服务代码生成模块62用于生成服务代码。
底层代码生成模块61包括底层调用类生成子模块71和底层数据类生成子模块72,底层调用类生成子模块71用于生成底层调用类,底层数据类生成子模块72用于生成底层数据类;所述底层调用类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的底层方法组成的,所述底层数据类与C/C中自定义的类一一对应,用于对所述底层数据类类型和服务数据类类型之间进行相互转换;
服务代码生成模块62包括服务类生成子模块81和服务数据类生成子模块82,服务类生成子模块81用于生成服务类,服务数据类生成子模块82用于生成服务数据类;所述服务类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的服务方法组成的,所述服务数据类与所述C/C++中自定义的类一一对应。
本发明实施例通过服务开发工具依据C/C++头文件生成底层调用类和底层数据类,以及服务类和服务数据类,提供了底层代码和服务代码的生成方式。
图7为本发明另一实施例提供的服务开发工具结构图。本发明实施例提供的服务开发工具可以执行由C/C++生成Java Web服务的方法实施例提供的处理流程,如图7所示,在上述实施例的基础上,所述C/C++头文件是所述服务开发工具对初始头文件进行预处理后的文件,所述服务开发工具50还包括预处理模块90,预处理模块90包括完整性验证子模块91、重复过滤子模块92和合并子模块93,其中,完整性验证子模块91用于对所述初始头文件包含的多个子头文件进行完整性验证;重复过滤子模块92用于若判断获知所述多个子头文件完整,则对所述多个子头文件进行重复过滤,对重复的子头文件只保留一份;合并子模块93用于合并所述多个子头文件和所述初始头文件获得所述C/C++头文件。
本发明实施例通过服务开发工具对初始头文件进行预处理,保证了C/C++头文件的完整性。
图8为本发明另一实施例提供的服务开发工具结构图。本发明实施例提供的服务开发工具可以执行由C/C++生成Java Web服务的方法实施例提供的处理流程,在上述实施例的基础上,服务开发工具50还包括服务元素生成模块100,用于依据所述服务代码生成服务元素,所述服务元素用于生成客户端应用;相应的,服务包生成模块52具体用于依据所述底层代码和所述服务代码生成二进制文件;生成服务包,所述服务包包括二进制文件、所述动态库文件和所述服务元素。
本发明实施例通过生成服务元素,增加了服务包的内容,增加了服务包的应用范围。
图9为本发明另一实施例提供的底层调用类生成子模块的结构图。本发明实施例提供的底层调用类生成子模块可以执行底层调用类生成的处理流程,如图9所示,底层调用类生成子模块71包括解析单元711、遍历单元712和设置单元713,其中,解析单元711用于解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;遍历单元712用于遍历各函数声明,对所述各函数声明生成对应的Java本地方法,将所述各函数声明的参数添加到所述Java本地方法的参数列表中,如果所述参数不是基本数据类型,则将所述参数转换成底层数据类对应的类型;设置单元713用于设置所述Java本地方法的返回值类型,并将所述Java本地方法添加到Java类中,获得所述底层调用类。
图10为本发明另一实施例提供的底层数据类生成子模块的结构图。本发明实施例提供的底层数据类生成子模块可以执行底层数据类生成的处理流程,如图10所示,底层数据类生成子模块72包括设置单元721、遍历单元722、第一生成单元723和第二生成单元724,其中,设置单元721用于设置所述底层数据类的类名与所述C/C++头文件中类声明的类名相同,并设置所述底层数据类的超类名;遍历单元722用于循环遍历所述C/C++头文件中类声明的成员,如果所述成员是函数则生成对应的native方法;如果所述成员是数据则生成与所述数据同类型的成员变量,并对所述成员变量添加getter和setter方法;如果所述成员变量不是基本数据类型,则将所述成员变量的 类型转换为底层数据类对应的类型;第一生成单元723用于生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法;第二生成单元724用于生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法。
第一生成单元723具体用于如果所述底层数据类派生自超类,则调用所述超类的get方法将所述超类中的成员转换为所述服务数据类对应的类型;循环遍历底层数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述服务数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述底层数据类的get方法将所述成员变量转换成所述服务数据类对应的类型;以获得由所述底层数据对象转换成的服务数据对象。
第二生成单元724具体用于如果所述服务数据类派生自超类,则调用所述超类的setAllFields方法将所述超类中的成员转换为所述底层数据类对应的类型;循环遍历服务数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述底层数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述服务数据类的setAllFields方法将所述成员变量转换成所述底层数据类对应的类型;以获得由所述服务数据对象转换成的底层数据对象。
图11为本发明另一实施例提供的服务类生成子模块的结构图。本发明实施例提供的服务类生成子模块可以执行服务类生成的处理流程,如图11所示,服务类生成子模块81包括解析单元811、服务方法生成单元812和实现生成单元813,其中,解析单元811用于解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;服务方法生成单元812用于遍历各函数声明,对所述各函数声明在所述服务类中生成对应的服务方法;实现生成单元813用于生成与所述服务方法对应的实现,以获得所述服务类的代码。
服务方法生成单元812具体用于设置所述服务方法的名称与所述C/C++头文件中函数声明的函数名相同;确定所述服务方法的参数列表和返回值类型;若所述参数列表中的参数为非基本数据类型,将所述参数的类型转换成 所述底层数据类对应的类型;根据所述C/C++头文件中函数声明的返回值,生成调用Java本地方法的代码,以获得与所述Java本地方法对应的所述服务方法。
图12为本发明另一实施例提供的服务数据类生成子模块的结构图。本发明实施例提供的服务数据类生成子模块可以执行服务数据类生成的处理流程,如图12所示,服务数据类生成子模块82包括设置单元821和遍历单元822,其中,设置单元821用于根据所述C/C++头文件中的类声明,设置所述服务数据类的类名和超类名;遍历单元822用于遍历所述C/C++头文件中类声明的成员,如果是所述成员是函数则忽略,否则在所述服务数据类中生成与所述成员同类型的成员变量,并对所述成员变量添加setter方法和getter方法;以获得与所述类声明对应的所述服务数据类。
本发明实施例提供了底层调用类和底层数据类,以及服务类和服务数据类的具体生成算法。
综上所述,本发明实施例通过服务开发工具根据C/C++头文件和C/C++头文件对应的动态库文件自动生成服务包,以供服务器根据服务包生成Web服务,提高了Web服务的生成效率;具体通过服务开发工具依据C/C++头文件生成底层调用类和底层数据类,以及服务类和服务数据类,提供了底层代码和服务代码的生成方式;通过服务开发工具对初始头文件进行预处理,保证了C/C++头文件的完整性;通过生成服务元素,增加了服务包的内容,增加了服务包的应用范围;并且提供了底层调用类和底层数据类,以及服务类和服务数据类的具体生成算法。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并 不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (14)
1.一种由C/C++生成Java Web服务的方法,其特征在于,包括:
服务开发工具接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码用于调用与所述C/C++头文件对应的动态库文件,所述服务代码用于调用所述底层代码;
所述服务开发工具生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述C/C++头文件对应的动态库文件;
所述底层代码包括底层调用类和底层数据类,所述底层调用类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的底层方法组成的,所述底层数据类与C/C++中自定义的类一一对应,用于对所述底层数据类类型和服务数据类类型之间进行相互转换;
所述服务代码包括服务类和服务数据类,所述服务类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的服务方法组成的,所述服务数据类与所述C/C++中自定义的类一一对应;
所述底层调用类按照如下生成算法获得:
解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;遍历各函数声明,对所述各函数声明生成对应的Java本地方法,将所述各函数声明的参数添加到所述Java本地方法的参数列表中,如果所述参数不是基本数据类型,则将所述参数转换成底层数据类对应的类型;设置所述Java本地方法的返回值类型,并将所述Java本地方法添加到Java类中,获得所述底层调用类;
所述服务类按照如下生成算法获得:
解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;遍历各函数声明,对所述各函数声明在所述服务类中生成对应的服务方法;生成与所述服务方法对应的实现,以获得所述服务类的代码;
所述服务方法按照如下生成算法获得:
设置所述服务方法的名称与所述C/C++头文件中函数声明的函数名相同;确定所述服务方法的参数列表和返回值类型;若所述参数列表中的参数为非基本数据类型,将所述参数的类型转换成所述底层数据类对应的类型;根据所述C/C++头文件中函数声明的返回值,生成调用Java本地方法的代码,以获得与所述Java本地方法对应的所述服务方法。
2.根据权利要求1所述的方法,其特征在于,所述C/C++头文件是所述服务开发工具对初始头文件进行预处理后的文件,所述预处理包括:
对所述初始头文件包含的多个子头文件进行完整性验证;
若判断获知所述多个子头文件完整,则对所述多个子头文件进行重复过滤,对重复的子头文件只保留一份;
合并所述多个子头文件和所述初始头文件获得所述C/C++头文件。
3.根据权利要求1所述的方法,其特征在于,所述服务开发工具生成服务包之前,还包括:
所述服务开发工具依据所述服务代码生成服务元素,所述服务元素用于生成客户端应用;相应的,所述服务开发工具生成服务包包括:
所述服务开发工具依据所述底层代码和所述服务代码生成二进制文件;
所述服务开发工具生成服务包,所述服务包包括二进制文件、所述动态库文件和所述服务元素。
4.根据权利要求1所述的方法,其特征在于,所述底层数据类按照如下生成算法获得:
设置所述底层数据类的类名与所述C/C++头文件中类声明的类名相同,并设置所述底层数据类的超类名;
循环遍历所述C/C++头文件中类声明的成员,如果所述成员是函数则生成对应的native方法;如果所述成员是数据则生成与所述数据同类型的成员变量,并对所述成员变量添加getter和setter方法;如果所述成员变量不是基本数据类型,则将所述成员变量的类型转换为底层数据类对应的类型;
生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法;
生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法。
5.根据权利要求4所述的方法,其特征在于,所述生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法包括:
如果所述底层数据类派生自超类,则调用所述超类的get方法将所述超类中的成员转换为所述服务数据类对应的类型;
循环遍历底层数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述服务数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述底层数据类的get方法将所述成员变量转换成所述服务数据类对应的类型;以获得由所述底层数据对象转换成的服务数据对象。
6.根据权利要求4所述的方法,其特征在于,所述生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法包括:
如果所述服务数据类派生自超类,则调用所述超类的setAllFields方法将所述超类中的成员转换为所述底层数据类对应的类型;
循环遍历服务数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述底层数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述服务数据类的setAllFields方法将所述成员变量转换成所述底层数据类对应的类型;以获得由所述服务数据对象转换成的底层数据对象。
7.根据权利要求1所述的方法,其特征在于,所述服务数据类按照如下生成算法获得:
根据所述C/C++头文件中的类声明,设置所述服务数据类的类名和超类名;
遍历所述C/C++头文件中类声明的成员,如果是所述成员是函数则忽略,否则在所述服务数据类中生成与所述成员同类型的成员变量,并对所述成员变量添加setter方法和getter方法;以获得与所述类声明对应的所述服务数据类。
8.一种服务开发工具,其特征在于,包括:
代码生成模块,用于接收C/C++头文件和与所述C/C++头文件对应的动态库文件,根据所述C/C++头文件生成底层代码和服务代码;其中,所述底层代码用于调用与所述C/C++头文件对应的动态库文件,所述服务代码用于调用所述底层代码;
服务包生成模块,用于生成服务包,以供服务器根据所述服务包生成与所述服务包对应的Web服务,所述Web服务包括所述服务代码、所述底层代码以及所述C/C++头文件对应的动态库文件;
所述代码生成模块包括底层代码生成模块和服务代码生成模块,所述底层代码生成模块用于生成底层代码,所述服务代码生成模块用于生成服务代码;
所述底层代码生成模块包括底层调用类生成子模块和底层数据类生成子模块,所述底层调用类生成子模块用于生成底层调用类,所述底层数据类生成子模块用于生成底层数据类;所述底层调用类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的底层方法组成的,所述底层数据类与C/C++中自定义的类一一对应,用于对所述底层数据类类型和服务数据类类型之间进行相互转换;
所述服务代码生成模块包括服务类生成子模块和服务数据类生成子模块,所述服务类生成子模块用于生成服务类,所述服务数据类生成子模块用于生成服务数据类;所述服务类是由所述服务开发工具依据所述C/C++头文件中的函数声明生成的与所述函数声明对应的服务方法组成的,所述服务数据类与所述C/C++中自定义的类一一对应;
所述底层调用类生成子模块包括:
解析单元,用于解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;
遍历单元,用于遍历各函数声明,对所述各函数声明生成对应的Java本地方法,将所述各函数声明的参数添加到所述Java本地方法的参数列表中,如果所述参数不是基本数据类型,则将所述参数转换成底层数据类对应的类型;
设置单元,用于设置所述Java本地方法的返回值类型,并将所述Java本地方法添加到Java类中,获得所述底层调用类;
所述服务类生成子模块包括:
解析单元,用于解析所述C/C++头文件,获得所述C/C++头文件中的所有函数声明;
服务方法生成单元,用于遍历各函数声明,对所述各函数声明在所述服务类中生成对应的服务方法;
实现生成单元,用于生成与所述服务方法对应的实现,以获得所述服务类的代码;
所述服务方法生成单元具体用于设置所述服务方法的名称与所述C/C++头文件中函数声明的函数名相同;确定所述服务方法的参数列表和返回值类型;若所述参数列表中的参数为非基本数据类型,将所述参数的类型转换成所述底层数据类对应的类型;根据所述C/C++头文件中函数声明的返回值,生成调用Java本地方法的代码,以获得与所述Java本地方法对应的所述服务方法。
9.根据权利要求8所述的服务开发工具,其特征在于,所述C/C++头文件是所述服务开发工具对初始头文件进行预处理后的文件,所述服务开发工具还包括预处理模块,所述预处理模块包括:
完整性验证子模块,用于对所述初始头文件包含的多个子头文件进行完整性验证;
重复过滤子模块,用于若判断获知所述多个子头文件完整,则对所述多个子头文件进行重复过滤,对重复的子头文件只保留一份;
合并子模块,用于合并所述多个子头文件和所述初始头文件获得所述C/C++头文件。
10.根据权利要求8所述的服务开发工具,其特征在于,还包括:
服务元素生成模块,用于依据所述服务代码生成服务元素,所述服务元素用于生成客户端应用;
所述服务包生成模块具体用于依据所述底层代码和所述服务代码生成二进制文件;生成服务包,所述服务包包括二进制文件、所述动态库文件和所述服务元素。
11.根据权利要求8所述的服务开发工具,其特征在于,所述底层数据类生成子模块包括:
设置单元,用于设置所述底层数据类的类名与所述C/C++头文件中类声明的类名相同,并设置所述底层数据类的超类名;
遍历单元,用于循环遍历所述C/C++头文件中类声明的成员,如果所述成员是函数则生成对应的native方法;如果所述成员是数据则生成与所述数据同类型的成员变量,并对所述成员变量添加getter和setter方法;如果所述成员变量不是基本数据类型,则将所述成员变量的类型转换为底层数据类对应的类型;
第一生成单元,用于生成所述底层数据类对应的类型转换为所述服务数据类对应的类型的方法;
第二生成单元,用于生成所述服务数据类对应的类型转换为所述底层数据类对应的类型的方法。
12.根据权利要求11所述的服务开发工具,其特征在于,所述第一生成单元具体用于如果所述底层数据类派生自超类,则调用所述超类的get方法将所述超类中的成员转换为所述服务数据类对应的类型;循环遍历底层数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述服务数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述底层数据类的get方法将所述成员变量转换成所述服务数据类对应的类型;以获得由所述底层数据对象转换成的服务数据对象。
13.根据权利要求11所述的服务开发工具,其特征在于,所述第二生成单元具体用于如果所述服务数据类派生自超类,则调用所述超类的setAllFields方法将所述超类中的成员转换为所述底层数据类对应的类型;循环遍历服务数据对象的成员变量,如果所述成员变量是基本数据类型,则将所述成员变量直接转换为所述底层数据类对应的基本数据类型;如果所述成员变量是基本类型指针,则将所述成员变量转换成基本类型的数组;如果所述成员变量是复杂数据类型或者是类指针,则通过所述服务数据类的setAllFields方法将所述成员变量转换成所述底层数据类对应的类型;以获得由所述服务数据对象转换成的底层数据对象。
14.根据权利要求8所述的服务开发工具,其特征在于,所述服务数据类生成子模块包括:
设置单元,用于根据所述C/C++头文件中的类声明,设置所述服务数据类的类名和超类名;
遍历单元,用于遍历所述C/C++头文件中类声明的成员,如果是所述成员是函数则忽略,否则在所述服务数据类中生成与所述成员同类型的成员变量,并对所述成员变量添加setter方法和getter方法;以获得与所述类声明对应的所述服务数据类。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410232055.5A CN104020992B (zh) | 2014-05-28 | 2014-05-28 | 由C/C++生成Java Web服务的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410232055.5A CN104020992B (zh) | 2014-05-28 | 2014-05-28 | 由C/C++生成Java Web服务的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104020992A CN104020992A (zh) | 2014-09-03 |
CN104020992B true CN104020992B (zh) | 2017-06-06 |
Family
ID=51437767
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410232055.5A Active CN104020992B (zh) | 2014-05-28 | 2014-05-28 | 由C/C++生成Java Web服务的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104020992B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106886563B (zh) * | 2016-12-30 | 2020-11-10 | 北界无限(北京)软件有限公司 | 一种广告过滤方法及装置 |
CN108304194B (zh) * | 2017-09-01 | 2021-08-20 | 潍柴动力股份有限公司 | 一种程序的生成方法、装置及电子设备 |
CN110597503A (zh) * | 2019-09-19 | 2019-12-20 | 湖南长城医疗科技有限公司 | 基于C#语言的自动构建web服务工具包的方法 |
CN111338637A (zh) * | 2020-02-26 | 2020-06-26 | 腾讯科技(深圳)有限公司 | 一种代码生成方法及装置 |
CN111459489B (zh) * | 2020-02-27 | 2023-09-26 | 湖南大学 | 一种动态库自动服务化封装方法、系统及应用 |
CN111506357A (zh) * | 2020-02-27 | 2020-08-07 | 湖南大学 | 一种动态库自动加载方法、系统及应用 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101840334A (zh) * | 2010-04-16 | 2010-09-22 | 中国电子科技集团公司第二十八研究所 | 一种软件构件服务化封装方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8615731B2 (en) * | 2004-08-25 | 2013-12-24 | Mohit Doshi | System and method for automating the development of web services that incorporate business rules |
US8527577B2 (en) * | 2007-05-22 | 2013-09-03 | Oracle International Corporation | System and method for configuration-driven deployment |
-
2014
- 2014-05-28 CN CN201410232055.5A patent/CN104020992B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101840334A (zh) * | 2010-04-16 | 2010-09-22 | 中国电子科技集团公司第二十八研究所 | 一种软件构件服务化封装方法 |
Non-Patent Citations (1)
Title |
---|
A Code Generation Toolkit for C++ Web Services Development;Xiangye Ji;《2013 Third International Conference on Intelligent System Design and Engineering Applications(IEEE)》;20130118;第17-21页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104020992A (zh) | 2014-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104020992B (zh) | 由C/C++生成Java Web服务的方法及装置 | |
CN103164249B (zh) | 用于脚本语言编译器的扩展机制 | |
CN104156313A (zh) | 一种Web服务测试用例自动生成方法 | |
Kapitsaki et al. | Model-driven development of composite context-aware web applications | |
CN102368217A (zh) | 一种元数据驱动的rest风格应用开发方法与系统 | |
CN110187902A (zh) | 基于spring boot的项目改造方法、装置、设备及存储介质 | |
CN102141991A (zh) | 用于web服务器的方法和系统 | |
Zhang et al. | Aspect Composition in the Motorola Aspect-Oriented Modeling Weaver. | |
CN103581310B (zh) | 一种web服务代理的自动生成方法 | |
US20130125093A1 (en) | Generating object-oriented programming language code from a multi-domain dynamic simulation model | |
Prehofer et al. | Modeling restful web of things services: Concepts and tools | |
CN101751332B (zh) | 工作流中间件的流程仿真方法、装置及系统 | |
Kapova et al. | Application of advanced model-driven techniques in performance engineering | |
Gérard et al. | The uml–marte standardized profile | |
Baker et al. | Facilitating semantic adaptation of web services at runtime using a meta-data layer | |
Cristiá et al. | On comparing and complementing two MBT approaches | |
Tragatschnig et al. | Runtime process adaptation for bpel process execution engines | |
Sabetta et al. | Abstraction-raising transformation for generating analysis models | |
Masciadri et al. | Frameworks for the development of adaptive systems: Evaluation of their adaptability feature through software metrics | |
CN115242871B (zh) | 业务网关的服务方法及装置、存储介质及电子设备 | |
Kövesdán et al. | Modeling Cloud Messaging with a Domain-Specific Modeling Language. | |
Perseil et al. | An efficient modeling and execution framework for complex systems development | |
Krauweel | Concurrent and asynchronous JavaScript programming using Reo | |
Lin et al. | Towards verifying VDM using SPIN | |
CN117573201A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |