将快速线程注册为pj_thread

问题描述 投票:4回答:2

我目前正在使用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?

ios c multithreading pjsip swift2.1
2个回答
3
投票

[不要尝试从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后获得的演示项目)


0
投票

似乎有可能编写与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返回后,将填充threadDescthread

这种行为对我来说并不明显,因为没有关于线程的任何信息都显式传递给pj_thread_register。但是我可以从任何GCD调度队列中调用此函数,并且这有条件地注册了使用的线程。

© www.soinside.com 2019 - 2024. All rights reserved.