[英]Pass byte array from Unity C# to C++ plugin
我正在尝试将原始纹理数据从Texture2D(字节数组)传递给非托管C ++代码。 在C#代码数组中,长度约为1,5kk,但是在C ++中,“ sizeof”始终返回8。
原生方法的C#声明:
[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr ProcessData(byte[] data);
C ++:
extern "C" {
__declspec(dllexport) void ProcessData(uint8_t *data) {
//sizeof(data) is always 8
}
}
我究竟做错了什么? 有没有一种方法可以在C ++代码中传递数组而无需分配额外的内存?
您需要使用当前代码完成的几件事:
1。您必须使用UnholySheep提到的另一个参数将数组的大小发送到C ++插件。
2。在将数组发送到C ++端之前,还必须将其固定。 这是通过fixed
关键字或GCHandle.Alloc
函数完成的。
3。如果C ++函数具有void返回类型,则您的C#函数也应具有void返回类型。
下面是您的代码的更正版本。 不执行其他内存分配。
C#:
[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)]
static extern void ProcessData(IntPtr data, int size);
public unsafe void ProcessData(byte[] data, int size)
{
//Pin Memory
fixed (byte* p = data)
{
ProcessData((IntPtr)p, size);
}
}
C ++:
extern "C"
{
__declspec(dllexport) void ProcessData(unsigned char* data, int size)
{
//sizeof(data) is always 8
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.