Как создать функцию обратного вызова Rust для передачи в функцию FFI?
Вот так выглядит C API
void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int));
rust-bindgen
породил это для меня
pub fn mosquitto_connect_callback_set(mosq: *mut Struct_mosquitto,
on_connect:
::std::option::Option<extern "C" fn(arg1:
*mut Struct_mosquitto,
arg2:
*mut ::libc::c_void,
arg3:
::libc::c_int) -> ()>)
Как создать функцию обратного вызова ржавчины для передачи on_connect
параметр в приведенной выше ржавчины привязки?
1 ответ
Решение
Как мне создать функцию обратного вызова ржавчины?
Вы читали язык программирования Rust, в частности, раздел об обратных вызовах FFI под названием C-код для функций Rust?
Пример оттуда есть
extern fn callback(a: i32) {
println!("I'm called from C with value {0}", a);
}
#[link(name = "extlib")]
extern {
fn register_callback(cb: extern fn(i32)) -> i32;
fn trigger_callback();
}
fn main() {
unsafe {
register_callback(callback);
trigger_callback(); // Triggers the callback
}
}
Для вашего конкретного случая вы уже знаете конкретный тип функции, который вам нужен:
extern "C" fn mycallback(arg1: *mut Struct_mosquitto,
arg2: *mut ::libc::c_void,
arg3: ::libc::c_int) -> ()
{
println!("I'm in Rust!");
}
А потом использовать как
mosquitto_connect_callback_set(mosq, Some(mycallback));