O MĂłdulo Bridge

O CXX depende de uma descrição das assinaturas de função que serĂŁo expostas de cada linguagem para a outra. VocĂȘ fornece essa descrição usando blocos externos em um mĂłdulo Rust anotado com a macro de atributo #[cxx::bridge].

#[allow(unsafe_op_in_unsafe_fn)]
#[cxx::bridge(namespace = "org::blobstore")]
mod ffi {
    // Estruturas compartilhadas com campos visĂ­veis para ambas as linguagens.
    struct BlobMetadata {
        size: usize,
        tags: Vec<String>,
    }

    // Tipos e assinaturas Rust expostos ao C++.
    extern "Rust" {
        type MultiBuf;

        fn next_chunk(buf: &mut MultiBuf) -> &[u8];
    }

    // Tipos e assinaturas C++ expostos ao Rust.
    unsafe extern "C++" {
        include!("include/blobstore.h");

        type BlobstoreClient;

        fn new_blobstore_client() -> UniquePtr<BlobstoreClient>;
        fn put(self: Pin<&mut BlobstoreClient>, parts: &mut MultiBuf) -> u64;
        fn tag(self: Pin<&mut BlobstoreClient>, blobid: u64, tag: &str);
        fn metadata(&self, blobid: u64) -> BlobMetadata;
    }
}
  • O bridge geralmente Ă© declarado em um mĂłdulo ffi dentro do seu crate.
  • A partir das declaraçÔes feitas no mĂłdulo bridge, o CXX gerarĂĄ definiçÔes de tipo/função correspondentes em Rust e C++ para expor esses itens para ambas as linguagens.
  • Para visualizar o cĂłdigo Rust gerado, use cargo-expand para visualizar a macro de procedimento expandida. Para a maioria dos exemplos, vocĂȘ usaria cargo expand ::ffi para expandir apenas o mĂłdulo ffi (embora isso nĂŁo se aplique a projetos Android).
  • Para visualizar o cĂłdigo C++ gerado, procure em target/cxxbridge.