2017-08-18 78 views
0

我正在使用unity3d進行遊戲項目。
現在我試圖將結構從C++傳遞給C#。
結構在C++中象下面這樣:Android上的Marshal.PtrToStructure返回null

#pragma pack(push) 
#pragma pack(1) 
class BuildData 
{ 
public: 
    int m_ID; 
    int m_BuildType; 
    int m_NameID; 
    int m_DescriptionID; 
    int m_BuildLV; 
    int m_Group;  
    unsigned char m_OpenFlag; 
    unsigned char m_ShowFlag; 
    float m_UIDisplaySize;  
}; 
#pragma pack(pop) 

在unity3d C#項目,我宣佈類似的結構。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] 
public struct BuildData 
{ 
    public int m_ID;     
    public int m_BuildType;   
    public int m_NameID;    
    public int m_DescriptionID;  
    public int m_BuildLV;    
    public int m_Group;   
    [MarshalAs(UnmanagedType.U1)]  
    public bool m_OpenFlag;  
    [MarshalAs(UnmanagedType.U1)]   
    public bool m_ShowFlag; 
    [MarshalAs(UnmanagedType.R4)] 
    public float m_UIDisplaySize;  
}; 

而我使用下面的代碼來獲取數據。

System.IntPtr ptr = MethodToGetIntPtr(); 
BuildData convert_data = (BuildData)Marshal.PtrToStructure(ptr, typeof(BuildData)); 

它適用於pc和android x86,但在android armeabi上,它失敗。
我得到一個不等於IntPtr.zero的IntPtr,但是Marshal.PtrToStructure將返回null。

我不知道爲什麼有這個結果。
有人可以回答嗎?

+0

感謝您的快速回復,您是對的。 你的答案後,我添加兩個字段的結構,並得到相同的結果(返回null)。 我更新了我的問題。 – hsienwei

+0

我認爲你不應該在這裏根據回答更新你的問題,否則將來的ppl會引起你對問題的困惑。 – Nipun

+0

我會發佈一個新問題。謝謝。 – hsienwei

回答

1

等效於unsigned charC#System.Byte
C#中更改您的數據類型將解決您的問題。
您可以查看link瞭解更多詳情。