我想在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函数?
非常感谢!