zoukankan      html  css  js  c++  java
  • 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之后的所有参数都不对。

  • 相关阅读:
    d3 之deal with data
    git 使用小结
    【nodemailer】之 work with mustache
    Mustache
    【nodemailer】 初试
    【计算机基础】二.组成1(总线、输入输出)
    【计算机基础】一.概述
    Sring事务管理
    【并发编程】4.JUC中常用的锁
    【并发编程】3.线程与线程池
  • 原文地址:https://www.cnblogs.com/nottvlike/p/9047672.html
Copyright © 2011-2022 走看看