Как передать адрес функции Objective C функции C?

Я работаю с 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);
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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...];
}

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

Anuran Barman 01.07.2019 11:54

@AnuranBarman Вы можете просто написать это в файле ObjectiveC. Просто добавьте функцию сверху, и все будет хорошо...

Matic Oblak 01.07.2019 11:54

Другие вопросы по теме