簡體   English   中英

是否可以在 Rust 中接收指向 C function 的指針並將其回調?

[英]Is it possible to receive a pointer to C function in Rust and call it back?

我正在學習如何連接 Rust 和 C++(使用 C 接口)。 這是 Mozilla 關於 Android 的 Rust 指南中的示例:

use std::os::raw::{c_char};
use std::ffi::{CString, CStr};

#[no_mangle]
pub extern fn rust_greeting(to: *const c_char) -> *mut c_char {
    let c_str = unsafe { CStr::from_ptr(to) };
    let recipient = match c_str.to_str() {
        Err(_) => "there",
        Ok(string) => string,
    };

    CString::new("Hello ".to_owned() + recipient).unwrap().into_raw()
}

如您所見,預計會有一個 C 字符指針,它也返回一個 C 字符指針。

我想在我的項目中使用 Rust 代碼作為庫。 此 Rust 代碼將在數據包准備好后將其發送給我。 因此,我需要一種將回調傳遞給 Rust 的方法,以便它可以在有數據時回調它。 有點像這個 C++ 片段:

extern "C" onData(uint8_t* payload, size_t size) {
    //do something with payload
}

MyRustType myRustObject("initialization_string");
myRustObject.setOnDataCallback(&onData);
myRustObject.beginWork();

因此,rust 'class' MyRustType將開始工作並通過onData傳遞數據包。 是否可以將 C function 作為指向 Rust 的指針傳遞?

If not, I can pass the pointer as an uint64_t number, and make Rust pass this number + payload back to a C function, which in turn casts this uint64_t pointer into the function and calls it with the payload. 但我認為,由於 Rust 對 C 語言非常友好,因此有更好的方法來做到這一點。

您可以自由但不安全地從 C 到 Rust 以及從 Rust 到 Z0D61F8370CAD1D412D78

從 Rust 到 C:使用 C 函數的原型編寫一個extern "C"塊。

從 C 到 Rust:編寫 Rust ZC1C425268E68385D14AB507 a 前綴#[no_mangle] extern "C" 您必須確保接收或返回的任何值都是 FFI 友好的:基本類型或repr(C)類型或指向這些類型和其他一些類型的原始指針。

您還需要與 Rust 的聲明等效的 C 聲明。 為此,您可以使用std::os::rawstd::ffi和外部 crate libc中的類型。

特別是關於 function 指針的問題的答案,例如 C 中的這種類型:

typedef int (*callback)(uint8_t *data, size_t len);

翻譯成 Rust 為:

type Callback = unsafe extern "C" fn(data: *mut u8, len: usize) -> c_int;

這種類型的Callback是 FFI 友好的,因此您可以存儲它,在 Rust 和 C 之間傳遞,並隨時調用它。 當然,您可以在其他 FFI 聲明中將其用作參數或返回類型:

int do_the_thing(uint8_t*data, size_t len, callback cb);
#[no_mangle]
pub extern "C" fn do_the_thing(
    data: *const u8, len: usize,
    cb: Option<Callback>) -> c_int)
{
    //...
}

請記住,在 Rust 中,指針函數不可為空,因此如果您希望 C 能夠通過NULL ,請使用Option<fn>

有關 Rust 中 FFI 的更多詳細信息,您可以閱讀 Rustonomicon的這一章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM