Я работаю с 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.
Я почти уверен, что это выполнимо непосредственно с целью 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...];
}
@AnuranBarman Вы можете просто написать это в файле ObjectiveC. Просто добавьте функцию сверху, и все будет хорошо...
Я сделал дополнительный файл C, который, в свою очередь, вызовет библиотечную функцию C, и добавил свой файл C в целевой C. Спасибо, что показали прямое направление.