您的位置:首页 > 移动开发 > Swift

Swift对接C++库

2020-03-01 07:34 330 查看

最近遇到一个项目需要用swift 对接c++,调用图像处理。对接的我头昏眼花,真的,一顿骚操作头皮发麻。

言归正传,首先就是把静态库拖入, 没得过多解释。

然后swift 没办法直接调用C++ , 所以只有通过OC包装一层,通过调用OC的方法来操作,这些都是基本操作瑟

然后重点来了。

你要在oc当中倒入有C++第三方库的时候,有一些你要特别注意,比如图片上的这个警告

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


不出意外,你就能在OC当中掉C++的方法了

我觉得C++ 真的很娇气,mmp,刚拿到就是蒙蔽的,比如说这个方法


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


遇到这种问题,千万别怀疑是第三方库的问题,因为C++参数传的类型不一样就会报错,他是根据参数类型去匹配方法的

那unsigned char 这个参数类型又是怎么来的,你可以去百度,不过我估计你很难找到,mmp, 老子找了那么久都没有一个详细的,好难啊,百度的NSData转char倒是多,看到网上一个说法unsigned char 其实就是bytes, 我试了一个也没法直接传,于是我灵机一动

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


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


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数组前加一个&,行之类的话, 你可以试一试,行的话就可以用…

一切准备就绪了,参数也传对了,调用不报错了,编译走一波。。。


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


直到我问了一个大佬, 他看的是另外一个地方的, 才知道这个库,给的只是模拟器版本,真机没法测试,之前加的openv2的静态库必须在真机跑,呵,原来C++的大佬实在是高啊, 我弄了半天, 结果,哭晕在厕所。就叫c++大佬给个真机的库。好吧, 看来一切都准备就绪了,来commond R走一波。

方法里的resultImg没有返回值,这个地方又搞了半天, 直到实在没办法了,截图给c++大佬看,然后他才突然想起, 网上拉到的数据要base64解码一次,我…,我…,高,实在是高啊。还有这种坑留给我的,什么都不说了,擦干眼泪继续干。

好吧这次终于,终于,终于成功了, 拿到了resultImg,是一个unsign char 的类型,有返回值了,说明对了瑟, 千辛万苦,终于出来了,就差最后一个unsign char 转data, 然后又去各种百度

你去百度什么 OC unsign char 转 NSData ,呵,我只能告诉你, 你还是太年轻,你这么百度什么都找不到, 还好我记得,在那里看到一个 unsign char 可以理解为byte 于是乎,尝试了一波


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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
gq772913169 发布了2 篇原创文章 · 获赞 0 · 访问量 70 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: