由于Unity的iOS版本需要為了運行效率,需要應用il2cpp模式。
但是RakNet該網絡庫的一些接口通過il2cpp導出之后,會出現bug。
最開始的方案是想導入libRakNet.a靜態(tài)庫,該庫通過xcode編譯成iOS版本。
該libRakNet.a庫,應用于原生的ObjectC工程是沒問題,但是應用到unity通過il2cpp之后,就出現連接不成功的情況。
進一步分析:在服務器上單步之后,發(fā)現服務器可以接收到請求連接的消息,但是接收到的消息頭解析是錯亂的。
也在stackOver上找到了別人也有遇到過類似問題,詳細;
修改方案是將 DatagramHeaderFormat 結構體中的 serialize 方法名字重命名下,在文件ReliabilityLayer.cpp 重新編譯成靜態(tài)庫之后,發(fā)現請求協議頭解析是改正確了。
但是連接還是不成功。
繼續(xù)分析,發(fā)現是服務器在請求處理連接請求的時候,會把該客戶端還沒完成三次握手的情況下,將該客戶端判定為超時,直接關閉該連接。
懷疑還是在connection_time的指通過il2cpp導出的C++代碼中還存在問題。因為要的比較急,就沒有繼續(xù)研究下去,基本上可以確定是il2cpp的bug。
放棄了使用靜態(tài)庫方案。
因為il2cpp本身導出就是C++代碼,那就直接將raknet的源碼導入到Plugin/iOS/Raknet/ 目錄下,果然可行。
一、在加入前需要加入兩部分代碼:
1、RakNet->Source下的全部加載
2、通過Swig導出的導出接口文件也需要放進去,但是需要將RakNet_wrap.cxx 的后綴修改成cpp,RakNet_wrap.cpp 和RakNet_wrap.h兩個文件也需要加入,否者在C#中是獲取不到接口的。
二、導出成xcode工程之后,開始編譯,
因為有動態(tài)類型轉換的應用,所以編譯時會報錯,在XCode的 build setting中將Enable C++ runtime Types 修改yes
如果是使用xcodebuild編譯的話,就帶上 GCC_ENABLE_CPP_RTTI = YES 編譯選項就不會報錯。
打包導出ipa測試網絡連接ok了。
修改之后的代碼連接 在此