一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法与流程

文档序号:15992514发布日期:2018-11-20 18:11阅读:322来源:国知局
一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法与流程

本发明属于托管代码领域,涉及一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法。



背景技术:

所谓托管代码是微软的术语,源于.NET专业程序开发平台,例如C#就是这样一种软件开发语言,其基于CLR(common language runtime)库运行程序;JAVA也是类似托管的一种开发语言平台,其基于JVM(Java Virtual Machine)虚拟机运行程序。托管语言开发的程序有自动内存垃圾回收机制,运行速度相对比C/C++程序慢,但开发速度快,运行时较安全可靠。在C#/JAVA开发中常常需要调用C/C++实现的函数库,这样托管代码的优势和C/C++语言的优势可以无缝结合了。C#调用C/C++函数使用的方法称为P/Invoke,而JAVA采用JNI方法调用C/C++函数。

C#/JAVA和C/C++之间的基本数据类型有着显著的差异,而且C/C++具有灵活的自定义结构;C#也有自定义的结构类型,但和C/C++显然不一样,JAVA是使用类来定义结构的,但JAVA的类的形式和C++的类是不一样的。所有这些差异导致在C#/JAVA调用C/C++函数时常常使用与C#/JAVA内置的基本数据类型一致的数据规格,例如使用整型、浮点型变量。如果C/C++的函数参数是字符型,那么一定要使用宽字符,因为C#中的char型默认是双字节的。

C/C++、C#、和JAVA数据类型的不完全比较(表格中数字表示字节数),参照表1:

表1

表1显示了各开发语言在基本数据类型的字节长度的差异,尤其虽然各自有自定义的数据结构的功能,但结构在形式上是不一样的。

通过上面的分析,我们知道在C/C++中实现复杂的数据结构的输入输出时,这样的函数很难直接被C#/JAVA调用,必须要将参数转化为仅仅使用基本类型的形式,但这样的设计往往增加了接口函数的数目、复杂度,不利于对代码作优良的维护,以及对数据设计概念的传递和保持。



技术实现要素:

为了克服已有C/C++中实现复杂的数据结构的输入输出时很难直接被C#/JAVA调用的不足,本发明提供了一种简化接口复杂度、代码维护优良的类托管代码调用C/C++风格函数的复杂结构的参数设计方法。

本发明解决其技术问题所采用的技术方案是:

一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,C/C++端作为被调用端,C#/Java端作为调用端,所述参数设计方法包括如下步骤:

1)在调用端中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;

2)取出字符串中的字符组成数组,末尾以“\0”作结束;

3)传入接口函数;

4)在被调用端将字符数组转成字符串;

5)建立JSON字符串解析模块,生成对应的调用端的自定义的结构变量;

6)向被调用端输出信息时,将输出信息生成JSON字符串;

7)取出字符串中的字符组成数组,末尾以“\0”作结束;

8)将数组地址赋值给输出参数指针。

进一步,所述步骤1)中在结构变量转成JSON消息时,以及所述步骤5)中JSON消息解析生成C#/JAVA的自定义结构变量时;结构变量中每一个分量的变量名作“名称”,分量的取值作值;如果分量类型也是一个子结构,那么对该结构预先作好“名称/值”配对的集合,然后将该子结构变量定义为一个新的名称,该子结构的“名称/值”对集合就是它的值。

本发明的技术构思为:基于宽字符数组开发了一套适用于任意复杂度结构的参数形式化设计方法,而且支持在C/C++和C#/JAVA之间无缝传递。

依赖于JSON这种数据交换的格式协议。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java,JavaScript,Perl,Python等)。这些特性使JSON成为理想的数据交换语言。JSON建构于两种结构:“名称/值”对的集合、值的有序列表。“名称/值”之间使用“:”分离,值之间使用“,”分离。

本发明的有益效果主要表现在:简化接口复杂度、代码可维护性较好。

附图说明

图1是支持任意复杂结构的JSON化参数设计原理图。

具体实施方式

下面结合附图对本发明作进一步描述。

参照图1,一种类托管代码调用C/C++风格函数的复杂结构的参数设计方法,C/C++端作为被调用端,C#/Java端作为调用端,所述参数设计方法包括如下步骤:

1)在调用端中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;

2)取出字符串中的字符组成数组,末尾以“\0”作结束;

3)传入接口函数;

4)在被调用端将字符数组转成字符串;

5)建立JSON字符串解析模块,生成对应的调用端的自定义的结构变量;

6)向被调用端输出信息时,将输出信息生成JSON字符串;

7)取出字符串中的字符组成数组,末尾以“\0”作结束;

8)将数组地址赋值给输出参数指针。

本实施例中,调用端需要给被调用端输入信息,被调用端需要输出一些信息给调用端。

本实施例中,在C/C++中的接口函数原型为

Void InterfaceFunc(wchar*in_message,int inlen,wchar*out_message,int outlen);

而在C#/JAVA的接口设计为

Void InterfaceFunc(char*in_message,int inlen,char*out_message,int outlen);

即使用JAVA/C#的双字节Char型和C/C++中的宽字符wchar对接,inlen/outlen是输入输出字符串的长度(字符的数目),字符数据取自于字符串,末尾为“\0”作结束。

实现步骤,以实现输入参数为例:

1)在C#/Java中建立JSON字符串生成模块,对自定义的结构变量生成对应的JSON消息文本字符串;

2)取出字符串中的字符组成数组,末尾以“\0”作结束;

3)传入接口函数;

4)在C/C++端将字符数组转成字符串;

5)建立JSON字符串解析模块,生成对应的C#/JAVA的自定义的结构变量。

6)向C#/JAVA端输出信息时,将输出信息生成JSON字符串;

7)取出字符串中的字符组成数组,末尾以“\0”作结束;

8)将数组地址赋值给输出参数指针。

在结构变量转成JSON消息时,结构变量中每一个分量的变量名作“名称”,分量的取值作值;如果分量类型也是一个子结构,那么对该结构预先作好“名称/值”配对的集合,然后将该子结构变量定义为一个新的名称,该子结构的“名称/值”对集合就是它的值。在JSON消息解析生成C#/JAVA的自定义结构变量时对结构内嵌的子结构作相应的处理。

对于参数输出的情况类似,只是在C/C++端进行JSON消息的生成,而在C#/JAVA端实现对JSON消息的解析。

实例:对一条数字地图的路径的数据结构的模拟,

在C/C++中的表示:

在C#/JAVA端解析JSON消息包时自然可以通过through_address的取值数目知道路径途径点的数目。

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