我目前正在使用pjSIP和swift开发iOS应用。
我在.c文件中找到了用于进行呼叫的方法,随它去吧
void makeCall(const char *destUri){
...
status = pjsua_call_make_call(...
}
而且我从主线程中调用了一个快速方法,该方法从C文件中调用makeCall-function。
如果这样做,应用程序将崩溃,并且说我需要在调用更多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?
[不要尝试从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后获得的演示项目)
似乎有可能编写与Swift接受的答案中提到的功能相同的功能。
func registerThread() {
if pj_thread_is_registered() == 0 {
var thread: OpaquePointer?
var threadDesc = Array(repeating: 0, count: Int(PJ_THREAD_DESC_SIZE))
pj_thread_register(nil, &codecInfos[0], &thread)
}
}
pj_thread_register返回后,将填充threadDesc和thread。
这种行为对我来说并不明显,因为没有关于线程的任何信息都显式传递给pj_thread_register。但是我可以从任何GCD调度队列中调用此函数,并且这有条件地注册了使用的线程。