项目使用混编的已经很常见了,在使用过程中遇到了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;
}
}
好了,以上就是自己遇到的混编问题,如果有什么不对的地方欢迎大家指正!!!
网友评论