2016-11-13 103 views
1

我在C中有一个非常简单的函数,它的指针传入Swift。从Swift调用C函数只知道内存地址

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

怎样才可以在斯威夫特使用ONLY指针调用?这是关于简单地调用它的不是 - 直接调用时它工作正常。试图与签名铸造以下和不同的变化,但它总是崩溃:

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… 
} 
+0

你如何获得指针?它的定义/声明是什么? – Alexander

回答

2

Swift: How to call a C function loaded from a dylib相同的方法应该在这里工作。

示例夫特3(假设funcPtrUnsafeRawPointer含有该函数的地址):

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

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

// Call function: 
callback() 

当然类型别名必须实际函数签名, 匹配,并且功能必须是一个“纯粹的“C功能(不是Objective-C 方法)。

+0

哈我试图找出各种随机狗屎。 '@convention(c)'是门票 – Alexander

+0

哈,我已经看到了几个你用'unsafeBitCast'回答的问题,羞愧没有先尝试。这是一个救生员。谢谢马丁! –