2016-11-13 4 views
1

저는 C에서 매우 간단한 함수를 가지고 있고 포인터는 Swift로 전달됩니다.신속한 알고있는 메모리 주소에서 C 함수를 호출하십시오.

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

은 어떻게 포인터를 사용하여 신속한에서 호출 할 수 있습니까? 이것은 단순히 이 아닌 약입니다. 직접 호출하면 올바르게 작동합니다. 서명 캐스팅 다음과 같은 다른 변화를 시도하지만 항상 충돌 :

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... 

가 실제로 오른쪽으로 작동하고 포인트를 확인하기 위해 주소 나는 콜백 포인터와 Swift에서 호출 할 때 예상대로 작동하는 다른 Objective-C 함수가 있습니다.

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

어떻게 포인터를 얻습니까? 그것의 정의/선언은 무엇입니까? – Alexander

답변

2

Swift: How to call a C function loaded from a dylib과 동일한 접근 방식이 여기에서 작동해야합니다.

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

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

// Call function: 
callback() 

물론 유형 별칭이 실제 함수 서명, 일치해야하고 함수 "가 될 필요가있다 : 스위프트 3

예 (funcPtr 함수의 주소를 포함하는 UnsafeRawPointer이라고 가정) 순수한 "C 함수 (Objective-C가 아닙니다 메서드).

+0

하하 나는 이것을 알아 내려고 모든 종류의 닥치는대로의 똥을 시험해보고 있었다. '@convention (c)'는 티켓입니다 – Alexander

+0

하, 나는'unsafeBitCast'로 몇 가지 답을 보았습니다, 수치심이 먼저 시도하지 않았습니다. 이것은 생명의 은인입니다. Martin 고마워! –