Unity中免不了需要C#和OC或者Java代码交互,最近发现与OC交互的部分代码有兼容问题,在64位机器上测试没问题,不过在32位机器上测试就必然奔溃,最后定位到了一个方法里的long参数,因为它前面的参数都没问题,它和它之后的参数内容和正确的内容完全对不上。
//C# [DllImport ("__Internal")] private static extern void _test(int a, string b, long c, long d, int e, string f, string g, int h, int i, int g, int k); //OC extern "C" { void _test(int a, const char* b, long c, long d, int e, const char* f, const char* g, int h, int i, int g, int k) { } }
既然找到了症结所在,第一种方法,将所有long类型参数改为string传递,经测试可以有效的绕过这个问题。
后来研究了一下unity打包xocde工程的il2cpp代码,发现il2cpp将c#的int转成了_int_32,而long则转成了_int_64,看了看_int_64的定义发现是long long,后来又看了下C#文档对于int和long的定义,int是有符号32位整数,long是有符号64位整数,依稀记得C的long和int是一样的,查了下OC里int和long也是一样的,这样就大致可以知道问题所在了,C#的long和OC的long长度不一样。
所以第二种方法,将oc中的long类型改为long long类型,也可以解决这个问题。
最后还是有一点疑问,就是我调试了下il2cpp代码底层是解析对了的,只是传递给我的时候错了,那结果也应该只是几个long被截取了,不至于long之后的所有参数都不对。