[英]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.