我正在尝试制作Rust dylib,并从其他语言(例如C,Python和其他语言)中使用它。我已经成功地调用了Rust函数,该函数使用Python的i32参数。现在,我正在尝试制作一个函数,该函数接受一个数组(或指向它的指针,或将数据集传递给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”错误。
您必须付出一些努力以提供纯C API并使用不安全的代码实现一些转换。幸运的是,它并不那么困难:
extern crate libc;
#[no_mangle]
pub extern "C" 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]
}
官方站点上对Rust FFI有很好的介绍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句