项目中有个需求:集成一个转发器设备的SDK。SDK底层是采用标准C编写的。记录下使用过程。
在SDK的头文件中可以看到如下代码。
#ifdef __cplusplus
extern "C"{
#endif
xxxxxx //C语言的SDK基础接口函数实现
#ifdef __cplusplus
}
#endif
cplusplus即C++,#ifdef是条件编译,作用是C代码被C++代码调用时,定义了“__cplusplus”宏,用extern “C”{ }将c代码括起来,表明这是C代码,这样就可以保证C++代码正确的调用C代码。C++是在C的基础上发展出来的,有一些特性是C语言没有的,比如函数重载,所以要指明这是C代码,不然就会出错。
首先在你需要用到sdk接口的地方引入sdk头文件
#import <XXXSDK/XXConfigSDK.h>
一、在OC的类中是可以直接调用c语言方法的。例如:
-(void)playvideobtn{
//调用c语言方法:
sayHello();
}
//c语言方法:
void sayHello(){
printf("Hello OC");
}
二、在C函数里如何调用OC的方法呢?
1、首先需要定义一个全局静态变量指针用于保存当前类的地址。
static LCBindWRRFIRViewController *selfClass = nil;
@interface LCBindWRRFIRViewController ()
@end
2、函数指针指向自己。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
selfClass =self;
}
3、然后就可以在C函数中调用OC的方法了。
// 配网回调函数
void linkCallbackFunc(const char *msgSrc,
const unsigned char *pDatBuf, const int datLen, const long userData) {
printf("回调函数被调用,配网结果为: %s\n", pDatBuf);
[selfClass bindDevWithpDatBuf:pDatBuf];//这里调用的是OC方法
}
其中sdk中的一个接口的参数需要传入一个方法函数作为回调方法。
//这里是字符串转char
const char *cssid = [self.ssid UTF8String];
const char *cpasswd = [self.passwd UTF8String];
//这里是调用SDK的接口(c函数)其中linkCallbackFunc就是上面定义的配网回调函数linkCallbackFunc作为参数。
config_linkStart(0, cssid, cpasswd, linkCallbackFunc, 0);
网友评论