Swift对接C++库
最近遇到一个项目需要用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, 这个才是最实在的。
- 点赞
- 收藏
- 分享
- 文章举报
- OpenStack中SWIFT对接测试
- Swift中类似C++和ruby中的final机制
- uc sdk 对接封装_objctive-c++
- Objective-C 再谈OC指针,对比C++/Java/Swift
- 《从零開始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- 期货CTP接口C++源码与C#应用程序的对接
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- Objective-C、C++和swift 的运行效率比较
- 实操C++与python的对接
- IOS-Swift、Objective-C、C++混合编程
- swift c++ oc 混编
- 今年业余时间要完成C++与数据库的对接
- OC/Swift/C/C++混合使用的编程姿势
- 《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射
- iOS 里面 Swift与Objective-C混编,Swift与C++混编的一些比较
- 关于swift,OC,C++混合编程(一)
- Object-C Swift C++代码相互调用。
- 封装hiredis——C++与redis对接(一)(string的SET与GET操作)
- IOS-Swift、Objective-C、C++混合编程
- 关于swift,OC,C++混合编程(二)