Unity调用C++编写的dll传递数组

       主要是最近在Unity里想调用一个自己用C++写的dll,然后传递一下数组。结果自己知识浅薄,竟然连IntPtr也不大会用。但是最后终于还算是实现了想要的功能。在这里记录一下,以后再遇到类似的情况直接翻出来看看代码就行了。

       首先是以数组作为返回值的情况。具体的怎么建dll工程就不说了,只记录一下部分比较重要的代码,大概之后能看懂意思,再照着改就好了。C++的代码如下,首先是头文件里的声明:

#define DLL_EXPORT extern "C" __declspec(dllexport)

DLL_EXPORT int* GetA();

然后是cpp文件(那个叫b的变量就先放这了。。。):

int b[3] = {4, 5, 67};

int* GetA()
{
	int* a = &b[0];
	return a;
}

接着就是unity中的脚本了,使用的是C#,记得using System以及using System.Runtime.InteropServices:

[DllImport("_____")]  // 这里面填dll的名字
private static extern IntPtr GetA();

// Use this for initialization
void Start () {
    Debug.Log((Marshal.ReadInt32(GetA(), 8)).ToString());
}

为什么里面的参数是8?因为此次测试想得到b[2]的结果,需要偏移两个int32的字节数,一个int32是4个字节。

然后最后的运行结果:

Unity调用C++编写的dll传递数组_第1张图片


再来记录一下参数里有数组的情况。把上面的dll里的代码改一下,声明的部分就不贴了,道理都差不多。

int GetA(int* a)
{
	return *(a + 2);
}

这段测试代码主要是为了给定数组第0个元素的地址,然后输出其第2个元素的数值。查了一下C#和C++的数据类型的对应关系,发现可以使用按引用传递的ref关键字,所以C#部分的代码如下:

 [DllImport("_____")]  // 这里面填dll的名字
 private static extern int GetA(ref int a);

 // Use this for initialization
 void Start () {
     int[] array = new int[] { 2, 45, 23, 43, 25 };
     Debug.Log(GetA(ref array[0]).ToString());
 }
在Unity里期望的输出结果为23,运行了一下代码

Unity调用C++编写的dll传递数组_第2张图片

这样想要的功能就能实现了。功能是实现了,但是对于可能会出现的一些其他问题,就等之后再说吧。主要是本人水平太有限了,还需要继续学习。


你可能感兴趣的:(Unity调用C++编写的dll传递数组)