Swift

如何在swift中调用输入/输出为void*的C函数

2017-12-04  本文已影响56人  独白melody

前言

开发过程中难免遇到各种各样的需求,有的需求则需要调用某些硬件公司开发的SDK,然而这些SDK往往比较底层,接口大部分是使用C语言写的,然而众所周知OC调用C语言API还是比较轻松的,然后swift调用C则比较麻烦了。本人是在接入某实时监控SDK时遇到的此类问题,需要传入一个UIView给C函数,在该UIView上面显示实时监控画面。

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

由于本人解决该问题走了很多弯路,直接相关的文章又十分稀少,故写此文章进行分享。

实际问题与解决方案

问题:如何将swift中的UIView对象转化为void*类型作为参数调用C函数?

须知:swift要想调用C函数必须经由OC桥接完成。

解决方案一:在swift中使用UnsafeMutableRawPointer指针指向UIView对象,再通过OC桥接文件中声明该C函数,最后在swift中直接传入UnsafeMutableRawPointer类型参数进行调用。

原理:UnsafeMutableRawPointer:swift指针类型,相当于C中的void*。

解决方案二:创建一个相应的OC函数,参数类型改为id。在该OC函数中将id转为void*类型后,再在该OC函数中调用那个C函数。

原理:id:OC指针类型,相当于C中的void*,对应于swift中的Any?类型。

总结与demo

由于解决方案一中的swift指针使用起来比较复杂而且危险,不太推荐像我这样的萌新使用。Apple将它命名为Unsafe也是警告你使用它必须足够自信。但也希望有好学的童鞋能写一个解决方案一的demo一起分享使用~

推荐使用解决方案二,另附上一个简单的demo帮助大家理解和使用。

本人QQ:1219953432 欢迎拍砖指正~

参考文章

如何在Swift中调用C函数

Swift中的指针操作详解

5分钟搞定内存字节对齐

上一篇下一篇

猜你喜欢

热点阅读