Как передать адрес функции Objective C в функцию C? - PullRequest
0 голосов
/ 01 июля 2019

Я работаю с 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);

1 Ответ

1 голос
/ 01 июля 2019

ObjectiveC поддерживает чистый C, так почему бы просто не создать функцию C on_incoming_call, которая затем вызывает код ObjectiveC.

Я почти уверен, что это выполнимо напрямую с целью C, но я бы туда не пошел.Проблема начинается с targetC, имеющего дополнительные параметры функции, которые невидимы для вас.Например, параметр 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...];
}
...