Виклик Rust
Експортувати функції та типи Rust на C легко:
interoperability/rust/libanalyze/analyze.rs
//! Демонстрація Rust FFI. #![deny(improper_ctypes_definitions)] use std::os::raw::c_int; /// Аналізуємо цифри. // БЕЗПЕКА: Іншої глобальної функції з таким ім'ям не існує. #[unsafe(no_mangle)] pub extern "C" fn analyze_numbers(x: c_int, y: c_int) { if x < y { println!("x ({x}) є найменшим!"); } else { println!("y ({y}) ймовірно більше, ніж x ({x})"); } }
interoperability/rust/libanalyze/analyze.h
#ifndef ANALYSE_H
#define ANALYSE_H
void analyze_numbers(int x, int y);
#endif
interoperability/rust/libanalyze/Android.bp
rust_ffi {
    name: "libanalyze_ffi",
    crate_name: "analyze_ffi",
    srcs: ["analyze.rs"],
    include_dirs: ["."],
}
Тепер ми можемо викликати це з бінарного файлу C:
interoperability/rust/analyze/main.c
#include "analyze.h"
int main() {
  analyze_numbers(10, 20);
  analyze_numbers(123, 123);
  return 0;
}
interoperability/rust/analyze/Android.bp
cc_binary {
    name: "analyze_numbers",
    srcs: ["main.c"],
    static_libs: ["libanalyze_ffi"],
}
Створіть, завантажте і запустіть бінарний файл на своєму пристрої:
m analyze_numbers
adb push "$ANDROID_PRODUCT_OUT/system/bin/analyze_numbers" /data/local/tmp
adb shell /data/local/tmp/analyze_numbers
#[unsafe(no_mangle)] вимикає звичайне перетворення назв Rust, тому експортований символ буде просто назвою функції. Ви також можете використовувати #[unsafe(export_name = "some_name")], щоб вказати будь-яке ім’я.