RakNet iOS of Unity 5.x 的应用il2cpp的bug规避

由于Unity的iOS版本需要为了运行效率,需要应用il2cpp模式。

但是RakNet该网络库的一些接口通过il2cpp导出之后,会出现bug。

最开始的方案是想导入libRakNet.a静态库,该库通过xcode编译成iOS版本。

该libRakNet.a库,应用于原生的ObjectC工程是没问题,但是应用到unity通过il2cpp之后,就出现连接不成功的情况。

进一步分析:在服务器上单步之后,发现服务器可以接收到请求连接的消息,但是接收到的消息头解析是错乱的。

也在stackOver上找到了别人也有遇到过类似问题,详细;

修改方案是将 DatagramHeaderFormat 结构体中的 serialize 方法名字重命名下,在文件ReliabilityLayer.cpp 重新编译成静态库之后,发现请求协议头解析是改正确了。

但是连接还是不成功。

继续分析,发现是服务器在请求处理连接请求的时候,会把该客户端还没完成三次握手的情况下,将该客户端判定为超时,直接关闭该连接。

怀疑还是在connection_time的指通过il2cpp导出的C++代码中还存在问题。因为要的比较急,就没有继续研究下去,基本上可以确定是il2cpp的bug。

放弃了使用静态库方案。

因为il2cpp本身导出就是C++代码,那就直接将raknet的源码导入到Plugin/iOS/Raknet/ 目录下,果然可行。

一、在加入前需要加入两部分代码:

1、RakNet->Source下的全部加载

2、通过Swig导出的导出接口文件也需要放进去,但是需要将RakNet_wrap.cxx 的后缀修改成cpp,RakNet_wrap.cpp 和RakNet_wrap.h两个文件也需要加入,否者在C#中是获取不到接口的。

二、导出成xcode工程之后,开始编译,

因为有动态类型转换的应用,所以编译时会报错,在XCode的 build setting中将Enable C++ runtime Types 修改yes

如果是使用xcodebuild编译的话,就带上 GCC_ENABLE_CPP_RTTI = YES 编译选项就不会报错。

打包导出ipa测试网络连接ok了。


修改之后的代码连接 在此

你可能感兴趣的:(RakNet iOS of Unity 5.x 的应用il2cpp的bug规避)