最近遇到一個項目需要用swift 對接c++,調(diào)用圖像處理。對接的我頭昏眼花,真的,一頓騷操作頭皮發(fā)麻。
言歸正傳,首先就是把靜態(tài)庫拖入, 沒得過多解釋。
然后swift 沒辦法直接調(diào)用C++ , 所以只有通過OC包裝一層,通過調(diào)用OC的方法來操作,這些都是基本操作瑟然后重點來了。
你要在oc當中倒入第三方庫的頭文件。有一些你要特別注意

1
比如這種騷東西, 讀它的黃色警告, 需要把調(diào)用這個的頭文件引用放在最前面 , 也就是你在OC的文件里, 你需要把import "庫"放在系統(tǒng)庫之前,比如放在#import"UIKit"之前,放在文件的最頂端

2
然后,你就能在OC當中掉C++的方法了
我覺得C++ 真的很嬌氣,mmp,剛拿到就是蒙蔽的,比如說這個方法

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

4
沒錯, 你就會看到上面這個報錯,找不到方法,參數(shù)一定要按照上面的傳, 參數(shù)類型必須傳對
那unsigned char 這個參數(shù)類型又是怎么來的,你可以去百度,不過我估計你很難找到,mmp, 老子找了那么久都沒有一個詳細的,好難啊,看到網(wǎng)上一個說法unsigned char 其實就是bytes, 我試了一個也沒法直接傳,于是我靈機一動

5
來個強轉(zhuǎn), 喝, 你別說, 還真是對的, 別給我扯什么NSSData 轉(zhuǎn)char* 再轉(zhuǎn)unsigned char , 別給我看什么[NSData bytes] 的類型行是const char 或者char

6
如上面這種,這些作者 不知道把代碼寫上去試試嗎,能不能編譯一哈試試 ,看看正不正確, 這是我百度到最多到東西,哎

7
int 就用int類型, double也用double,上面方法的int* color 是一個int數(shù)組, 用來傳顏色的, 這個你得問你們后臺傳什么值, 說是int數(shù)組, 你別直接上oc 的數(shù)組哦, 你認識@[@255,@255] C++不一定認識哦。這個要寫成c的形式
int a[6] = [252,252,252,252,252,252]
這樣你就把這個int* 顏色數(shù)組搞定了, 什么int*要傳一個地址值,在oc數(shù)組前加一個&,行之類的話, 你可以試一試,行的話就可以用.....
一切準備就緒了,參數(shù)也傳對了,調(diào)用不報錯了,編譯走一波。。。

8
看來還是too young too simple,相信大家看見上面那句話的(symbol(s) not found for architecture arm64),都會 會心一笑, 這個錯不多簡單嘛,就是倒入庫的時候出問題了,重新倒入嘛。對,開始的時候我也是這么想的, 然后各種倒,各種查問題,各種在技術(shù)群里問,都是說的相同的答案,這么簡單, 大家都是看傻子一樣。基本上網(wǎng)上搜索出的答案都是這個。下面的圖片

9
直到我問了一個大佬, 他看的是另外一個地方的, 才知道這個庫,給的只是模擬器版本,真機沒法測試,之前加的openv2的靜態(tài)庫必須在真機跑,呵,原來C++的大佬實在是高啊, 我弄了半天, 結(jié)果,哭暈在廁所。就叫c++大佬給個真機的庫。好吧, 看來一切都準備就緒了,來commond R走一波。
方法里的resultImg沒有返回值,這個地方又搞了半天, 直到實在沒辦法了,截圖給c++大佬看,然后他才突然想起, 網(wǎng)上拉到的數(shù)據(jù)要base64解碼一次,我...,我...,高,實在是高啊。還有這種坑留給我的,什么都不說了,擦干眼淚繼續(xù)干。
好吧這次終于,終于,終于成功了, 拿到了resultImg,是一個unsign char 的類型,有返回值了,說明對了瑟, 千辛萬苦,終于出來了,就差最后一個unsign char 轉(zhuǎn)data, 然后又去各種百度
你去百度什么 OC unsign char 轉(zhuǎn) NSData ,呵,我只能告訴你, 你還是太年輕,你這么百度什么都找不到, 還好我記得,在那里看到一個 unsign char 可以理解為byte 于是乎,嘗試了一波

10
對,真的可以轉(zhuǎn), 就差最后一步了,于是我發(fā)現(xiàn),byte轉(zhuǎn)NSData需要兩個參數(shù),另外一個怎么操作呢,我隨機傳了幾個int值,發(fā)現(xiàn)傳的不一樣, 結(jié)果不一樣。所以肯定不能亂傳瑟,于是我就去百度,byte 的長度,呵呵,我自己看著都笑了,又耽誤幾小時,于是乎沒有結(jié)果,也怪我,c懂的太少。突然我發(fā)現(xiàn)左邊不是有一個返回類型嘛,我就又去問c++大佬,這個返回值是什么意思啊,他說是成功后返回的圖片數(shù)據(jù)長度。放松心態(tài),不要急躁,我.......(省略1萬字)。高啊,實在是高,原來,坑都是一層一層的,一層一層嵌套的。終于,臥槽,結(jié)束了,估計我這次把OC接C++能遇到的問題都踩了一遍,因為C++大佬也是第一次弄iOS的靜態(tài)庫,賊牛逼的一個人,我還能說什么。

11
總結(jié):swift接C++,現(xiàn)在我知道的方法是必須通過OC做橋接,然后方法的參數(shù)類型一定不要傳錯,還有一定要問清楚方法的作用,參數(shù),返回值。最好,是有一個你接的第三方庫的 demo, 這個才是最實在的。