您的位置:首页 > 新闻动态 > 技术文章

微软HoloLens调用C++ DLL封装可以吗?

来源: 2019/7/20      点击:
一、C++ Dll基础了解
动态链接库(dll)比较好的介绍在孙鑫《VC++深入详解》第十九章动态链接库中有详细介绍。主要涉及以下问题:
1.静态链接库与动态链接库的区别
①静态链接库编译的时候加载;
②动态链接库运行的时候加载。
2.dll的显式调用和隐式调用
①dll隐式加载:需要.h,.lib,.dll文件
①dll显式加载:只需要.dll文件
3.dll名字改编问题
4.动态链接库导出类与导出函数
SCR5逆运动算法C++ DLL封装,具体是导出类还是导出函数,根据导出类与函数的区别:
导出类的优点:类可继承,层次清晰、完整;
导出类的缺点:不能被其他语言调用,封装性不好。
导出函数的优点:可以被其他语言调用,封装性好;
导出函数的缺点:层次混乱。
考虑到dll需要被其他语言调用,需要在Unity和AR眼镜中被调用,故而以导出函数的方式封装。
二、算法C++ DLL封装
1.打开VS打开VS2015,创建一个Win32项目,命名为Ikine_analyze_dll
2.添加Ikine_analyze_dll.h和Ikine_analyze_dll.cpp文件
3.在Ikine_analyze_dll.h中编写逆运动算法函数接口,并添加dll名字改编
4.在Ikine_analyze_dll.cpp中编写逆运动算法函数实现
5.配置Debug或者Release以及平台X86和X64
5.点击生成->生成解决方案,于是创建完成dll.
三、win32控制台中使用方法
采用dll隐式调用方法调用dll。
1.创建win32控制台程序Test
2.将Ikine_analyze_dll.h和Ikine_analyze_dll.lib文件拷贝到工程目录下
3.添加.h包含目录和lib库目录
4.添加附加依赖项Ikine_analyze_dll.lib
5.编写main代码,其中若添加#pragmacomment(lib,"Ikine_analyze_dll.lib"),则不需要进行3和4的包含及库目录配置
6.运行程序出现错误
7.将Ikine_analyze_dll.dll文件拷贝到debug或者release文件夹下,再次运行
四、Unity中使用方法
https://blog.csdn.net/wuquanl/article/details/72052207
1. 将x64 release文件夹下生成的Ikine_analyze_dll.dll复制到unity项目Assets\Plugins文件夹
2.在unity添加TestDebug.cs测试脚本如下,注意需要:
①using System.Runtime.InteropServices;
②使用[DllImport("Dll名字")]指明要引用的DLL,然后声明要使用的DLL中的方法。
3.运行unity,测试是否调用成功
可看出debug.log的数值与WIN32控制台运行的结果完全一致,同时机器人姿态也是正确的,说明在PC上unity中调用逆运动C++ dll算法成功返回数值。
五、AR眼睛中使用问题
1.将unity的程序烧写到HoloLensAR眼镜中,运行时候发现机器人姿态与数值与unity中运行的结果和数值完全不同。
2.返回unity中,将调用dll Ikine_RPY的这句函数注释掉
int i=Ikine_RPY( T_rpy,  JointVelo,  Psi_UserDefined,  Psi_Optimal, Joint,  Psi_Desired);
3.运行unity,发现数值和姿态与AR眼镜中相同。说明AR眼镜并没有调用到C++dll文件。
4.为了判断是否是C++dll编写错误,写了简单的c++ 返回a+b的测试试验,结果结论与以上完全相同,在PC  unity中可以运行并正确取值,在AR眼镜中运行毫无结果。故而断定AR眼镜中不支持C++  dll的调用。查看unity中调用的dll,发现全是c#类库的dll。 
六、AR眼镜是否支持C#封装的dll测试
1.创建C#类库,.net  framework版本不要高于3.5
2.修改文件名称并编写测试代码
3.生成->生成解决方案,找到dll
4.在unity中测试a+b的返回结果
5.在AR中测试a+b的返回结果,与PC上unity的返回结果一致。说明AR眼镜可调用C#类库dll.
七、总结
1.PC上unity可调用C++ DLL以及C#类库DLL;

2.AR眼镜 HoloLens不支持调用C++ DLL,但是支持调用C#类库DLL。