Merkmalsobjekte

AIDL objects can be sent either as a concrete AIDL type or as the type-erased IBinder interface:

birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider.aidl:

package com.example.birthdayservice; interface IBirthdayInfoProvider { String name(); int years(); }

birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl:

import com.example.birthdayservice.IBirthdayInfoProvider; interface IBirthdayService { /** The same thing, but using a binder object. */ String wishWithProvider(IBirthdayInfoProvider provider); /** The same thing, but using `IBinder`. */ String wishWithErasedProvider(IBinder provider); }

birthday_service/src/client.rs:

/// Rust struct implementing the `IBirthdayInfoProvider` interface. struct InfoProvider { name: String, age: u8, } impl binder::Interface for InfoProvider {} impl IBirthdayInfoProvider for InfoProvider { fn name(&self) -> binder::Result<String> { Ok(self.name.clone()) } fn years(&self) -> binder::Result<i32> { Ok(self.age as i32) } } fn main() { binder::ProcessState::start_thread_pool(); let service = connect().expect("Failed to connect to BirthdayService"); // Create a binder object for the `IBirthdayInfoProvider` interface. let provider = BnBirthdayInfoProvider::new_binder( InfoProvider { name: name.clone(), age: years as u8 }, BinderFeatures::default(), ); // Send the binder object to the service. service.wishWithProvider(&provider)?; // Perform the same operation but passing the provider as an `SpIBinder`. service.wishWithErasedProvider(&provider.as_binder())?; }

Speaker Notes

  • Note the usage of BnBirthdayInfoProvider. This serves the same purpose as BnBirthdayService that we saw previously.