美文网首页
Swift调用C函数指针与OC调用函数指针的区别

Swift调用C函数指针与OC调用函数指针的区别

作者: angle_杰 | 来源:发表于2018-10-16 14:21 被阅读15次

    项目使用混编的已经很常见了,在使用过程中遇到了Swift调用C函数和OC调用C函数区别还是有点大的,这里记录一下,

    这里的C函数有个参数是函数指针

    C函数原型是这样的

    
    AVAPI_API int  avServStart3(int nIOTCSessionID, authFn pfxAuthFn, unsigned int nTimeout, unsigned int nServType, unsigned char nIOTCChannelID, int *pnResend);
    
    //其中pfxAuthFn是一个使用typedef定义的函数指针,意思为:用authFn来表示int(*)(char *, char *)
    typedef int (_stdcall *authFn)(char *szViewAccount,char *szViewPassword);
    
    

    Swift调用C函数

    let avChannel:CUnsignedChar = 2
     let avSerNum = avServStart3(SID, 
    {(account,password) -> Int32 in
           let accountStr:String = String(cString: account!)
           let passwordStr:String = String(cString:password!)
           print("accountStr====\(accountStr)====passwordStr==\(passwordStr)")
                                            
            if accountStr == ServiceAccount && passwordStr == ServicePassword {
                return 1
              }else{
                 return 0
               }
            },
                                     5,
                                     1,
                                     avChannel,
                                     SwiftIntToInt32(number: 1))
    
    /*
    
    {(account,password) -> Int32 in
           let accountStr:String = String(cString: account!)
           let passwordStr:String = String(cString:password!)
           print("accountStr====\(accountStr)====passwordStr==\(passwordStr)")
                                            
            if accountStr == ServiceAccount && passwordStr == ServicePassword {
                return 1
              }else{
                 return 0
               }
            }
    其中这一块是一个闭包,account和password都是从C那边回调回到的数据,这里判断是否跟自己的账号密码相同,不用单独写一个回调函数,闭包就可以方便的解决
    */
    

    OC调用C函数

    int avSerNum = avServStart3(SID,intIntAuthFn, 5, 1, 2, &pnResend);
    
    //这里是单独写的一个回调方法,方法不能直接写在👆的方法里,需要单独拉出来写,但是跟swift中是相同的,account和password都是C函数那边返回的数据
    int intIntAuthFn(char *account,char *password) {
        
        NSString *accountStr = [NSString stringWithUTF8String:account];
        NSString *passwordStr = [NSString stringWithUTF8String:password];
    
        if ([accountStr isEqualToString:AccountStr] && [passwordStr isEqualToString:PasswordStr]) {
            return 1;
        }else{
            return 0;
        }
    }
    
    

    好了,以上就是自己遇到的混编问题,如果有什么不对的地方欢迎大家指正!!!

    相关文章

      网友评论

          本文标题:Swift调用C函数指针与OC调用函数指针的区别

          本文链接:https://www.haomeiwen.com/subject/cjkhzftx.html