将C数组传递给Rust函数

我正在尝试制作Rust dylib并使用其他语言,如C,Python等。 我已成功调用了一个Rust函数和来自python的i32参数。 现在我正在尝试创建一个函数,它接受一个数组(指向它的指针,或者将数据集传递给Rust lib所需的任何东西)。

#![crate_type = "dylib"] #[no_mangle] pub extern fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 { *(arrayPointer) } 

这按预期工作。 但

 #![crate_type = "dylib"] #[no_mangle] pub extern fn rust_multiply(size: i32, arrayPointer: &i32) -> i32 { *(arrayPointer + 1) // trying to get next element } 

失败了

 src/lib.rs:5:2: 6:2 error: type `i32` cannot be dereferenced src/lib.rs:5 *(arrayPointer + 1) src/lib.rs:6 } 

这个:

 pub extern fn rust_multiply(size: i32, array: &[i32]) -> i32 

并且像array[0]失败并出现“length = 0”错误。

您必须努力提供纯C api并使用不安全的代码实现一些转换。 幸运的是,它并不那么困难:

 extern crate libc; #[no_mangle] pub extern fn rust_multiply(size: libc::size_t, array_pointer: *const libc::uint32_t) -> libc::uint32_t { internal_rust_multiply(unsafe { std::slice::from_raw_parts(array_pointer as *const i32, size as usize) }) as libc::uint32_t } fn internal_rust_multiply(array: &[i32]) -> i32 { assert!(!array.is_empty()); array[0] } 

在官方网站上有关于生锈FFI的很好的介绍。

只想指出在@ swizard的代码中,他正在获得无符号的整数并将它们转换为有符号的整数。 你可能想要的代码是

 extern crate libc; #[no_mangle] pub extern fn rust_multiply(size: libc::size_t, array_pointer: *const libc::int32_t) -> libc::int32_t { internal_rust_multiply(unsafe { std::slice::from_raw_parts(array_pointer as *const i32, size as usize) }) as libc::int32_t } fn internal_rust_multiply(array: &[i32]) -> i32 { assert!(!array.is_empty()); array[0] }