unity中调用dll动态库(基于OpenCV)

声明:内容非原创,为多家整合版

一,下载OpenCV并配置VS2017环境

网上很多教程,此处主要不是研究这个

二,创建DLL动态库

1、本文用的是vs2017,建立新项目”Dll1.dll”

2、在VS2017开发界面中,右键单击“解决方案”里面“Dll1”项目下的“头文件”目录,新建头文件“dll1.h”

 

3、Windows中,定义在dll中的变量、函数和类,如果希望让别的程序能够访问。必须通过manifest文件指定导出目标(变量、函数或类)或者通过_declspec(dllimport)关键字指定需要导出的目标,然后在使用dll的程序中通过_declspec(dllimport)关键字指定导入的目标。

本文使用_declspec()定义导出/导入目标是最方便的做法,因此,可以继续向“dll1项目”中添加一个头文件 “export.h”,然后添加自适应导出/导入目标的宏。

 

#pragma once

#ifndef EXPORT_H
#define EXPORT_H
#ifndef EXPORT_DLL
#define EXPORT_API __declspec(dllimport)
#else
#define EXPORT_API __declspec(dllexport)
#endif // !EXPORT_DLL
#endif // !EXPORT_H

4、鼠标选中DLL1项目右键“属性”,打开Dll1项目的属性页窗口;

 

在“预处理器定义”右侧的属性值中增加“EXPORT_DLL”。

5、打开 “dll1.h”文件,使用#include包含“export.h”头文件,然后使用EXPORT_API声明一个名为高斯模糊Gauss()的DLL导出函数。

#pragma once
#ifndef DLL1_H
#define DLL_H
#include "export.h"
//声明一个在控制台中输出的函数
extern	"C" EXPORT_API void Gauss();//高斯模糊
//EXPORT_API void Gauss();
#endif // !DLL1_H

 

这个地方要注意前面的extern“c”,如果没有就会导致后面在unity调用dll动态库的时候找不到文件入口,这是因为C++源代码中的函数在编译成DLL后,函数的名称就发生了改变,会在函数的前后产生一些字符,所以找不到方法的入口点。

还有一个叫EXESCOPE的反编译软件来查看C++编译后的函数名称是什么,但是这个软件英文版的在网上不太好找,中文版的还不行。所以采用extern“c”的方法。

6、最后是打开dll1.cpp文件,这里就是实现高斯模糊GaussianBlur的函数本体。

// Dll1.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
#include "dll1.h"
#include<opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include"opencv2/imgproc/imgproc.hpp"  
#include <stdio.h> 
using namespace cv;
void Gauss()//引用的高斯模糊函数
{
	Mat src, dst;//初始化一个操作对象
	src = imread("C:/Users/JAY/Desktop/Others/tang.jpg");//读入图像

	namedWindow("加载的图片", WINDOW_AUTOSIZE);//原图窗口
	imshow("加载的图片", src);//""内命名一致,才能显示在一个窗口

	GaussianBlur(src, dst, Size(7, 7), 0, 0);//高斯模糊
	imshow("高斯模糊后的图片", dst);//显示结果

	waitKey(0);
}

 

7、生成解决方案,等待全部编译通过

三,创建控制台程序

由于DLL项目是无法独立运行的,所以为了测试DLL,需要创建控制台程序调用DLL。

1、右键单击左侧列表中“解决方案”,然后在弹出菜单中选择“添加 > 新建项目”,向解决方案中添加一个新的控制台项目。

2、将控制台项目设置为启动项目,这样每当运行程序时,启动的就是这个新创建的控制台项目

3、编写主函数main的内容,调用高斯模糊函数。

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include "pch.h"
//#include "stdafx.h"
//#include <stelib.h>
#include <iostream>
#include "F:\OneDrive\cs\Dll1\Dll1\dll1.h"//注意文件位置

int main()
{
	Gauss();//调用高斯模糊函数

	system("pause");
	return 0;
}

 

四,配置动态库

1、设置控制台项目ConsoleApplication1依赖Dll1项目。这样可以保证每次编译ConsoleApplication1时,编译器总会自动先编译Dll1项目,保证Dll1总是最新的。

2、打开控制台项目的属性页,在“附加库目录中”添加“$(OutDir)”

3、在“附加依赖项”中填入“dll1.lib”。告诉编译器需要链接dll1.lib,进而加载我们需要的“Dll1.dll”。

符号链接库“Dll1.lib”和动态链接库“Dll1.dll”。在另一个项目中加载“Dll1.dll”文件,那么通过链接“Dll1.lib”是最简便的方式。

4、生成解决方案,运行程序成功。

五,unity调用DLL动态库

1、新建unity项目,在Assets文件夹下新建插件文件夹“Plugins”,并将四.3文件夹下的动态链接库“Dll1.dll”导入。

2、在Assets文件夹下新建C#脚本“CsDll”。

 

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CsDll : MonoBehaviour//注意和文件名命名一致
{

    [DllImport("Dll1")]//使用[DllImport("Dll名字")]指明要引用的DLL,然后声明要使用的DLL中的方法。
    private static extern void Gauss();

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void OnGUI()//按钮
    {
        if (GUILayout.Button("cs c++ dll"))
        {
            Gauss();
            Debug.Log("dll");
        }
    }
}

3、unity中的脚本文件必须要将脚本附着在某个物体上才能执行。点击脚本拖到MainCamera的Inspector下。

4、执行程序,显示结果。

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值