我正在尝试创建 swift软件包。在swift软件包中,我必须从 .dylib 文件调用 c函数。
swift软件包中可能不支持 bridging-header 文件方法,因此,我尝试使用 dlopen()函数在swift中调用c函数。
C头文件中的函数声明
extern BInfo create(PRef p0, char* p1, BConfig* p2, char** p3);
方法1:
快速生成的接口,而在项目中不包含结构声明头文件。
public func create(_ p0: Int32, _ p1: UnsafeMutablePointer<Int8>!, _ p2: UnsafeMutablePointer<Int32>!, _ p3: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!) -> Int32
typealias create = @convention(c)(Int32, UnsafeMutablePointer<Int8>?, UnsafeMutablePointer<Int32>?, UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?)->Int32
方法2:
快速生成的接口,而无需在项目中包括结构声明头文件。
public func create(_ p0: PRef, _ p1: UnsafeMutablePointer<Int8>!, _ p2: UnsafeMutablePointer<BConfig>!, _ p3: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!) -> BInfo
输入第二种方法的别名
typealias create = ((PRef, UnsafeMutablePointer<Int8>?, UnsafeMutablePointer<BConfig>?, UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?)-> (BInfo))
使用第二种方法,我能够编译和运行代码,但遇到错误:
Can't unsafeBitCast between types of different sizes
问题:
方法1
1)如何将结构对象转换为UnsafeMutablePointer
方法二
1)我该如何解决“不能在不同大小的类型之间使用unsafeBitCast”的错误?
swift包中还有其他方法可以调用c函数吗?