Використання Bindgen

Інструмент bindgen може автоматично генерувати прив’язки з файлу заголовка C.

Спочатку створіть невелику бібліотеку C:

interoperability/bindgen/libbirthday.h:

typedef struct card { const char* name; int years; } card; void print_card(const card* card);

interoperability/bindgen/libbirthday.c:

#include <stdio.h> #include "libbirthday.h" void print_card(const card* card) { printf("+--------------\n"); printf("| З днем народженняy %s!\n", card->name); printf("| Вітаємо з %i роками!\n", card->years); printf("+--------------\n"); }

Додайте це до свого файлу Android.bp:

interoperability/bindgen/Android.bp:

cc_library { name: "libbirthday", srcs: ["libbirthday.c"], }

Створіть файл заголовка оболонки для бібліотеки (у цьому прикладі це не обов’язково):

interoperability/bindgen/libbirthday_wrapper.h:

#include "libbirthday.h"

Тепер ви можете автоматично генерувати прив’язки:

interoperability/bindgen/Android.bp:

rust_bindgen { name: "libbirthday_bindgen", crate_name: "birthday_bindgen", wrapper_src: "libbirthday_wrapper.h", source_stem: "прив'язки", static_libs: ["libbirthday"], }

Нарешті, ми можемо використовувати прив’язки в нашій програмі Rust:

interoperability/bindgen/Android.bp:

rust_binary { name: "print_birthday_card", srcs: ["main.rs"], rustlibs: ["libbirthday_bindgen"], }

interoperability/bindgen/main.rs:

//! Демонстрація Bindgen. use birthday_bindgen::{card, print_card}; fn main() { let name = std::ffi::CString::new("Peter").unwrap(); let card = card { name: name.as_ptr(), years: 42 }; // БЕЗПЕКА: Вказівник, який ми передаємо, є дійсним, оскільки він прийшов з // Rust посилання, а `name`, яке воно містить, посилається на `name` // вище, яке також залишається дійсним. `print_card` не зберігає жодного з вказівників, щоб використати // їх пізніше після повернення. unsafe { print_card(&card as *const card); } }

Створіть, завантажте і запустіть бінарний файл на своєму пристрої:

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

Нарешті, ми можемо запустити автоматично згенеровані тести, щоб переконатися, що прив’язки працюють:

interoperability/bindgen/Android.bp:

rust_test { name: "libbirthday_bindgen_test", srcs: [":libbirthday_bindgen"], crate_name: "libbirthday_bindgen_test", test_suites: ["general-tests"], auto_gen_config: true, clippy_lints: "none", // Згенерований файл, пропустити лінтування lints: "none", }
atest libbirthday_bindgen_test