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

项目使用混编的已经很常见了,在使用过程中遇到了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调用函数指针的区别)