OC与C++交互

说明

最近做的一个项目使用到了别人的一个算法解析类,不过这个类是他那边用C++实现的。这就涉及到了C++与OC之间的交互了。

OC调用C++

这个比较简单,需要提的一点就是把调用类.m文件改成.mm 然后直接new被调用的类,访问属性或方法直接用”->”

C++调用OC

这个就比较麻烦一点了,需要一个OC的桥接类和一个头文件,直接上代码吧

.h

1
2
3
4
5
6
7
8
9
10
11
12
#import <Foundation/Foundation.h>
#import "OCClass-Header.h"

@interface OCClass : NSObject

- (void)c_showRealU3D:(const char* const)str;
- (void)c_showBettary:(const char* const)str;

@property interface realU3DCall;
@property interface bettaryCall;

@end

.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#import "OCClass.h"
@implementation OCClass

static OCClass*myOC =nil;

//显示实时U3D
void showRealTimeU3D(void* caller, const char* const parameter){

[(__bridge id)caller c_showRealU3D:parameter];
}
//显示电量
void showBettary(void* caller, const char* const parameter){
[(__bridge id)caller c_showBettary:parameter];
}

-(instancetype)init{
if ([super init]) {

_realU3DCall = showRealTimeU3D;
_bettaryCall = showBettary;
}
return self;
}

- (void)c_showRealU3D:(const char* const)parameter{

NSLog(@"%@",[NSString stringWithUTF8String:parameter]);
//处理自己的逻辑
}
- (void)c_showBettary:(const char* const)str{

//处理自己的逻辑
}

-(void)dealloc{
NSLog(@"OC Object dealloc");
}
@end

创建头文件OCClass-Header 算是定义一个接口吧

1
2
3
4
5

#ifndef OCClass_Header_h
#define OCClass_Header_h
typedef void (*interface) (void* caller,const char* const parameter);
#endif /* OCClass_Header_h */

C++

在.h中首先导入OC中创建的一个头文件OCClass-Header
对外声明一个变量空指针类型,比如myOC,最终初始化时就是创建的那个桥接类
再通过头文件里定义的interface 声明需要调用OC中的方法
.h

1
2
3
4
5
6
7
public:
void* myOC;
interface realU3DCall;
interface bettaryCall;

//最终通过这个方法发起的调用
void callOCMethod(interface caller,const char* const parameter);

.cpp

1
2
3
4
5
6
7
8
9
10

调用的地方
callOCMethod(this->realU3DCall,"string 参数");

实现的地方
void BleDataParser::callOCMethod(interface caller,const char* const paramter){

caller(this->myOC,paramter);

}

这样就实现了在C++中调用OC的功能

OC中初始化中间类

1
2
3
4
5
6
7

OCClass * oc = [[OCClass alloc]init];
void* point = (__bridge void*)oc;
//belParser C++类对象
bleParser->myOC = point;
bleParser->realU3DCall = oc.realU3DCall;
bleParser->bettaryCall = oc.bettaryCall;

补充

由于涉及到不同语言交互,为了参数能够兼容,参数都定义为const char* const 类型
C++中string 转 cstring

1
c_str()

C++中unsigned char转 cstring

1
2
3
4
5
6
7
方法一:stringstream stream;
stream << power;//c++定义的unsigned char
string powers = stream.str();
powers.c_str()

方法二:
to_string(value)

OC中char*转NSString

1
[NSString stringWithUTF8String:parameter]

End