ios - 如何将 Objective C 函数的地址传递给 C 函数?

标签 ios c objective-c pjsip

我正在使用 PJSIP 来开发 SIP 调用 ios 应用程序。由于该库是用 C 编写的,一些回调 C 方法需要 Objective C 函数的地址。我试过了

ua_cfg.cb.on_incoming_call = &[self on_incoming_call:<#(pjsua_acc_id)#> _:<#(pjsua_call_id)#> _:<#(pjsip_rx_data *)#>]

但它当然不起作用,因为我不知道将什么作为参数传递给函数,它也没有给我函数的地址。

我怎样才能让它发挥作用?期望这样的 C 函数如下所示

void (*on_incoming_call)(pjsua_acc_id acc_id, pjsua_call_id call_id,
                 pjsip_rx_data *rdata);

最佳答案

ObjectiveC 支持纯 C,所以为什么不创建一个 C 函数 on_incoming_call 然后调用 ObjectiveC 代码。

虽然我很确定直接使用 Objective-C 是可行的,但我不会去那里。问题始于 objectiveC 中有额外的函数参数,而这些参数对您来说是不可见的。例如参数self

所以尝试像下面这样的事情:

void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata) {
    [MyObjectiveCObject onIncomingCall...];
}

现在您可以看到您可能遇到一些问题,即 on_incoming_call 处于静态上下文中,而您的对象可能是也可能不是。我通常为这种情况创建单例。最简单的可能看起来像:

static MyReceiver *currentReceiver = nil;

+ (MyReceiver *)current {
    if(currentReceiver == nil) {
        currentReceiver = [[MyReceiver alloc] init];
        ua_cfg.cb.on_incoming_call = &on_incoming_call;
    }
    return currentReceiver;
}

在这种情况下,您现在可以调用

void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata) {
    [[MyReceiver current] onIncomingCall...];
}

关于ios - 如何将 Objective C 函数的地址传递给 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56829964/

相关文章:

c - 如何清除 C 中的输入缓冲区?

c - 如何加速我的代码?

ios - 下载完成后如何将通过 SDWebImage 下载的图像加载到 View Controller 中?

ios - customFooterView 内的 UISwitch 需要调用使用 Swift 声明的类外部的方法

ios - 按钮之间的自动布局边距仅在 4"屏幕上不正确

c - 在 Ubuntu 10.04 上编译时未声明 PATH_MAX

ios - 为什么信号在 ReactiveCocoa 中被调用两次?

iphone - objective-c 源 locationManager 在自己的类中

iOS 标签栏动态标签

ios - 如何反转 UISlider 的最小值和最大值?