Pass byte array from Unity C# to C++ plugin

扶醉桌前 提交于 2019-11-26 11:28:29

问题


I\'m trying to pass raw texture data from Texture2D (byte array) to unmanaged C++ code. In C# code array length is about 1,5kk, however in C++ \'sizeof\' always returns 8.

C# declaration of native method :

[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
    }
}

What am I doing wrong? Is there is a way to pass array without additional memory allocation in C++ code?


回答1:


Few things you need to do with your current code:

1.You have to send the size of the array to the C++ plugin in another parameter as UnholySheep mentioned.

2.You also have to pin the array before sending it to the C++ side. This is done with the fixed keyword or GCHandle.Alloc function.

3.If the C++ function has a void return type, your C# function should also have the void return type.

Below is a corrected version of your code. No additional memory allocation is performed.

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
    }
}


来源:https://stackoverflow.com/questions/46527470/pass-byte-array-from-unity-c-sharp-to-c-plugin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!