如何在swift中調(diào)用輸入/輸出為void*的C函數(shù)

前言

開發(fā)過程中難免遇到各種各樣的需求,有的需求則需要調(diào)用某些硬件公司開發(fā)的SDK,然而這些SDK往往比較底層,接口大部分是使用C語言寫的,然而眾所周知OC調(diào)用C語言API還是比較輕松的,然后swift調(diào)用C則比較麻煩了。本人是在接入某實(shí)時(shí)監(jiān)控SDK時(shí)遇到的此類問題,需要傳入一個(gè)UIView給C函數(shù),在該UIView上面顯示實(shí)時(shí)監(jiān)控畫面。

LONG __stdcall NET_DVR_RealPlay_V40(LONG lUserID, void* lpPreview, REALDATACALLBACK fRealDataCallBack_V30 = NULL, void* pUser = NULL);

由于本人解決該問題走了很多彎路,直接相關(guān)的文章又十分稀少,故寫此文章進(jìn)行分享。

實(shí)際問題與解決方案

問題:如何將swift中的UIView對(duì)象轉(zhuǎn)化為void*類型作為參數(shù)調(diào)用C函數(shù)?

須知:swift要想調(diào)用C函數(shù)必須經(jīng)由OC橋接完成。

解決方案一:在swift中使用UnsafeMutableRawPointer指針指向UIView對(duì)象,再通過OC橋接文件中聲明該C函數(shù),最后在swift中直接傳入U(xiǎn)nsafeMutableRawPointer類型參數(shù)進(jìn)行調(diào)用。

原理:UnsafeMutableRawPointer:swift指針類型,相當(dāng)于C中的void*。

解決方案二:創(chuàng)建一個(gè)相應(yīng)的OC函數(shù),參數(shù)類型改為id。在該OC函數(shù)中將id轉(zhuǎn)為void*類型后,再在該OC函數(shù)中調(diào)用那個(gè)C函數(shù)。

原理:id:OC指針類型,相當(dāng)于C中的void*,對(duì)應(yīng)于swift中的Any?類型。

總結(jié)與demo

由于解決方案一中的swift指針使用起來比較復(fù)雜而且危險(xiǎn),不太推薦像我這樣的萌新使用。Apple將它命名為Unsafe也是警告你使用它必須足夠自信。但也希望有好學(xué)的童鞋能寫一個(gè)解決方案一的demo一起分享使用~

推薦使用解決方案二,另附上一個(gè)簡單的demo幫助大家理解和使用。

本人QQ:1219953432 歡迎拍磚指正~

參考文章

如何在Swift中調(diào)用C函數(shù)

Swift中的指針操作詳解

5分鐘搞定內(nèi)存字節(jié)對(duì)齊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容