因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数据类型的对应,还有结构体的封装使用。在夸语言调用方面,Java和C#都只能调用C格式导出的动态库,因为C数据类型比较单一,容易映射,两者都是在本地端提供一套与之映射的C#或者Java的描述接口,通过底层处理这种映射关系达到调用的目的。
一. 结构体的传递
#define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数
typedef struct
{
int osVersion;
int majorVersion;
int minorVersion;
int buildNum;
int platFormId;
char szVersion[128];
}OSINFO;
//获取版本信息(传递结构体指针)
JNAAPI bool SetVersionPtr(OSINFO *info)
{
char * str = "Hello DLL";
info->osVersion = 100;
strcpy(info->szVersion, str);
return true;
}
//获取版本信息(传递结构体引用)
JNAAPI bool SetVersionRef(OSINFO &info)
{
char * str = "Hello DLL";
info.osVersion = 101;
strcpy(info.szVersion, str);
return true;
}
在C#下对应的结构体定义:
// OSINFO定义
[StructLayout(LayoutKind.Sequential)]
public struct OSINFO
{
public int osVersion;
public int majorVersion;
public int minorVersion;
public int buildNum;
public int platFormId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string szVersion;
}
可以通过两种方式来调用非托管的函数SetVersionPtr:
1. 方式一(传入结构体引用),在C#中&#