2015-11-29 101 views
2

我目前正在使用pjSIP和swift在iOS應用程序上工作。註冊一個快速線程爲pj_thread

我在.C文件進行通話了一個方法上,讓它成爲

void makeCall(const char *destUri){ 
    ... 
    status = pjsua_call_make_call(... 
} 

和我得到的是從一個調用MakeCall函數功能的主線程調用一個方法迅速來自C文件。

如果我這樣做,應用程序崩潰,並說我需要在調用pjLib函數之前將線程註冊到pjSIP。

要註冊一個線程來PJSIP我需要調用函數pj_thread_register

我試圖線程添加爲UnsafeMutablePointer。

我的電話看起來像現在這種權利:

void makeCall(const char *destUri, long threadDesc, pj_thread_t **thread){ 
    ... 
    pj_thread_register(NULL, &threadDesc, thread); 
    status = pjsua_call_make_call(... 
} 


internal static func makeSIPCall(numberToCall: String){ 
    ... 
    let destination = ... //my call destination 
    let thread : NSThread = NSThread.currentThread() 
    let observer = UnsafeMutablePointer<CopaquePointer>(Unmanaged.passUnretained(thread.self).toOpue()) 

    makeCall(destination, Int(thread.description)! as Clong, observer) 

} 

線程1:EXC_Breakpoint和致命錯誤「發現零而展開的可選值」

所以,我怎麼能傳遞的所需要的性能從swift到C的線程?

+1

這是一個可怕因爲它阻止你使用GCD - 這在這種情況下是很自然的事情。 – marko

+0

@marko這不是PJSIP傢伙的錯,這是Apple的錯。與C一起使用時,Swift仍然有一些限制。 – azimov

+0

告訴我更多... – marko

回答

0

儘量不要發送由SWIFT的參考,但你 的.c文件中直接使用此:

void makeCall(const char *destUri, long threadDesc, pj_thread_t **thread){ 
    ... 
    pj_thread_desc a_thread_desc; 
    pj_thread_t *a_thread; 

    if (!pj_thread_is_registered()) { 
     pj_thread_register(NULL, a_thread_desc, &a_thread); 
    } 
    status = pjsua_call_make_call(... 
} 

來源:ipjsua(示範項目建設你PJSIP後獲得)