swift 接C++

最近遇到一个项目需要用swift 对接c++,调用图像处理。对接的我头昏眼花,真的,一顿骚操作头皮发麻。
言归正传,首先就是把静态库拖入, 没得过多解释。
然后swift 没办法直接调用C++ , 所以只有通过OC包装一层,通过调用OC的方法来操作,这些都是基本操作瑟然后重点来了。
你要在oc当中倒入第三方库的头文件。有一些你要特别注意


14504953-f599c24ac607061c.png

1
比如这种骚东西, 读它的黄色警告, 需要把调用这个的头文件引用放在最前面 , 也就是你在OC的文件里, 你需要把import "库"放在系统库之前,比如放在#import"UIKit"之前,放在文件的最顶端


temp.m.png

2
然后,你就能在OC当中掉C++的方法了
我觉得C++ 真的很娇气,mmp,刚拿到就是蒙蔽的,比如说这个方法

BeaprCuetondetratf P• Roo Gteo atta.png

3
mmp, 开始就被坑了半天, unsigned char 什么鬼, 日哦,然后我尝试了用NSString int试了一哈,呵呵,找不到方法

O No matehing funetion foc ce.png

4
没错, 你就会看到上面这个报错,找不到方法,参数一定要按照上面的传, 参数类型必须传对
那unsigned char 这个参数类型又是怎么来的,你可以去百度,不过我估计你很难找到,mmp, 老子找了那么久都没有一个详细的,好难啊,看到网上一个说法unsigned char 其实就是bytes, 我试了一个也没法直接传,于是我灵机一动

(unsigned char)stringToUnsigned1(NSData )temp {.png

5
来个强转, 喝, 你别说, 还真是对的, 别给我扯什么NSSData 转char* 再转unsigned char , 别给我看什么[NSData bytes] 的类型行是const char 或者char

111.png

6
如上面这种,这些作者 不知道把代码写上去试试吗,能不能编译一哈试试 ,看看正不正确, 这是我百度到最多到东西,哎


14504953-253307e22156fc4c.png

7
int 就用int类型, double也用double,上面方法的int* color 是一个int数组, 用来传颜色的, 这个你得问你们后台传什么值, 说是int数组, 你别直接上oc 的数组哦, 你认识@[@255,@255] C++不一定认识哦。这个要写成c的形式
int a[6] = [252,252,252,252,252,252]
这样你就把这个int* 颜色数组搞定了, 什么int*要传一个地址值,在oc数组前加一个&,行之类的话, 你可以试一试,行的话就可以用.....
一切准备就绪了,参数也传对了,调用不报错了,编译走一波。。。


Icrypto-tramgwork.jpg

8
看来还是too young too simple,相信大家看见上面那句话的(symbol(s) not found for architecture arm64),都会 会心一笑, 这个错不多简单嘛,就是倒入库的时候出问题了,重新倒入嘛。对,开始的时候我也是这么想的, 然后各种倒,各种查问题,各种在技术群里问,都是说的相同的答案,这么简单, 大家都是看傻子一样。基本上网上搜索出的答案都是这个。下面的图片

symbol(s) not found for architecture arm64.png

9
直到我问了一个大佬, 他看的是另外一个地方的, 才知道这个库,给的只是模拟器版本,真机没法测试,之前加的openv2的静态库必须在真机跑,呵,原来C++的大佬实在是高啊, 我弄了半天, 结果,哭晕在厕所。就叫c++大佬给个真机的库。好吧, 看来一切都准备就绪了,来commond R走一波。
方法里的resultImg没有返回值,这个地方又搞了半天, 直到实在没办法了,截图给c++大佬看,然后他才突然想起, 网上拉到的数据要base64解码一次,我...,我...,高,实在是高啊。还有这种坑留给我的,什么都不说了,擦干眼泪继续干。
好吧这次终于,终于,终于成功了, 拿到了resultImg,是一个unsign char 的类型,有返回值了,说明对了瑟, 千辛万苦,终于出来了,就差最后一个unsign char 转data, 然后又去各种百度
你去百度什么 OC unsign char 转 NSData ,呵,我只能告诉你, 你还是太年轻,你这么百度什么都找不到, 还好我记得,在那里看到一个 unsign char 可以理解为byte 于是乎,尝试了一波

(NSData )charTc ata(unsigned chara)temp a1 Eo.png

10
对,真的可以转, 就差最后一步了,于是我发现,byte转NSData需要两个参数,另外一个怎么操作呢,我随机传了几个int值,发现传的不一样, 结果不一样。所以肯定不能乱传瑟,于是我就去百度,byte 的长度,呵呵,我自己看着都笑了,又耽误几小时,于是乎没有结果,也怪我,c懂的太少。突然我发现左边不是有一个返回类型嘛,我就又去问c++大佬,这个返回值是什么意思啊,他说是成功后返回的图片数据长度。放松心态,不要急躁,我.......(省略1万字)。高啊,实在是高,原来,坑都是一层一层的,一层一层嵌套的。终于,卧槽,结束了,估计我这次把OC接C++能遇到的问题都踩了一遍,因为C++大佬也是第一次弄iOS的静态库,贼牛逼的一个人,我还能说什么。


14504953-79e4a40deb72414b.png

11
总结:swift接C++,现在我知道的方法是必须通过OC做桥接,然后方法的参数类型一定不要传错,还有一定要问清楚方法的作用,参数,返回值。最好,是有一个你接的第三方库的 demo, 这个才是最实在的。

你可能感兴趣的:(swift 接C++)