调用 Rust

将 Rust 函数和类型导出到 C 很简单:

interoperability/rust/libanalyze/analyze.rs

1. //! Rust FFI demo.
2. #![deny(improper_ctypes_definitions)]

4. use std::os::raw::c_int;

6. /// Analyze the numbers.
7. #[no_mangle]
8. pub extern "C" fn analyze_numbers(x: c_int, y: c_int) {
9. if x < y {
10. println!("x ({x}) is smallest!");
11. } else {
12. println!("y ({y}) is probably larger than x ({x})");
13. }
14. }

interoperability/rust/libanalyze/analyze.h

1. #ifndef ANALYSE_H
2. #define ANALYSE_H

4. extern "C" {
5. void analyze_numbers(int x, int y);
6. }

8. #endif

interoperability/rust/libanalyze/Android.bp

1. rust_ffi {
2. name: "libanalyze_ffi",
3. crate_name: "analyze_ffi",
4. srcs: ["analyze.rs"],
5. include_dirs: ["."],
6. }

我们现在可以从一个 C 二进制文件中调用它:

interoperability/rust/analyze/main.c

1. #include "analyze.h"

3. int main() {
4. analyze_numbers(10, 20);
5. analyze_numbers(123, 123);
6. return 0;
7. }

interoperability/rust/analyze/Android.bp

1. cc_binary {
2. name: "analyze_numbers",
3. srcs: ["main.c"],
4. static_libs: ["libanalyze_ffi"],
5. }

在你的设备上构建,推送,并运行二进制文件 :

1. m analyze_numbers
2. adb push "$ANDROID_PRODUCT_OUT/system/bin/analyze_numbers" /data/local/tmp
3. adb shell /data/local/tmp/analyze_numbers

#[no_mangle] 禁用了 Rust 通常的名称重整,因此导出的符号将仅为函数的名称。你还可以使用 #[export_name = "some_name"] 来指定任意你想要的名称。