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

    微软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。