使用C#在Unity3d中使用指针调用C函数

时间:2017-12-29 09:38:52

标签: c# c unity3d

我想在Unity3d中使用C插件。

这是我想要使用的C函数。

DECODE_EXPORT CMDecoderFrame* DECODE_CALL CMAllocFrame(CMDecoderCtx *ctx);

CMDecoderOptions是一个结构如下。

struct CMDecoderFrame {
int nVertex;                // number of vertices      
int nVertexBufferSize;      

int nUvBufferSize;          
float* pVertexBuffer;       // pointer to vertex data
float* pUvBuffer;           // pointer to uv data

int nIndex;                 // number of indices
int nIndexBufferSize;       
int32_t* pIndexBuffer;      // pointer to index data

int iFrame;             
int iSegment;               

CMDecoderTexture texture;   
};

我对C#不熟悉,所以我不知道如何处理这些指针,包括函数返回值和struct中的指针。

我在C#中尝试了一个解决方案,但它不能很好地工作。

struct CMDecoderFrame {
public int nVertex;             // number of vertices      
public int nVertexBufferSize;       

public int nUvBufferSize;          
public float[] pVertexBuffer;       // pointer to vertex data
public float[] pUvBuffer;           // pointer to uv data

public int nIndex;                  // number of indices
public int nIndexBufferSize;        
public int[] pIndexBuffer;      // pointer to index data

public int iFrame;              
public int iSegment;                

public CMDecoderTexture texture;    
};

[DllImport("DecodePlugin")]
private static extern IntPtr CMAllocFrame(ref CMDecoderCtx ctx);

使用C#调用。

    CMDecoderFrame m_frame = new CMDecoderFrame();
    IntPtr frame_ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CMDecoderFrame)));
    frame_ptr = CMAllocFrame(ref ctx);
    m_frame = (CMDecoderFrame)Marshal.PtrToStructure(frame_ptr, typeof(CMDecoderFrame));
    Marshal.FreeHGlobal(frame_ptr);

问题:我似乎需要在结构中添加[MarshalAs(UnmanagedType.ByValArray, SizeConst = ?)]到数组。但我不知道大小,实际上C函数就是这么做的。

有没有人有一个很好的解决方案来处理这种情况,用Unity中的很多指针来调用c函数?

非常感谢!

0 个答案:

没有答案