Використання 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