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.