gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:49:51 25 4
gpt4 key购买 nike

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

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

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

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

尝试使用 typedef void(*Callback)(); 定义 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…
}

最佳答案

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

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

// 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方法)。

关于从只知道内存地址的 Swift 调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com