从Swift调用C函数只知道内存地址

时间:2016-11-13 05:35:26

标签: c swift callback language-interoperability

我在C中有一个非常简单的函数,它的指针传递给Swift。

void callback() {
    NSLog(@"such pointer…");
}

如何使用 ONLY 指针在Swift中调用?关于简单地调用它是 NOT - 直接调用它可以正常工作。通过签名转换尝试了以下和不同的变体,但它总是崩溃:

let pointer: UnsafePointer<@convention(c)() -> ()> = UnsafePointer(bitPattern: …)
let callback: @convention(c)() -> () = pointer.memory
Swift.print(callback) // (Function)
callback() // Handling crash with signal 11...

尝试使用Callback定义typedef void(*Callback)();类型 - 同样的事情:

let pointer: UnsafePointer<Callback> = UnsafePointer(bitPattern: …)
let callback: Callback = pointer.memory
Swift.print(callback) // (Function)
callback() // Handling crash with signal 11...

要检查它是否实际工作并指向正确的地址,我有另一个Objective-C函数,当使用回调指针从Swift调用时,它可以正常工作。

void invokeCallback(uintptr_t callback) {
    ((void (*)()) callback)(); // such pointer…
}

1 个答案:

答案 0 :(得分:4)

Swift: How to call a C function loaded from a dylib中相同的方法应该适用于此。

Swift 3的示例(假设funcPtr是a UnsafeRawPointer包含函数的地址):

// Define function type:
typealias callbackFunc = @convention(c) () -> Void

// Convert pointer to function type:
let callback = unsafeBitCast(funcPtr, to: callbackFunc.self)

// Call function:
callback()

当然,类型别名必须与实际的功能签名相匹配, 而且功能需要是一个纯粹的&#34; C函数(不是Objective-C 法)。