Estoy trabajando con PJSIP para llamar a la solicitud de iOS. A medida que la biblioteca está escrita en c Algunos métodos de llamada C que esperan la dirección de una función objetivo C. He tratado de hacer

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

Pero, por supuesto, no funciona, ya que no sé qué pasar como parámetros a la función, ni me da la dirección de la función.

¿Cómo puedo hacer que funcione? La función C que espera que esto se vea debajo.

void (*on_incoming_call)(pjsua_acc_id acc_id, pjsua_call_id call_id,
                 pjsip_rx_data *rdata);
0
Anuran Barman 1 jul. 2019 a las 07:21

1 respuesta

La mejor respuesta

Objetivo C admite puro C, así que, ¿por qué no solo crear una función C on_incoming_call que luego llama el código c Objective C.

Estoy bastante seguro de que es factible directamente con OBJETIVO C, pero no iría allí. El problema comienza con ObjectIVEC que tiene parámetros de función adicionales que sean invisibles para usted. Por ejemplo, el parámetro self.

Así que intente algo como lo siguiente:

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

Ahora puede ver que puede tener un poco de un problema donde el on_incoming_call está en contexto estático mientras que su objeto puede o puede no serlo. Por lo general, creo singletons para tales casos. Lo más simple puede parecer:

static MyReceiver *currentReceiver = nil;

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

En este caso ahora llamarías

void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata) {
    [[MyReceiver current] onIncomingCall...];
}
2
Matic Oblak 1 jul. 2019 a las 06:00