美文网首页Swift
如何在swift中调用输入/输出为void*的C函数

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

作者: 独白melody | 来源:发表于2017-12-04 17:04 被阅读56次

    前言

    开发过程中难免遇到各种各样的需求,有的需求则需要调用某些硬件公司开发的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分钟搞定内存字节对齐

    相关文章

      网友评论

        本文标题:如何在swift中调用输入/输出为void*的C函数

        本文链接:https://www.haomeiwen.com/subject/dgjxixtx.html