關於從android平臺porting到iOS手機上遇到的JIT錯誤~
ExecutionEngineException: Attempting to JIT compile method '...' while running with --aot-only.
因為在iOS平臺, Mono是以Full AOT模式執行, 但iOS禁止JIT編譯, 於是引發了這個異常
參考資料:
http://www.mono-project.com/docs/advanced/aot/
http://www.lai18.com/content/8793318.html
這個錯誤會發生在執行了某些function之後:
Marshal.StructureToPtr();
Marshal.PtrToStructure();
但使用這些function時不是一定會發生錯誤
如何避免這個錯誤:
1.不能用class, 只能用struct
2.不能用array
如果struct內需要用array, 則要手動把struct轉成byte array, byte array轉成struct
協定struct宣告要點
1.Struct要序列化並控制unmanaged記憶體的配置
[Serializable]
[StructLayout(LayoutKind.Sequential, Pack = 1)]
2.字串要使用string來操作
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PLAYER_NAME_LEN)]
public string name;
3.array宣告方式
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ITEM_COUNT)]
public UINT[] count;
協定轉換方式:
1.使用Marshal自動轉換
收協定使用Marshal.PtrToStructure
送協定使用Marshal.StructureToPtr
2.手動轉換
收協定使用Marshal.PtrToStructure、BitConverter
送協定使用Marshal.StructureToPtr、Buffer.BlockCopy、BitConverter.GetBytes