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

转载于:https://www.cnblogs.com/nottvlike/p/9047672.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值