ios - 如何将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);
解决方案
ObjectiveC 支持纯 C,所以为什么不创建一个 C 函数on_incoming_call
,然后调用 ObjectiveC 代码。
我很确定它可以直接使用目标 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...];
}
推荐阅读
- reactjs - 为 Redux 操作设置 Typescript 接口(类型“...”没有调用签名)
- python - 通过拖动鼠标旋转对象pygame
- c - 使用 SDL2 的 C 程序不能用 clang 编译
- python - 如何由用户在 django 上查询 sql 以获得模型函数
- android - 如何在listview android中对短信进行排序
- c++ - 特定目标文件的单线程构建
- python - 如何在列表理解中使用正则表达式 re.compile Match() 或 findall()
- python - 将值/键组合成一个字符串并打印
- xaml - 如何在 Xamarin 的堆栈布局中增加包含绘图画布的网格的大小
- sql-server - 创建视图:错误 MSG 156,级别 15,状态 1