Chamando Rust

Exportar funçÔes e tipos do Rust para C é fåcil:

interoperability/rust/libanalyze/analyze.rs

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

use std::os::raw::c_int;

/// Analisar os nĂșmeros.
#[no_mangle]
pub extern "C" fn analyze_numbers(x: c_int, y: c_int) {
    if x < y {
        println!("x ({x}) Ă© o menor!");
    } else {
        println!("y ({y}) Ă© provavelmente maior que x ({x})");
    }
}

interoperability/rust/libanalyze/analyze.h

#ifndef ANALYSE_H
#define ANALYSE_H

extern "C" {
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: ["."],
}

Agora podemos chamĂĄ-lo a partir de um binĂĄrio C:

interoperability/rust/analisar/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"],
}

Compile, envie e execute o binĂĄrio em seu dispositivo:

m analyze_numbers
adb push "$ANDROID_PRODUCT_OUT/system/bin/analyze_numbers /data/local/tmp"
adb shell /data/local/tmp/analyze_numbers

#[no_mangle] desativa a alteração de name usual do Rust, entĂŁo o sĂ­mbolo exportado serĂĄ apenas o nome da função. VocĂȘ tambĂ©m pode usar #[export_name = "algum_nome"] para especificar qualquer nome que desejar.