Using Bindgen

The bindgen tool can auto-generate bindings from a C header file.

First create a small C library:


typedef struct card {
  const char* name;
  int years;
} card;

void print_card(const card* card);


#include <stdio.h>
#include "libbirthday.h"

void print_card(const card* card) {
  printf("| Happy Birthday %s!\n", card->name);
  printf("| Congratulations with the %i years!\n", card->years);

Add this to your Android.bp file:


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

Create a wrapper header file for the library (not strictly needed in this example):


#include "libbirthday.h"

You can now auto-generate the bindings:


rust_bindgen {
    name: "libbirthday_bindgen",
    crate_name: "birthday_bindgen",
    wrapper_src: "libbirthday_wrapper.h",
    source_stem: "bindings",
    static_libs: ["libbirthday"],

Finally, we can use the bindings in our Rust program:


rust_binary {
    name: "print_birthday_card",
    srcs: [""],
    rustlibs: ["libbirthday_bindgen"],


//! Bindgen demo.

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 };
    // SAFETY: The pointer we pass is valid because it came from a Rust
    // reference, and the `name` it contains refers to `name` above which also
    // remains valid. `print_card` doesn't store either pointer to use later
    // after it returns.
    unsafe {
        print_card(&card as *const card);

Build, push, and run the binary on your device:

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

Finally, we can run auto-generated tests to ensure the bindings work:


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", // Generated file, skip linting
    lints: "none",
atest libbirthday_bindgen_test