C#与OC交互方法中的ong参数的兼容性问题

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之后的所有参数都不对。

posted @ 2018-05-16 19:20  nottvlike  阅读(499)  评论(0编辑  收藏  举报