我正在尝试制作一个Rust动态链接库,并从其他语言(如C、Python等)中使用它。我已经成功地从Python调用了一个接受i32参数的Rust函数。现在,我正在尝试创建一个接受数组(或指向它的指针,或任何必要的内容以将数据集传递给Rust)的函数。
#![crate_type = "dylib"]
#[no_mangle]
pub extern "C" fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 {
*(arrayPointer)
}
这个工作效果很好。但是
#![crate_type = "dylib"]
#[no_mangle]
pub extern "C" fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 {
*(arrayPointer + 1) // trying to get next element
}
失败,显示错误信息为
error[E0614]: type `i32` cannot be dereferenced
--> src/lib.rs:4:5
|
4 | *(arrayPointer + 1) // trying to get next element
| ^^^^^^^^^^^^^^^^^^^
做这个操作:
pub extern fn rust_multiply(size: i32, array: &[i32]) -> i32
如果像这样执行array[0]
的操作,会出现“length = 0”的错误。
i32
或引用(例如&i32
)的extern
函数。最好使用 C 类型,以保证与您的平台匹配 - 如答案中所示的libc::uint32_t
。此外,Rust 引用保证是非空的,但在通过 FFI 调用时没有强制执行。更安全的做法是接受一个*const libc::uint32_t
(再次如答案所示),然后在将其转换为引用之前断言它不为空。 - Shepmaster