From 8a161c0971388c7559c2169e30bc6840060fe1ce Mon Sep 17 00:00:00 2001 From: Jasper Bekkers Date: Thu, 8 Sep 2022 16:24:26 +0200 Subject: [PATCH 01/33] cargo-apk: Print and follow `adb logcat` output after starting app (#332) Co-authored-by: Marijn Suijten --- .github/workflows/android_test.sh | 2 +- cargo-apk/CHANGELOG.md | 1 + cargo-apk/src/apk.rs | 17 ++++++++++++++++- cargo-apk/src/main.rs | 31 +++++++++++++++++++------------ ndk-build/CHANGELOG.md | 1 + 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/.github/workflows/android_test.sh b/.github/workflows/android_test.sh index b782a650..6368cabc 100755 --- a/.github/workflows/android_test.sh +++ b/.github/workflows/android_test.sh @@ -10,7 +10,7 @@ adb uninstall rust.example.hello_world || true if [ -z "$1" ]; then - cargo apk run -p ndk-examples --target x86_64-linux-android --example hello_world + cargo apk run -p ndk-examples --target x86_64-linux-android --example hello_world --no-logcat else adb install -r "$1/hello_world.apk" adb shell am start -a android.intent.action.MAIN -n "rust.example.hello_world/android.app.NativeActivity" diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 46a1df6d..072c6c73 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -3,6 +3,7 @@ - Upgrade to latest `ndk-build` to deduplicate libraries before packaging them into the APK. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) - Support `android:resizeableActivity`. ([#338](https://github.com/rust-windowing/android-ndk-rs/pull/338)) - Add `--device` argument to select `adb` device by serial (see `adb devices` for connected devices and their serial). ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) +- Print and follow `adb logcat` output after starting app. ([#332](https://github.com/rust-windowing/android-ndk-rs/pull/332)) # 0.9.3 (2022-07-05) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index fd06b0a1..bf4b5569 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -18,12 +18,14 @@ pub struct ApkBuilder<'a> { build_dir: PathBuf, build_targets: Vec, device_serial: Option, + no_logcat: bool, } impl<'a> ApkBuilder<'a> { pub fn from_subcommand( cmd: &'a Subcommand, device_serial: Option, + no_logcat: bool, ) -> Result { let ndk = Ndk::from_env()?; let mut manifest = Manifest::parse_from_toml(cmd.manifest())?; @@ -100,6 +102,7 @@ impl<'a> ApkBuilder<'a> { build_dir, build_targets, device_serial, + no_logcat, }) } @@ -244,7 +247,19 @@ impl<'a> ApkBuilder<'a> { pub fn run(&self, artifact: &Artifact) -> Result<(), Error> { let apk = self.build(artifact)?; apk.install(self.device_serial.as_deref())?; - apk.start(self.device_serial.as_deref())?; + let pid = apk.start(self.device_serial.as_deref())?; + + if !self.no_logcat { + self.ndk + .adb(self.device_serial.as_deref())? + .arg("logcat") + .arg("-v") + .arg("color") + .arg("--pid") + .arg(pid.to_string()) + .status()?; + } + Ok(()) } diff --git a/cargo-apk/src/main.rs b/cargo-apk/src/main.rs index c72207b1..c73f4356 100644 --- a/cargo-apk/src/main.rs +++ b/cargo-apk/src/main.rs @@ -6,8 +6,9 @@ fn main() -> anyhow::Result<()> { env_logger::init(); let args = std::env::args(); let mut device_serial = None; - let cmd = Subcommand::new(args, "apk", |name, value| { - if name == "--device" { + let mut no_logcat = false; + let cmd = Subcommand::new(args, "apk", |name, value| match name { + "--device" => { if let Some(value) = value { println!("Running on {}", value); device_serial = Some(value.to_owned()); @@ -15,12 +16,15 @@ fn main() -> anyhow::Result<()> { } else { Err(cargo_subcommand::Error::InvalidArgs) } - } else { - Ok(false) } + "--no-logcat" => { + no_logcat = true; + Ok(true) + } + _ => Ok(false), }) .map_err(Error::Subcommand)?; - let builder = ApkBuilder::from_subcommand(&cmd, device_serial)?; + let builder = ApkBuilder::from_subcommand(&cmd, device_serial, no_logcat)?; match cmd.cmd() { "check" | "c" => builder.check()?, @@ -79,15 +83,18 @@ USAGE: cargo apk [SUBCOMMAND] SUBCOMMAND: - check, c Checks that the current package builds without creating an apk - build, b Compiles the current package and creates an apk - run, r Run a binary or example of the local package - gdb Start a gdb session attached to an adb device with symbols loaded - version Print the version of cargo-apk + check, c Checks that the current package builds without creating an apk + build, b Compiles the current package and creates an apk + run, r Run a binary or example of the local package + gdb Start a gdb session attached to an adb device with symbols loaded + version Print the version of cargo-apk + +FLAGS: + --no-logcat Don't print and follow `logcat` after running the application. OPTIONS: - --device Use device with the given serial. See `adb devices` for a list of - connected Android devices. + --device Use device with the given serial. See `adb devices` for a list of + connected Android devices. "# ); } diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 1d5bc033..de987d18 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -3,6 +3,7 @@ - **Breaking:** Postpone APK library packaging until before zip alignment, to deduplicate possibly overlapping entries. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) - Add `adb` device serial parameter to `detect_abi()` and `Apk::{install,start}()`. ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) - Fix missing `.exe` extension for `adb` on Windows inside `detect_abi()`. ([#339](https://github.com/rust-windowing/android-ndk-rs/pull/339)) +- `start()` now returns the PID of the started app process (useful for passing to `adb logcat --pid`). ([#331](https://github.com/rust-windowing/android-ndk-rs/pull/331)) # 0.7.0 (2022-07-05) From 78c80c1c20918d5bdc6cb991c1ea0b47d4e2dfb4 Mon Sep 17 00:00:00 2001 From: Jasper Bekkers Date: Thu, 8 Sep 2022 16:38:45 +0200 Subject: [PATCH 02/33] ndk-build: Add `ndk_gdb()` function to acquire `ndk-gdb` script path with the correct per-platform extension (#330) Co-authored-by: Marijn Suijten --- cargo-apk/src/apk.rs | 2 +- ndk-build/CHANGELOG.md | 1 + ndk-build/src/lib.rs | 10 ++++++++++ ndk-build/src/ndk.rs | 4 ++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index bf4b5569..53b3e4ed 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -273,7 +273,7 @@ impl<'a> ApkBuilder<'a> { jni_dir.join("Android.mk"), format!("APP_ABI=\"{}\"\nTARGET_OUT=\"\"\n", abi.android_abi()), )?; - Command::new(self.ndk.ndk().join("ndk-gdb")) + Command::new(self.ndk.ndk_gdb()) .current_dir(target_dir) .status()?; Ok(()) diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index de987d18..0c4ad311 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -4,6 +4,7 @@ - Add `adb` device serial parameter to `detect_abi()` and `Apk::{install,start}()`. ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) - Fix missing `.exe` extension for `adb` on Windows inside `detect_abi()`. ([#339](https://github.com/rust-windowing/android-ndk-rs/pull/339)) - `start()` now returns the PID of the started app process (useful for passing to `adb logcat --pid`). ([#331](https://github.com/rust-windowing/android-ndk-rs/pull/331)) +- Add `ndk_gdb()` function to acquire `ndk-gdb` script path with the appropriate extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330)) # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/lib.rs b/ndk-build/src/lib.rs index a4323002..efd6dc6f 100644 --- a/ndk-build/src/lib.rs +++ b/ndk-build/src/lib.rs @@ -18,6 +18,16 @@ macro_rules! bat { }; } +macro_rules! cmd { + ($cmd:expr) => { + if cfg!(target_os = "windows") { + concat!($cmd, ".cmd") + } else { + $cmd + } + }; +} + pub mod apk; pub mod cargo; pub mod dylibs; diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index 78e4abf6..a9e6a004 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -127,6 +127,10 @@ impl Ndk { &self.ndk_path } + pub fn ndk_gdb(&self) -> PathBuf { + self.ndk_path.join(cmd!("ndk-gdb")) + } + pub fn build_tools_version(&self) -> &str { &self.build_tools_version } From 4030f5f1fde5a49ff55eaa6d50ab2498a749ea24 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 8 Sep 2022 17:26:51 +0200 Subject: [PATCH 03/33] cargo-apk: Pass device serial to `ndk-gdb` (#341) `ndk-gdb` must use the same device as `.run()` previously launched the app on. --- cargo-apk/src/apk.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 53b3e4ed..4fe04d76 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -273,9 +273,15 @@ impl<'a> ApkBuilder<'a> { jni_dir.join("Android.mk"), format!("APP_ABI=\"{}\"\nTARGET_OUT=\"\"\n", abi.android_abi()), )?; - Command::new(self.ndk.ndk_gdb()) - .current_dir(target_dir) - .status()?; + + let mut ndk_gdb = Command::new(self.ndk.ndk_gdb()); + + if let Some(device_serial) = &self.device_serial { + ndk_gdb.arg("-s").arg(device_serial); + } + + ndk_gdb.current_dir(target_dir).status()?; + Ok(()) } From 2fe6d4d2783092833142ad0be22ce823e829bc5f Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 8 Sep 2022 17:27:12 +0200 Subject: [PATCH 04/33] cargo-apk: Force-disable logcat in `fn run()` when using `gdb` (#342) The terminal must be available for GDB to start and interact with, instead of indefinitely blocking on a running instance of `logcat`. --- cargo-apk/src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cargo-apk/src/main.rs b/cargo-apk/src/main.rs index c73f4356..67ee0a19 100644 --- a/cargo-apk/src/main.rs +++ b/cargo-apk/src/main.rs @@ -24,6 +24,11 @@ fn main() -> anyhow::Result<()> { _ => Ok(false), }) .map_err(Error::Subcommand)?; + + if cmd.cmd() == "gdb" { + no_logcat = true; + } + let builder = ApkBuilder::from_subcommand(&cmd, device_serial, no_logcat)?; match cmd.cmd() { From 96f573f4f592fea1840894fbfceffd042b866d67 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 9 Sep 2022 16:03:25 +0200 Subject: [PATCH 05/33] cargo-apk,ndk-build: Move `ndk-gdb` setup to `ndk-build` (#258) This skips the top-level script in the root of the NDK folder, making it ever so slightly faster to launch. --- cargo-apk/src/apk.rs | 19 ++--------------- ndk-build/CHANGELOG.md | 3 ++- ndk-build/src/ndk.rs | 48 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 4fe04d76..f5041c79 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -9,7 +9,6 @@ use ndk_build::manifest::{IntentFilter, MetaData}; use ndk_build::ndk::{Key, Ndk}; use ndk_build::target::Target; use std::path::PathBuf; -use std::process::Command; pub struct ApkBuilder<'a> { cmd: &'a Subcommand, @@ -265,23 +264,9 @@ impl<'a> ApkBuilder<'a> { pub fn gdb(&self, artifact: &Artifact) -> Result<(), Error> { self.run(artifact)?; - let abi = self.ndk.detect_abi(self.device_serial.as_deref())?; let target_dir = self.build_dir.join(artifact); - let jni_dir = target_dir.join("jni"); - std::fs::create_dir_all(&jni_dir)?; - std::fs::write( - jni_dir.join("Android.mk"), - format!("APP_ABI=\"{}\"\nTARGET_OUT=\"\"\n", abi.android_abi()), - )?; - - let mut ndk_gdb = Command::new(self.ndk.ndk_gdb()); - - if let Some(device_serial) = &self.device_serial { - ndk_gdb.arg("-s").arg(device_serial); - } - - ndk_gdb.current_dir(target_dir).status()?; - + self.ndk + .ndk_gdb(&target_dir, self.device_serial.as_deref())?; Ok(()) } diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 0c4ad311..a3f71f32 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -4,7 +4,8 @@ - Add `adb` device serial parameter to `detect_abi()` and `Apk::{install,start}()`. ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) - Fix missing `.exe` extension for `adb` on Windows inside `detect_abi()`. ([#339](https://github.com/rust-windowing/android-ndk-rs/pull/339)) - `start()` now returns the PID of the started app process (useful for passing to `adb logcat --pid`). ([#331](https://github.com/rust-windowing/android-ndk-rs/pull/331)) -- Add `ndk_gdb()` function to acquire `ndk-gdb` script path with the appropriate extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330)) +- Inherit `ndk_gdb()` function from `cargo-apk` with the appropriate script extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330), [#258](https://github.com/rust-windowing/android-ndk-rs/pull/258)) + # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index a9e6a004..6e35758d 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -127,10 +127,6 @@ impl Ndk { &self.ndk_path } - pub fn ndk_gdb(&self) -> PathBuf { - self.ndk_path.join(cmd!("ndk-gdb")) - } - pub fn build_tools_version(&self) -> &str { &self.build_tools_version } @@ -194,11 +190,11 @@ impl Ndk { Ok(android_jar) } - pub fn toolchain_dir(&self) -> Result { + fn host_arch() -> Result<&'static str, NdkError> { let host_os = std::env::var("HOST").ok(); let host_contains = |s| host_os.as_ref().map(|h| h.contains(s)).unwrap_or(false); - let arch = if host_contains("linux") { + Ok(if host_contains("linux") { "linux" } else if host_contains("macos") { "darwin" @@ -215,8 +211,11 @@ impl Ndk { Some(host_os) => Err(NdkError::UnsupportedHost(host_os)), _ => Err(NdkError::UnsupportedTarget), }; - }; + }) + } + pub fn toolchain_dir(&self) -> Result { + let arch = Self::host_arch()?; let mut toolchain_dir = self .ndk_path .join("toolchains") @@ -286,6 +285,41 @@ impl Ndk { } } + pub fn prebuilt_dir(&self) -> Result { + let arch = Self::host_arch()?; + let prebuilt_dir = self + .ndk_path + .join("prebuilt") + .join(format!("{}-x86_64", arch)); + if !prebuilt_dir.exists() { + Err(NdkError::PathNotFound(prebuilt_dir)) + } else { + Ok(prebuilt_dir) + } + } + + pub fn ndk_gdb( + &self, + launch_dir: impl AsRef, + device_serial: Option<&str>, + ) -> Result<(), NdkError> { + let abi = self.detect_abi(device_serial)?; + let jni_dir = launch_dir.as_ref().join("jni"); + std::fs::create_dir_all(&jni_dir)?; + std::fs::write( + jni_dir.join("Android.mk"), + format!("APP_ABI=\"{}\"\nTARGET_OUT=\"\"\n", abi.android_abi()), + )?; + let mut ndk_gdb = Command::new(self.prebuilt_dir()?.join("bin").join(cmd!("ndk-gdb"))); + + if let Some(device_serial) = &device_serial { + ndk_gdb.arg("-s").arg(device_serial); + } + + ndk_gdb.current_dir(launch_dir).status()?; + Ok(()) + } + pub fn android_dir(&self) -> Result { let android_dir = dirs::home_dir() .ok_or_else(|| NdkError::PathNotFound(PathBuf::from("$HOME")))? From 4280f6f06f971e9ea104d2ea1e84e7614860db23 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 9 Sep 2022 17:43:28 +0200 Subject: [PATCH 06/33] ndk-build: Provide `adb` path to `ndk-gdb` (#343) `adb` is not necessarily available in `PATH`, hence why `cargo-apk` and `ndk-build` detect and use this executable from the SDK path. We should do the same for `ndk-gdb` which strangely doesn't search for `adb` within the SDK it resides in. --- ndk-build/CHANGELOG.md | 2 +- ndk-build/src/ndk.rs | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index a3f71f32..bcfb5923 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -5,7 +5,7 @@ - Fix missing `.exe` extension for `adb` on Windows inside `detect_abi()`. ([#339](https://github.com/rust-windowing/android-ndk-rs/pull/339)) - `start()` now returns the PID of the started app process (useful for passing to `adb logcat --pid`). ([#331](https://github.com/rust-windowing/android-ndk-rs/pull/331)) - Inherit `ndk_gdb()` function from `cargo-apk` with the appropriate script extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330), [#258](https://github.com/rust-windowing/android-ndk-rs/pull/258)) - +- Provide `adb` path to `ndk-gdb`, allowing it to run without `adb` in `PATH`. ([#343](https://github.com/rust-windowing/android-ndk-rs/pull/343)) # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index 6e35758d..46992a47 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -151,12 +151,20 @@ impl Ndk { Ok(Command::new(dunce::canonicalize(path)?)) } - pub fn platform_tool(&self, tool: &str) -> Result { + pub fn platform_tool_path(&self, tool: &str) -> Result { let path = self.sdk_path.join("platform-tools").join(tool); if !path.exists() { return Err(NdkError::CmdNotFound(tool.to_string())); } - Ok(Command::new(dunce::canonicalize(path)?)) + Ok(dunce::canonicalize(path)?) + } + + pub fn adb_path(&self) -> Result { + self.platform_tool_path(bin!("adb")) + } + + pub fn platform_tool(&self, tool: &str) -> Result { + Ok(Command::new(self.platform_tool_path(tool)?)) } pub fn highest_supported_platform(&self) -> u32 { @@ -316,7 +324,11 @@ impl Ndk { ndk_gdb.arg("-s").arg(device_serial); } - ndk_gdb.current_dir(launch_dir).status()?; + ndk_gdb + .arg("--adb") + .arg(self.adb_path()?) + .current_dir(launch_dir) + .status()?; Ok(()) } @@ -429,7 +441,7 @@ impl Ndk { } pub fn adb(&self, device_serial: Option<&str>) -> Result { - let mut adb = self.platform_tool(bin!("adb"))?; + let mut adb = Command::new(self.adb_path()?); if let Some(device_serial) = device_serial { adb.arg("-s").arg(device_serial); From 17a1450c505ee424a4892ec56176462f65624f1c Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 9 Sep 2022 18:06:44 +0200 Subject: [PATCH 07/33] ndk-build: Remove unparsable quotes from `Android.mk` for `ndk-gdb` (#344) On Windows it seems the `ndk-gdb.py` script that invokes `make` to dump the variables from `Android.mk` fails to strip quotation marks from the file correctly, resulting in erroneous output like (notice double quotes at the end of the path): OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'android-ndk-rs\\target\\debug\\apk\\examples\\""' And: Application cannot run on the selected device. Application ABIs: "arm64-v8a" Device ABIs: arm64-v8a, armeabi-v7a, armeabi Solve this by removing the quotes, allowing `ndk-gdb` to launch sucessfully. --- ndk-build/CHANGELOG.md | 1 + ndk-build/src/ndk.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index bcfb5923..379ec3a5 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -6,6 +6,7 @@ - `start()` now returns the PID of the started app process (useful for passing to `adb logcat --pid`). ([#331](https://github.com/rust-windowing/android-ndk-rs/pull/331)) - Inherit `ndk_gdb()` function from `cargo-apk` with the appropriate script extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330), [#258](https://github.com/rust-windowing/android-ndk-rs/pull/258)) - Provide `adb` path to `ndk-gdb`, allowing it to run without `adb` in `PATH`. ([#343](https://github.com/rust-windowing/android-ndk-rs/pull/343)) +- Remove quotes from `Android.mk` to fix `ndk-gdb` on Windows. ([#344](https://github.com/rust-windowing/android-ndk-rs/pull/344)) # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index 46992a47..1f384f3f 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -316,7 +316,7 @@ impl Ndk { std::fs::create_dir_all(&jni_dir)?; std::fs::write( jni_dir.join("Android.mk"), - format!("APP_ABI=\"{}\"\nTARGET_OUT=\"\"\n", abi.android_abi()), + format!("APP_ABI={}\nTARGET_OUT=\n", abi.android_abi()), )?; let mut ndk_gdb = Command::new(self.prebuilt_dir()?.join("bin").join(cmd!("ndk-gdb"))); From 8afd63f3497d6e1f501baafcff56108cd768b4fe Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 12 Sep 2022 13:49:26 +0200 Subject: [PATCH 08/33] ndk-build,cargo-apk: Launch activity directly through `ndk-gdb` (#345) `ndk-gdb` passes `-D` to `am start` to make the process wait until the debugger is launched and ready, instead of possibly crashing the app before the debugger can catch it (paired with a nice "waiting for debugger" dialog and "Force close" button in Android). While we could also set the flag ourselves, this change simplifies the workflow on our end as well now that we don't have to run our own command, potentially get stuck on `pidof` returning multiple PIDs, and having to override `no_logcat` (#342). (For the multiple-PID case though, we can optionally pass `-f` to make `ndk-gdb` kill the debugger and app first, if this ever becomes an issue.) --- cargo-apk/src/apk.rs | 11 ++++++++--- cargo-apk/src/main.rs | 4 ---- ndk-build/CHANGELOG.md | 1 + ndk-build/src/ndk.rs | 3 +++ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index f5041c79..87890321 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -263,10 +263,15 @@ impl<'a> ApkBuilder<'a> { } pub fn gdb(&self, artifact: &Artifact) -> Result<(), Error> { - self.run(artifact)?; + let apk = self.build(artifact)?; + apk.install(self.device_serial.as_deref())?; + let target_dir = self.build_dir.join(artifact); - self.ndk - .ndk_gdb(&target_dir, self.device_serial.as_deref())?; + self.ndk.ndk_gdb( + &target_dir, + "android.app.NativeActivity", + self.device_serial.as_deref(), + )?; Ok(()) } diff --git a/cargo-apk/src/main.rs b/cargo-apk/src/main.rs index 67ee0a19..239e4e0d 100644 --- a/cargo-apk/src/main.rs +++ b/cargo-apk/src/main.rs @@ -25,10 +25,6 @@ fn main() -> anyhow::Result<()> { }) .map_err(Error::Subcommand)?; - if cmd.cmd() == "gdb" { - no_logcat = true; - } - let builder = ApkBuilder::from_subcommand(&cmd, device_serial, no_logcat)?; match cmd.cmd() { diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 379ec3a5..c6a0171a 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -7,6 +7,7 @@ - Inherit `ndk_gdb()` function from `cargo-apk` with the appropriate script extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330), [#258](https://github.com/rust-windowing/android-ndk-rs/pull/258)) - Provide `adb` path to `ndk-gdb`, allowing it to run without `adb` in `PATH`. ([#343](https://github.com/rust-windowing/android-ndk-rs/pull/343)) - Remove quotes from `Android.mk` to fix `ndk-gdb` on Windows. ([#344](https://github.com/rust-windowing/android-ndk-rs/pull/344)) +- Launch Android activity through `ndk-gdb` to block app start until the debugger is attached. ([#345](https://github.com/rust-windowing/android-ndk-rs/pull/345)) # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index 1f384f3f..cda0785a 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -309,6 +309,7 @@ impl Ndk { pub fn ndk_gdb( &self, launch_dir: impl AsRef, + launch_activity: &str, device_serial: Option<&str>, ) -> Result<(), NdkError> { let abi = self.detect_abi(device_serial)?; @@ -327,6 +328,8 @@ impl Ndk { ndk_gdb .arg("--adb") .arg(self.adb_path()?) + .arg("--launch") + .arg(launch_activity) .current_dir(launch_dir) .status()?; Ok(()) From 7665cafa27773ddbbe590a8efc9ca95440396523 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 12 Sep 2022 14:31:05 +0200 Subject: [PATCH 09/33] ndk-build: Consider ANDROID_SDK_ROOT as deprecated instead of ANDROID_HOME (#346) According to the [official documentation] `ndk-build` is considering the wrong variable as deprecated. The wrong message was introduced in [#39] which bizarrely failed to quote any reference matterial on the matter, making it impossible to understand whether this has always been the case or recently switched in precedence. [official documentation]: https://developer.android.com/studio/command-line/variables [#39]: https://github.com/rust-windowing/android-ndk-rs/pull/39 --- ndk-build/CHANGELOG.md | 1 + ndk-build/src/ndk.rs | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index c6a0171a..da73cd08 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -8,6 +8,7 @@ - Provide `adb` path to `ndk-gdb`, allowing it to run without `adb` in `PATH`. ([#343](https://github.com/rust-windowing/android-ndk-rs/pull/343)) - Remove quotes from `Android.mk` to fix `ndk-gdb` on Windows. ([#344](https://github.com/rust-windowing/android-ndk-rs/pull/344)) - Launch Android activity through `ndk-gdb` to block app start until the debugger is attached. ([#345](https://github.com/rust-windowing/android-ndk-rs/pull/345)) +- Consider `ANDROID_SDK_ROOT` as deprecated instead of `ANDROID_HOME`. ([#346](https://github.com/rust-windowing/android-ndk-rs/pull/346)) # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index cda0785a..a7e7efc2 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -16,18 +16,20 @@ pub struct Ndk { impl Ndk { pub fn from_env() -> Result { let sdk_path = { - let mut sdk_path = std::env::var("ANDROID_HOME").ok(); + let sdk_path = std::env::var("ANDROID_SDK_ROOT").ok(); if sdk_path.is_some() { - println!( - "Warning: You use environment variable ANDROID_HOME that is deprecated. \ - Please, remove it and use ANDROID_SDK_ROOT instead. Now ANDROID_HOME is used" + eprintln!( + "Warning: Environment variable ANDROID_SDK_ROOT is deprecated \ + (https://developer.android.com/studio/command-line/variables#envar). \ + It will be used until it is unset and replaced by ANDROID_HOME." ); } - if sdk_path.is_none() { - sdk_path = std::env::var("ANDROID_SDK_ROOT").ok(); - } - PathBuf::from(sdk_path.ok_or(NdkError::SdkNotFound)?) + PathBuf::from( + sdk_path + .or_else(|| std::env::var("ANDROID_HOME").ok()) + .ok_or(NdkError::SdkNotFound)?, + ) }; let ndk_path = { From ee971fd8309941f53adc954f5d2fb8c39adc0104 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 12 Sep 2022 15:18:55 +0200 Subject: [PATCH 10/33] ndk-build: Read ANDROID_USER_HOME and ANDROID_SDK_HOME env for `$HOME/.android` folder (#347) Use the [documented environment variables] to determine the location of `$HOME/.android`, instead of hardcoding it to reside under `$HOME`. [documented environment variables]: https://developer.android.com/studio/command-line/variables#envar --- ndk-build/CHANGELOG.md | 1 + ndk-build/src/ndk.rs | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index da73cd08..f4a368bf 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -9,6 +9,7 @@ - Remove quotes from `Android.mk` to fix `ndk-gdb` on Windows. ([#344](https://github.com/rust-windowing/android-ndk-rs/pull/344)) - Launch Android activity through `ndk-gdb` to block app start until the debugger is attached. ([#345](https://github.com/rust-windowing/android-ndk-rs/pull/345)) - Consider `ANDROID_SDK_ROOT` as deprecated instead of `ANDROID_HOME`. ([#346](https://github.com/rust-windowing/android-ndk-rs/pull/346)) +- **Breaking:** Rename `fn android_dir()` to `fn android_user_home()` and seed with `ANDROID_SDK_HOME` or `ANDROID_USER_HOME`. ([#347](https://github.com/rust-windowing/android-ndk-rs/pull/347)) # 0.7.0 (2022-07-05) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index a7e7efc2..fd562c65 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -7,6 +7,7 @@ use std::process::Command; #[derive(Clone, Debug, Eq, PartialEq)] pub struct Ndk { sdk_path: PathBuf, + user_home: PathBuf, ndk_path: PathBuf, build_tools_version: String, build_tag: u32, @@ -32,6 +33,29 @@ impl Ndk { ) }; + let user_home = { + let user_home = std::env::var("ANDROID_SDK_HOME") + .map(PathBuf::from) + // Unlike ANDROID_USER_HOME, ANDROID_SDK_HOME points to the _parent_ directory of .android: + // https://developer.android.com/studio/command-line/variables#envar + .map(|home| home.join(".android")) + .ok(); + + if user_home.is_some() { + eprintln!( + "Warning: Environment variable ANDROID_SDK_HOME is deprecated \ + (https://developer.android.com/studio/command-line/variables#envar). \ + It will be used until it is unset and replaced by ANDROID_USER_HOME." + ); + } + + // Default to $HOME/.android + user_home + .or_else(|| std::env::var("ANDROID_USER_HOME").map(PathBuf::from).ok()) + .or_else(|| dirs::home_dir().map(|home| home.join(".android"))) + .ok_or_else(|| NdkError::PathNotFound(PathBuf::from("$HOME")))? + }; + let ndk_path = { let ndk_path = std::env::var("ANDROID_NDK_ROOT") .ok() @@ -114,6 +138,7 @@ impl Ndk { Ok(Self { sdk_path, + user_home, ndk_path, build_tools_version, build_tag, @@ -337,12 +362,10 @@ impl Ndk { Ok(()) } - pub fn android_dir(&self) -> Result { - let android_dir = dirs::home_dir() - .ok_or_else(|| NdkError::PathNotFound(PathBuf::from("$HOME")))? - .join(".android"); - std::fs::create_dir_all(&android_dir)?; - Ok(android_dir) + pub fn android_user_home(&self) -> Result { + let android_user_home = self.user_home.clone(); + std::fs::create_dir_all(&android_user_home)?; + Ok(android_user_home) } pub fn keytool(&self) -> Result { @@ -359,7 +382,7 @@ impl Ndk { } pub fn debug_key(&self) -> Result { - let path = self.android_dir()?.join("debug.keystore"); + let path = self.android_user_home()?.join("debug.keystore"); let password = "android".to_string(); if !path.exists() { let mut keytool = self.keytool()?; From 25e647abe800d08453b74c3a1fa90528ff97844c Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 12 Sep 2022 15:42:02 +0200 Subject: [PATCH 11/33] Release ndk-build-0.8.0, cargo-apk-0.9.4 (#336) --- cargo-apk/CHANGELOG.md | 2 ++ cargo-apk/Cargo.toml | 4 ++-- ndk-build/CHANGELOG.md | 2 ++ ndk-build/Cargo.toml | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 072c6c73..8b16d7b0 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +# 0.9.4 (2022-09-12) + - Upgrade to latest `ndk-build` to deduplicate libraries before packaging them into the APK. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) - Support `android:resizeableActivity`. ([#338](https://github.com/rust-windowing/android-ndk-rs/pull/338)) - Add `--device` argument to select `adb` device by serial (see `adb devices` for connected devices and their serial). ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index 1fadd458..906748cc 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-apk" -version = "0.9.3" +version = "0.9.4" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Helps cargo build APKs" @@ -16,7 +16,7 @@ cargo-subcommand = "0.7" dunce = "1" env_logger = "0.9" log = "0.4" -ndk-build = { path = "../ndk-build", version = "0.7.0" } +ndk-build = { path = "../ndk-build", version = "0.8.0" } serde = "1" thiserror = "1.0.31" toml = "0.5" diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index f4a368bf..af1226ce 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +# 0.8.0 (2022-09-12) + - **Breaking:** Postpone APK library packaging until before zip alignment, to deduplicate possibly overlapping entries. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) - Add `adb` device serial parameter to `detect_abi()` and `Apk::{install,start}()`. ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) - Fix missing `.exe` extension for `adb` on Windows inside `detect_abi()`. ([#339](https://github.com/rust-windowing/android-ndk-rs/pull/339)) diff --git a/ndk-build/Cargo.toml b/ndk-build/Cargo.toml index 4b9ff4f6..83bfd419 100644 --- a/ndk-build/Cargo.toml +++ b/ndk-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ndk-build" -version = "0.7.0" +version = "0.8.0" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Utilities for building Android binaries" From e31aab431c8f733ec8140ab3c629fb95b02cd57f Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 21 Sep 2022 23:53:28 +0200 Subject: [PATCH 12/33] ndk/event: Add new `HDMI` and `SENSOR` input sources to `enum Source` (#349) --- ndk/src/event.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ndk/src/event.rs b/ndk/src/event.rs index 843e1114..4273e0fa 100644 --- a/ndk/src/event.rs +++ b/ndk/src/event.rs @@ -42,6 +42,8 @@ pub enum Source { Touchpad = ffi::AINPUT_SOURCE_TOUCHPAD, TouchNavigation = ffi::AINPUT_SOURCE_TOUCH_NAVIGATION, Joystick = ffi::AINPUT_SOURCE_JOYSTICK, + Hdmi = ffi::AINPUT_SOURCE_HDMI, + Sensor = ffi::AINPUT_SOURCE_SENSOR, RotaryEncoder = ffi::AINPUT_SOURCE_ROTARY_ENCODER, Any = ffi::AINPUT_SOURCE_ANY, } From 282ea1d79a5e1610fcb85116e8fd3f84c2e33fac Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 23 Sep 2022 10:23:40 +0200 Subject: [PATCH 13/33] Fix `clippy::unnecessary_lazy_evaluations` since Rust 1.64 (#350) Rust 1.64 is a bit more strict on requiring `.then_some(...)` here over `.then(|| ...)` with a closure, but the former has only been stabilized in 1.62. No need to be cocky and bump the MSRV, replace it with an `if`-`else` like the rest of the `.exists()` path-checking code around here. --- ndk-build/src/ndk.rs | 9 +++++---- ndk/src/media/media_codec.rs | 38 ++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index fd562c65..64da5034 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -309,14 +309,15 @@ impl Ndk { } else { let llvm_bin = format!("llvm-{}{}", name, ext); let llvm_path = toolchain_path.join(&llvm_bin); - llvm_path - .exists() - .then(|| llvm_path) - .ok_or(NdkError::ToolchainBinaryNotFound { + if llvm_path.exists() { + Ok(llvm_path) + } else { + Err(NdkError::ToolchainBinaryNotFound { toolchain_path, gnu_bin, llvm_bin, }) + } } } diff --git a/ndk/src/media/media_codec.rs b/ndk/src/media/media_codec.rs index f6efe89b..5472e048 100644 --- a/ndk/src/media/media_codec.rs +++ b/ndk/src/media/media_codec.rs @@ -55,26 +55,41 @@ impl MediaFormat { pub fn i32(&self, key: &str) -> Option { let name = CString::new(key).unwrap(); let mut out = 0; - unsafe { ffi::AMediaFormat_getInt32(self.as_ptr(), name.as_ptr(), &mut out) }.then(|| out) + if unsafe { ffi::AMediaFormat_getInt32(self.as_ptr(), name.as_ptr(), &mut out) } { + Some(out) + } else { + None + } } pub fn i64(&self, key: &str) -> Option { let name = CString::new(key).unwrap(); let mut out = 0; - unsafe { ffi::AMediaFormat_getInt64(self.as_ptr(), name.as_ptr(), &mut out) }.then(|| out) + if unsafe { ffi::AMediaFormat_getInt64(self.as_ptr(), name.as_ptr(), &mut out) } { + Some(out) + } else { + None + } } pub fn f32(&self, key: &str) -> Option { let name = CString::new(key).unwrap(); let mut out = 0.0; - unsafe { ffi::AMediaFormat_getFloat(self.as_ptr(), name.as_ptr(), &mut out) }.then(|| out) + if unsafe { ffi::AMediaFormat_getFloat(self.as_ptr(), name.as_ptr(), &mut out) } { + Some(out) + } else { + None + } } pub fn usize(&self, key: &str) -> Option { let name = CString::new(key).unwrap(); let mut out = 0; - unsafe { ffi::AMediaFormat_getSize(self.as_ptr(), name.as_ptr(), &mut out) } - .then(|| out as usize) + if unsafe { ffi::AMediaFormat_getSize(self.as_ptr(), name.as_ptr(), &mut out) } { + Some(out as usize) + } else { + None + } } pub fn buffer(&self, key: &str) -> Option<&[u8]> { @@ -136,7 +151,11 @@ impl MediaFormat { pub fn f64(&self, key: &str) -> Option { let name = CString::new(key).unwrap(); let mut out = 0.0; - unsafe { ffi::AMediaFormat_getDouble(self.as_ptr(), name.as_ptr(), &mut out) }.then(|| out) + if unsafe { ffi::AMediaFormat_getDouble(self.as_ptr(), name.as_ptr(), &mut out) } { + Some(out) + } else { + None + } } /// Returns (left, top, right, bottom) @@ -147,7 +166,7 @@ impl MediaFormat { let mut top = 0; let mut right = 0; let mut bottom = 0; - unsafe { + if unsafe { ffi::AMediaFormat_getRect( self.as_ptr(), name.as_ptr(), @@ -156,8 +175,11 @@ impl MediaFormat { &mut right, &mut bottom, ) + } { + Some((left, top, right, bottom)) + } else { + None } - .then(|| (left, top, right, bottom)) } #[cfg(feature = "api-level-28")] From b488fb95ac8a500b3d7a7887b095bc2a628a07f8 Mon Sep 17 00:00:00 2001 From: David Craven Date: Fri, 23 Sep 2022 11:33:21 +0200 Subject: [PATCH 14/33] Update to `cargo-subcommand 0.8.0` with `clap` argument parser (#238) Co-authored-by: Marijn Suijten --- cargo-apk/Cargo.toml | 5 +- cargo-apk/src/apk.rs | 24 +++--- cargo-apk/src/main.rs | 181 +++++++++++++++++++++--------------------- 3 files changed, 101 insertions(+), 109 deletions(-) diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index 906748cc..fd8490a2 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -12,11 +12,12 @@ repository = "https://github.com/rust-windowing/android-ndk-rs" [dependencies] anyhow = "1.0.57" -cargo-subcommand = "0.7" +cargo-subcommand = "0.8" +clap = { version = "3", features = ["derive"] } dunce = "1" env_logger = "0.9" log = "0.4" ndk-build = { path = "../ndk-build", version = "0.8.0" } serde = "1" -thiserror = "1.0.31" +thiserror = "1" toml = "0.5" diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 87890321..51955f3c 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -17,14 +17,12 @@ pub struct ApkBuilder<'a> { build_dir: PathBuf, build_targets: Vec, device_serial: Option, - no_logcat: bool, } impl<'a> ApkBuilder<'a> { pub fn from_subcommand( cmd: &'a Subcommand, device_serial: Option, - no_logcat: bool, ) -> Result { let ndk = Ndk::from_env()?; let mut manifest = Manifest::parse_from_toml(cmd.manifest())?; @@ -101,7 +99,6 @@ impl<'a> ApkBuilder<'a> { build_dir, build_targets, device_serial, - no_logcat, }) } @@ -118,7 +115,7 @@ impl<'a> ApkBuilder<'a> { let triple = target.rust_triple(); cargo.arg("--target").arg(triple); } - cargo.args(self.cmd.args()); + self.cmd.args().apply(&mut cargo); if !cargo.status()?.success() { return Err(NdkError::CmdFailed(cargo).into()); } @@ -184,12 +181,8 @@ impl<'a> ApkBuilder<'a> { for target in &self.build_targets { let triple = target.rust_triple(); - let build_dir = dunce::simplified(self.cmd.target_dir()) - .join(triple) - .join(self.cmd.profile()); - let artifact = build_dir - .join(artifact) - .join(artifact.file_name(CrateType::Cdylib, triple)); + let build_dir = self.cmd.build_dir(Some(triple)); + let artifact = self.cmd.artifact(artifact, Some(triple), CrateType::Cdylib); let mut cargo = cargo_ndk( &self.ndk, @@ -201,7 +194,7 @@ impl<'a> ApkBuilder<'a> { if self.cmd.target().is_none() { cargo.arg("--target").arg(triple); } - cargo.args(self.cmd.args()); + self.cmd.args().apply(&mut cargo); if !cargo.status()?.success() { return Err(NdkError::CmdFailed(cargo).into()); @@ -243,12 +236,12 @@ impl<'a> ApkBuilder<'a> { Ok(apk.add_pending_libs_and_align()?.sign(signing_key)?) } - pub fn run(&self, artifact: &Artifact) -> Result<(), Error> { + pub fn run(&self, artifact: &Artifact, no_logcat: bool) -> Result<(), Error> { let apk = self.build(artifact)?; apk.install(self.device_serial.as_deref())?; let pid = apk.start(self.device_serial.as_deref())?; - if !self.no_logcat { + if !no_logcat { self.ndk .adb(self.device_serial.as_deref())? .arg("logcat") @@ -275,7 +268,7 @@ impl<'a> ApkBuilder<'a> { Ok(()) } - pub fn default(&self) -> Result<(), Error> { + pub fn default(&self, cargo_cmd: &str) -> Result<(), Error> { for target in &self.build_targets { let mut cargo = cargo_ndk( &self.ndk, @@ -283,7 +276,8 @@ impl<'a> ApkBuilder<'a> { self.min_sdk_version(), self.cmd.target_dir(), )?; - cargo.args(self.cmd.args()); + cargo.arg(cargo_cmd); + self.cmd.args().apply(&mut cargo); if self.cmd.target().is_none() { let triple = target.rust_triple(); diff --git a/cargo-apk/src/main.rs b/cargo-apk/src/main.rs index 239e4e0d..8ad81b19 100644 --- a/cargo-apk/src/main.rs +++ b/cargo-apk/src/main.rs @@ -1,112 +1,109 @@ use cargo_apk::{ApkBuilder, Error}; use cargo_subcommand::Subcommand; -use std::process::Command; +use clap::Parser; + +#[derive(Parser)] +struct Cmd { + #[clap(subcommand)] + apk: ApkCmd, +} + +#[derive(clap::Subcommand)] +enum ApkCmd { + /// Helps cargo build apks for Android + Apk { + #[clap(subcommand)] + cmd: ApkSubCmd, + }, +} + +#[derive(Parser)] +struct Args { + #[clap(flatten)] + subcommand_args: cargo_subcommand::Args, + /// Use device with the given serial (see `adb devices`) + #[clap(short, long)] + device: Option, +} + +#[derive(clap::Subcommand)] +#[clap(trailing_var_arg = true)] +enum ApkSubCmd { + /// Analyze the current package and report errors, but don't build object files nor an apk + #[clap(visible_alias = "c")] + Check { + #[clap(flatten)] + args: Args, + }, + /// Compile the current package and create an apk + #[clap(visible_alias = "b")] + Build { + #[clap(flatten)] + args: Args, + }, + /// Invoke `cargo` under the detected NDK environment + #[clap(name = "--")] + Ndk { + cargo_cmd: String, + #[clap(flatten)] + args: Args, + }, + /// Run a binary or example apk of the local package + #[clap(visible_alias = "r")] + Run { + #[clap(flatten)] + args: Args, + /// Do not print or follow `logcat` after running the app + #[clap(short, long)] + no_logcat: bool, + }, + /// Start a gdb session attached to an adb device with symbols loaded + Gdb { + #[clap(flatten)] + args: Args, + }, + /// Print the version of cargo-apk + Version, +} fn main() -> anyhow::Result<()> { env_logger::init(); - let args = std::env::args(); - let mut device_serial = None; - let mut no_logcat = false; - let cmd = Subcommand::new(args, "apk", |name, value| match name { - "--device" => { - if let Some(value) = value { - println!("Running on {}", value); - device_serial = Some(value.to_owned()); - Ok(true) - } else { - Err(cargo_subcommand::Error::InvalidArgs) - } - } - "--no-logcat" => { - no_logcat = true; - Ok(true) + let Cmd { + apk: ApkCmd::Apk { cmd }, + } = Cmd::parse(); + match cmd { + ApkSubCmd::Check { args } => { + let cmd = Subcommand::new(args.subcommand_args)?; + let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; + builder.check()?; } - _ => Ok(false), - }) - .map_err(Error::Subcommand)?; - - let builder = ApkBuilder::from_subcommand(&cmd, device_serial, no_logcat)?; - - match cmd.cmd() { - "check" | "c" => builder.check()?, - "build" | "b" => { + ApkSubCmd::Build { args } => { + let cmd = Subcommand::new(args.subcommand_args)?; + let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; for artifact in cmd.artifacts() { builder.build(artifact)?; } } - "run" | "r" => { - anyhow::ensure!(cmd.artifacts().len() == 1, Error::invalid_args()); - builder.run(&cmd.artifacts()[0])?; + ApkSubCmd::Ndk { cargo_cmd, args } => { + let cmd = Subcommand::new(args.subcommand_args)?; + let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; + builder.default(&cargo_cmd)?; } - "--" => { - builder.default()?; + ApkSubCmd::Run { args, no_logcat } => { + let cmd = Subcommand::new(args.subcommand_args)?; + let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; + anyhow::ensure!(cmd.artifacts().len() == 1, Error::invalid_args()); + builder.run(&cmd.artifacts()[0], no_logcat)?; } - "gdb" => { + ApkSubCmd::Gdb { args } => { + let cmd = Subcommand::new(args.subcommand_args)?; + let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; anyhow::ensure!(cmd.artifacts().len() == 1, Error::invalid_args()); builder.gdb(&cmd.artifacts()[0])?; } - "help" => { - if let Some(arg) = cmd.args().get(0) { - match &**arg { - "build" | "b" | "check" | "c" | "run" | "r" | "test" | "t" | "doc" => { - run_cargo(&cmd)? - } - "gdb" => print_gdb_help(), - _ => print_help(), - } - } else { - print_help(); - } - } - "version" => { + ApkSubCmd::Version => { println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); } - _ => print_help(), } - Ok(()) } - -fn run_cargo(cmd: &Subcommand) -> Result<(), Error> { - Command::new("cargo") - .arg(cmd.cmd()) - .args(cmd.args()) - .status()?; - Ok(()) -} - -fn print_help() { - println!( - r#"cargo-apk -Helps cargo build apk's for android - -USAGE: - cargo apk [SUBCOMMAND] - -SUBCOMMAND: - check, c Checks that the current package builds without creating an apk - build, b Compiles the current package and creates an apk - run, r Run a binary or example of the local package - gdb Start a gdb session attached to an adb device with symbols loaded - version Print the version of cargo-apk - -FLAGS: - --no-logcat Don't print and follow `logcat` after running the application. - -OPTIONS: - --device Use device with the given serial. See `adb devices` for a list of - connected Android devices. -"# - ); -} - -fn print_gdb_help() { - println!( - r#"cargo-apk gdb -Start a gdb session attached to an adb device with symbols loaded - -USAGE: - cargo apk gdb -"# - ); -} From ddc2757f5abd002916c86576eaffd3f502e334b5 Mon Sep 17 00:00:00 2001 From: Jasper Bekkers Date: Fri, 30 Sep 2022 10:00:03 +0100 Subject: [PATCH 15/33] cargo-apk: Automate `adb reverse` port forwarding through `Cargo.toml` metadata (#348) --- cargo-apk/README.md | 7 +++++++ cargo-apk/src/apk.rs | 2 ++ cargo-apk/src/manifest.rs | 5 +++++ ndk-build/src/apk.rs | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/cargo-apk/README.md b/cargo-apk/README.md index 8a18492c..a0a42445 100644 --- a/cargo-apk/README.md +++ b/cargo-apk/README.md @@ -192,6 +192,13 @@ port = "8080" path = "/rust-windowing/android-ndk-rs/tree/master/cargo-apk" path_prefix = "/rust-windowing/" mime_type = "image/jpeg" + +# Set up reverse port forwarding through `adb reverse`, meaning that if the +# Android device connects to `localhost` on port `1338` it will be routed to +# the host on port `1338` instead. Source and destination ports can differ, +# see the `adb` help page for possible configurations. +[package.metadata.android.reverse_port_forward] +"tcp:1338" = "tcp:1338" ``` If a manifest attribute is not supported by `cargo apk` feel free to create a PR that adds the missing attribute. diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 51955f3c..7bc38920 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -176,6 +176,7 @@ impl<'a> ApkBuilder<'a> { resources, manifest, disable_aapt_compression: is_debug_profile, + reverse_port_forward: self.manifest.reverse_port_forward.clone(), }; let mut apk = config.create_apk()?; @@ -238,6 +239,7 @@ impl<'a> ApkBuilder<'a> { pub fn run(&self, artifact: &Artifact, no_logcat: bool) -> Result<(), Error> { let apk = self.build(artifact)?; + apk.reverse_port_forwarding(self.device_serial.as_deref())?; apk.install(self.device_serial.as_deref())?; let pid = apk.start(self.device_serial.as_deref())?; diff --git a/cargo-apk/src/manifest.rs b/cargo-apk/src/manifest.rs index 02a42af7..7b540648 100644 --- a/cargo-apk/src/manifest.rs +++ b/cargo-apk/src/manifest.rs @@ -17,6 +17,7 @@ pub(crate) struct Manifest { pub(crate) runtime_libs: Option, /// Maps profiles to keystores pub(crate) signing: HashMap, + pub(crate) reverse_port_forward: HashMap, } impl Manifest { @@ -38,6 +39,7 @@ impl Manifest { resources: metadata.resources, runtime_libs: metadata.runtime_libs, signing: metadata.signing, + reverse_port_forward: metadata.reverse_port_forward, }) } } @@ -71,6 +73,9 @@ struct AndroidMetadata { /// Maps profiles to keystores #[serde(default)] signing: HashMap, + /// Set up reverse port forwarding before launching the application + #[serde(default)] + reverse_port_forward: HashMap, } #[derive(Clone, Debug, Default, Deserialize)] diff --git a/ndk-build/src/apk.rs b/ndk-build/src/apk.rs index 082e0e41..5e276101 100644 --- a/ndk-build/src/apk.rs +++ b/ndk-build/src/apk.rs @@ -2,6 +2,7 @@ use crate::error::NdkError; use crate::manifest::AndroidManifest; use crate::ndk::{Key, Ndk}; use crate::target::Target; +use std::collections::HashMap; use std::collections::HashSet; use std::ffi::OsStr; use std::fs; @@ -16,6 +17,7 @@ pub struct ApkConfig { pub resources: Option, pub manifest: AndroidManifest, pub disable_aapt_compression: bool, + pub reverse_port_forward: HashMap, } impl ApkConfig { @@ -178,6 +180,7 @@ pub struct Apk { path: PathBuf, package_name: String, ndk: Ndk, + reverse_port_forward: HashMap, } impl Apk { @@ -187,9 +190,25 @@ impl Apk { path: config.apk(), package_name: config.manifest.package.clone(), ndk, + reverse_port_forward: config.reverse_port_forward.clone(), } } + pub fn reverse_port_forwarding(&self, device_serial: Option<&str>) -> Result<(), NdkError> { + for (from, to) in &self.reverse_port_forward { + println!("Reverse port forwarding from {} to {}", from, to); + let mut adb = self.ndk.adb(device_serial)?; + + adb.arg("reverse").arg(from).arg(to); + + if !adb.status()?.success() { + return Err(NdkError::CmdFailed(adb)); + } + } + + Ok(()) + } + pub fn install(&self, device_serial: Option<&str>) -> Result<(), NdkError> { let mut adb = self.ndk.adb(device_serial)?; From 502e10e3ebfdbb2bcf6539d426148eeb0a9cc933 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 14 Oct 2022 16:45:38 +0200 Subject: [PATCH 16/33] Release ndk-build-0.8.1, cargo-apk-0.9.5 And update some transitive dependencies, such as bumping to `clap 4.0.0`. --- cargo-apk/CHANGELOG.md | 4 ++++ cargo-apk/Cargo.toml | 8 ++++---- cargo-apk/README.md | 2 +- ndk-build/CHANGELOG.md | 4 ++++ ndk-build/Cargo.toml | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 8b16d7b0..94abb2e4 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -1,5 +1,9 @@ # Unreleased +# 0.9.5 (2022-10-14) + +- Automate `adb reverse` port forwarding through `Cargo.toml` metadata ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) + # 0.9.4 (2022-09-12) - Upgrade to latest `ndk-build` to deduplicate libraries before packaging them into the APK. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index fd8490a2..7c01819c 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-apk" -version = "0.9.4" +version = "0.9.5" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Helps cargo build APKs" @@ -12,12 +12,12 @@ repository = "https://github.com/rust-windowing/android-ndk-rs" [dependencies] anyhow = "1.0.57" -cargo-subcommand = "0.8" -clap = { version = "3", features = ["derive"] } +cargo-subcommand = "0.9" +clap = { version = "4", features = ["derive"] } dunce = "1" env_logger = "0.9" log = "0.4" -ndk-build = { path = "../ndk-build", version = "0.8.0" } +ndk-build = { path = "../ndk-build", version = "0.8.1" } serde = "1" thiserror = "1" toml = "0.5" diff --git a/cargo-apk/README.md b/cargo-apk/README.md index a0a42445..bfa2694b 100644 --- a/cargo-apk/README.md +++ b/cargo-apk/README.md @@ -194,7 +194,7 @@ path_prefix = "/rust-windowing/" mime_type = "image/jpeg" # Set up reverse port forwarding through `adb reverse`, meaning that if the -# Android device connects to `localhost` on port `1338` it will be routed to +# Android device connects to `localhost` on port `1338` it will be routed to # the host on port `1338` instead. Source and destination ports can differ, # see the `adb` help page for possible configurations. [package.metadata.android.reverse_port_forward] diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index af1226ce..76586d31 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -1,5 +1,9 @@ # Unreleased +# 0.8.1 (2022-10-14) + +- Provide `reverse_port_forwarding()` to set up `adb reverse` ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) + # 0.8.0 (2022-09-12) - **Breaking:** Postpone APK library packaging until before zip alignment, to deduplicate possibly overlapping entries. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) diff --git a/ndk-build/Cargo.toml b/ndk-build/Cargo.toml index 83bfd419..9f6a8d05 100644 --- a/ndk-build/Cargo.toml +++ b/ndk-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ndk-build" -version = "0.8.0" +version = "0.8.1" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Utilities for building Android binaries" @@ -13,7 +13,7 @@ repository = "https://github.com/rust-windowing/android-ndk-rs" [dependencies] dirs = "4" dunce = "1" -quick-xml = { version = "0.23", features = ["serialize"] } +quick-xml = { version = "0.25", features = ["serialize"] } serde = { version = "1", features = ["derive"] } thiserror = "1" which = "4" From 914d65bce95937173ddc67cd487af6f6d779adea Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Tue, 18 Oct 2022 23:08:54 +0200 Subject: [PATCH 17/33] readme: Document compatibility with NDK r25 and remove `workaround` mention (#354) NDK r25 works just as well as r24, and is the current LTS. There are no other releases planned between it and r26 launching in 2023, and scheduled to be the next NDK. The mention of our workaround is irrelevant given that it's something we deal with for the user in the background, and the feature has evolved many times through multiple PRs. This allows us to drop the beta notion for r23 which is long deprecated by now. --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 412e5b21..fe7d7b99 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ See [`ndk-examples`](./ndk-examples) for examples using the NDK and the README f `android-ndk-rs` aims to support at least the `LTS` and `Rolling Release` branches of the NDK, as described on [their wiki](https://github.com/android/ndk/wiki#supported-downloads). Additionally the `Beta Release` might be supported to prepare for an upcoming release. -As of writing (2021-07-24) the following NDKs are tested: +As of writing (2022-10-10) the following NDKs are tested: Branch | Version | Status | Working -|-|:-:|:-: @@ -28,10 +28,9 @@ r19 | 19.2.5345600 | _Deprecated_ | :heavy_check_mark: r20 | 20.1.5948944 | _Deprecated_ | :heavy_check_mark: r21 | 21.4.7075529 | _Deprecated_ | :heavy_check_mark: r22 | 22.1.7171670 | _Deprecated_ | :heavy_check_mark: -r23 | beta 1/2 | _Deprecated_ | :heavy_check_mark: -r23 | 23.0.7272597-beta3 | _Deprecated_ | :heavy_check_mark: Workaround in [#189](https://github.com/rust-windowing/android-ndk-rs/pull/189) -r23 | 23.1.7779620 | LTS | :heavy_check_mark: Workaround in [#189](https://github.com/rust-windowing/android-ndk-rs/pull/189) -r24 | 24.0.7856742-beta1 | Rolling Release | :heavy_check_mark: Workaround in [#189](https://github.com/rust-windowing/android-ndk-rs/pull/189) +r23 | 23.1.7779620 | _Deprecated_ | :heavy_check_mark: +r24 | 24.0.8215888 | _Deprecated_ | :heavy_check_mark: +r25 | 25.1.8937393 | LTS | :heavy_check_mark: ## Quick start: `Hello World` crate on Android From 6dbb026ba7288f5d188efc9e818d46e172a4e217 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 19 Oct 2022 20:34:31 +0200 Subject: [PATCH 18/33] Un-release ndk-build-0.8.1, cargo-apk-0.9.5 Both releases have been yanked. --- cargo-apk/CHANGELOG.md | 2 +- cargo-apk/Cargo.toml | 4 ++-- ndk-build/CHANGELOG.md | 4 ++-- ndk-build/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 94abb2e4..650ec6a6 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -1,6 +1,6 @@ # Unreleased -# 0.9.5 (2022-10-14) +(0.9.5, released on 2022-10-14, was yanked due to unintentionally bumping MSRV through the `quick-xml` crate, and breaking `cargo apk --` parsing after switching to `clap`.) - Automate `adb reverse` port forwarding through `Cargo.toml` metadata ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index 7c01819c..3e9660e9 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-apk" -version = "0.9.5" +version = "0.9.4" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Helps cargo build APKs" @@ -17,7 +17,7 @@ clap = { version = "4", features = ["derive"] } dunce = "1" env_logger = "0.9" log = "0.4" -ndk-build = { path = "../ndk-build", version = "0.8.1" } +ndk-build = { path = "../ndk-build", version = "0.8.0" } serde = "1" thiserror = "1" toml = "0.5" diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 76586d31..24ab2b78 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -1,8 +1,8 @@ # Unreleased -# 0.8.1 (2022-10-14) +(0.8.1, released on 2022-10-14, was yanked due to violating semver.) -- Provide `reverse_port_forwarding()` to set up `adb reverse` ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) +- **Breaking:** Provide `reverse_port_forwarding()` to set up `adb reverse` ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) # 0.8.0 (2022-09-12) diff --git a/ndk-build/Cargo.toml b/ndk-build/Cargo.toml index 9f6a8d05..6a1db96c 100644 --- a/ndk-build/Cargo.toml +++ b/ndk-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ndk-build" -version = "0.8.1" +version = "0.8.0" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Utilities for building Android binaries" From 3f9df7f69f8f937adeb9ad7793152c0a8dac39b5 Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Fri, 28 Oct 2022 16:43:06 +0200 Subject: [PATCH 19/33] Read keystore path/password from env vars prior to package metadata (#358) Profile signing information can now be specified via the `CARGO_APK__KEYSTORE` and `CARGO_APK__KEYSTORE_PASSWORD` environment variables. The environment variables take precedence over signing information in the cargo manifest. Both environment variables are required except in the case of the `dev` profile, which will fall back to the default password if `CARGO_APK_DEV_KEYSTORE_PASSWORD` is not set. --- cargo-apk/CHANGELOG.md | 6 +++-- cargo-apk/README.md | 17 ++++++++++--- cargo-apk/src/apk.rs | 55 ++++++++++++++++++++++++++++++++++-------- ndk-build/CHANGELOG.md | 2 ++ ndk-build/src/apk.rs | 5 +++- ndk-build/src/ndk.rs | 7 +++++- 6 files changed, 74 insertions(+), 18 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 650ec6a6..438f921d 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- Profile signing information can now be specified via the `CARGO_APK__KEYSTORE` and `CARGO_APK__KEYSTORE_PASSWORD` environment variables. The environment variables take precedence over signing information in the cargo manifest. Both environment variables are required except in the case of the `dev` profile, which will fall back to the default password if `CARGO_APK_DEV_KEYSTORE_PASSWORD` is not set. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) + (0.9.5, released on 2022-10-14, was yanked due to unintentionally bumping MSRV through the `quick-xml` crate, and breaking `cargo apk --` parsing after switching to `clap`.) - Automate `adb reverse` port forwarding through `Cargo.toml` metadata ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) @@ -29,7 +31,7 @@ # 0.9.0 (2022-05-07) - **Breaking:** Use `min_sdk_version` to select compiler target instead of `target_sdk_version`. ([#197](https://github.com/rust-windowing/android-ndk-rs/pull/197)) - See https://developer.android.com/ndk/guides/sdk-versions#minsdkversion for more details. + See for more details. - **Breaking:** Default `target_sdk_version` to `30` or lower (instead of the highest supported SDK version by the detected NDK toolchain) for more consistent interaction with Android backwards compatibility handling and its increasingly strict usage rules: https://developer.android.com/distribute/best-practices/develop/target-sdk @@ -44,7 +46,7 @@ - Fixed the library name in case of multiple build artifacts in the Android manifest. - Work around missing `libgcc` on NDK r23 beta 3 and above, by providing linker script that "redirects" to `libunwind`. - See https://github.com/rust-windowing/android-ndk-rs/issues/149 and https://github.com/rust-lang/rust/pull/85806 for more details. + See and for more details. # 0.8.1 (2021-08-06) diff --git a/cargo-apk/README.md b/cargo-apk/README.md index bfa2694b..885527a4 100644 --- a/cargo-apk/README.md +++ b/cargo-apk/README.md @@ -50,11 +50,20 @@ apk_name = "myapp" # according to the specified build_targets. runtime_libs = "path/to/libs_folder" -# Defaults to `$HOME/.android/debug.keystore` for the `dev` profile. Will ONLY generate a new -# debug.keystore if this file does NOT exist. -# A keystore path is always required on the `release` profile. +# Defaults to `$HOME/.android/debug.keystore` for the `dev` profile. Will ONLY +# generate a new debug.keystore if this file does NOT exist. A keystore is never +# auto-generated for other profiles. +# +# The keystore path can be absolute, or relative to the Cargo.toml file. +# +# The environment variables `CARGO_APK__KEYSTORE` and +# `CARGO_APK__KEYSTORE_PASSWORD` can be set to a keystore path +# and keystore password respectively. The profile portion follows the same rules +# as ``, it is the uppercased profile name with `-` replaced with `_`. +# +# If present they take precedence over the signing information in the manifest. [package.metadata.android.signing.] -path = "$HOME/.android/debug.keystore" +path = "relative/or/absolute/path/to/my.keystore" keystore_password = "android" # See https://developer.android.com/guide/topics/manifest/uses-sdk-element diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 7bc38920..b2cc1cf3 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -223,18 +223,53 @@ impl<'a> ApkBuilder<'a> { Profile::Custom(c) => c.as_str(), }; - let signing_key = self.manifest.signing.get(profile_name); - - let signing_key = match (signing_key, is_debug_profile) { - (Some(signing), _) => Key { - path: crate_path.join(&signing.path), - password: signing.keystore_password.clone(), - }, - (None, true) => self.ndk.debug_key()?, - (None, false) => return Err(Error::MissingReleaseKey(profile_name.to_owned())), + let keystore_env = format!( + "CARGO_APK_{}_KEYSTORE", + profile_name.to_uppercase().replace('-', "_") + ); + let password_env = format!("{}_PASSWORD", keystore_env); + + let path = std::env::var_os(&keystore_env).map(PathBuf::from); + let password = std::env::var(&password_env).ok(); + + let signing_key = match (path, password) { + (Some(path), Some(password)) => Key { path, password }, + (Some(path), None) if is_debug_profile => { + eprintln!( + "{} not specified, falling back to default password", + password_env + ); + Key { + path, + password: ndk_build::ndk::DEFAULT_DEV_KEYSTORE_PASSWORD.to_owned(), + } + } + (Some(path), None) => { + eprintln!("`{}` was specified via `{}`, but `{}` was not specified, both or neither must be present for profiles other than `dev`", path.display(), keystore_env, password_env); + return Err(Error::MissingReleaseKey(profile_name.to_owned())); + } + (None, _) => { + if let Some(msk) = self.manifest.signing.get(profile_name) { + Key { + path: crate_path.join(&msk.path), + password: msk.keystore_password.clone(), + } + } else if is_debug_profile { + self.ndk.debug_key()? + } else { + return Err(Error::MissingReleaseKey(profile_name.to_owned())); + } + } }; - Ok(apk.add_pending_libs_and_align()?.sign(signing_key)?) + let unsigned = apk.add_pending_libs_and_align()?; + + println!( + "Signing `{}` with keystore `{}`", + config.apk().display(), + signing_key.path.display() + ); + Ok(unsigned.sign(signing_key)?) } pub fn run(&self, artifact: &Artifact, no_logcat: bool) -> Result<(), Error> { diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 24ab2b78..8afad037 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +- Add `ndk::DEFAULT_DEV_KEYSTORE_PASSWORD` and make `apk::ApkConfig::apk` public. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) + (0.8.1, released on 2022-10-14, was yanked due to violating semver.) - **Breaking:** Provide `reverse_port_forwarding()` to set up `adb reverse` ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) diff --git a/ndk-build/src/apk.rs b/ndk-build/src/apk.rs index 5e276101..8e1a15a7 100644 --- a/ndk-build/src/apk.rs +++ b/ndk-build/src/apk.rs @@ -32,7 +32,10 @@ impl ApkConfig { .join(format!("{}-unaligned.apk", self.apk_name)) } - fn apk(&self) -> PathBuf { + /// Retrieves the path of the APK that will be written when [`UnsignedApk::sign`] + /// is invoked + #[inline] + pub fn apk(&self) -> PathBuf { self.build_dir.join(format!("{}.apk", self.apk_name)) } diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs index 64da5034..962ce936 100644 --- a/ndk-build/src/ndk.rs +++ b/ndk-build/src/ndk.rs @@ -4,6 +4,10 @@ use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::process::Command; +/// The default password used when creating the default `debug.keystore` via +/// [`Ndk::debug_key`] +pub const DEFAULT_DEV_KEYSTORE_PASSWORD: &str = "android"; + #[derive(Clone, Debug, Eq, PartialEq)] pub struct Ndk { sdk_path: PathBuf, @@ -384,7 +388,8 @@ impl Ndk { pub fn debug_key(&self) -> Result { let path = self.android_user_home()?.join("debug.keystore"); - let password = "android".to_string(); + let password = DEFAULT_DEV_KEYSTORE_PASSWORD.to_owned(); + if !path.exists() { let mut keytool = self.keytool()?; keytool From 21b11feff1b612656558d435908249faf78c980f Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Fri, 28 Oct 2022 17:28:02 +0200 Subject: [PATCH 20/33] nkd-build: Propagate `RUSTFLAGS` into `CARGO_ENCODED_RUSTFLAGS` (#357) ndk-build uses `CARGO_ENCODED_RUSTFLAGS` to get around flags/arguments with spaces in `RUSTFLAGS`, with no defined way to escape them. For correctness this implementation reads `CARGO_ENCODED_RUSTFLAGS` instead of blindly overwriting its contents, but as per [`build.rustflags` precedence rules] setting this environment variable would disregard any contents in the more common `RUSTFLAGS` environment variable. To make this more convenient for users, propagate the contents of `RUSTFLAGS` into `CARGO_ENCODED_RUSTFLAGS` to ensure its contents don't get ignored. [`build.rustflags` precedence rules]: https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags --- ndk-build/CHANGELOG.md | 4 +++- ndk-build/src/cargo.rs | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 8afad037..277ef739 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -1,6 +1,8 @@ # Unreleased - Add `ndk::DEFAULT_DEV_KEYSTORE_PASSWORD` and make `apk::ApkConfig::apk` public. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) +- `RUSTFLAGS` is now considered if `CARGO_ENCODED_RUSTFLAGS` is not present allowing `cargo apk build` to not break users' builds if they depend on `RUSTFLAGS` being set prior to the build, + as `CARGO_ENCODED_RUSTFLAGS` set by `ndk-build` before invoking `cargo` will take precedence over [all other sources of build flags](https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags). ([#357](https://github.com/rust-windowing/android-ndk-rs/pull/357)) (0.8.1, released on 2022-10-14, was yanked due to violating semver.) @@ -34,7 +36,7 @@ - **Breaking:** Default `target_sdk_version` to `30` or lower (instead of the highest supported SDK version by the detected NDK toolchain) for more consistent interaction with Android backwards compatibility handling and its increasingly strict usage rules: - https://developer.android.com/distribute/best-practices/develop/target-sdk + - **Breaking:** Remove default insertion of `MAIN` intent filter through a custom serialization function, this is better filled in by the default setup in `cargo-apk`. ([#241](https://github.com/rust-windowing/android-ndk-rs/pull/241)) - Add `android:exported` attribute to the manifest's `Activity` element. ([#242](https://github.com/rust-windowing/android-ndk-rs/pull/242)) diff --git a/ndk-build/src/cargo.rs b/ndk-build/src/cargo.rs index dd7e5f66..d3abf348 100644 --- a/ndk-build/src/cargo.rs +++ b/ndk-build/src/cargo.rs @@ -14,12 +14,40 @@ pub fn cargo_ndk( let clang_target = format!("--target={}{}", target.ndk_llvm_triple(), sdk_version); let mut cargo = Command::new("cargo"); - // Read initial RUSTFLAGS + const SEP: &str = "\x1f"; + + // Read initial CARGO_ENCODED_/RUSTFLAGS let mut rustflags = match std::env::var("CARGO_ENCODED_RUSTFLAGS") { - Ok(val) => val, - Err(std::env::VarError::NotPresent) => "".to_string(), + Ok(val) => { + if std::env::var_os("RUSTFLAGS").is_some() { + panic!( + "Both `CARGO_ENCODED_RUSTFLAGS` and `RUSTFLAGS` were found in the environment, please clear one or the other before invoking this script" + ); + } + + val + } + Err(std::env::VarError::NotPresent) => { + match std::env::var("RUSTFLAGS") { + Ok(val) => { + cargo.env_remove("RUSTFLAGS"); + + // Same as cargo + // https://github.com/rust-lang/cargo/blob/f6de921a5d807746e972d9d10a4d8e1ca21e1b1f/src/cargo/core/compiler/build_context/target_info.rs#L682-L690 + val.split(' ') + .map(str::trim) + .filter(|s| !s.is_empty()) + .collect::>() + .join(SEP) + } + Err(std::env::VarError::NotPresent) => String::new(), + Err(std::env::VarError::NotUnicode(_)) => { + panic!("RUSTFLAGS environment variable contains non-unicode characters") + } + } + } Err(std::env::VarError::NotUnicode(_)) => { - panic!("RUSTFLAGS environment variable contains non-unicode characters") + panic!("CARGO_ENCODED_RUSTFLAGS environment variable contains non-unicode characters") } }; @@ -36,7 +64,7 @@ pub fn cargo_ndk( // https://doc.rust-lang.org/beta/cargo/reference/environment-variables.html#configuration-environment-variables cargo.env(cargo_env_target_cfg("LINKER", triple), &clang); if !rustflags.is_empty() { - rustflags.push('\x1f'); + rustflags.push_str(SEP); } rustflags.push_str("-Clink-arg="); rustflags.push_str(&clang_target); @@ -67,7 +95,9 @@ pub fn cargo_ndk( // suggests to resort to RUSTFLAGS. // Note that `rustflags` will never be empty because of an unconditional `.push_str` above, // so we can safely start with appending \x1f here. - rustflags.push_str("\x1f-L\x1f"); + rustflags.push_str(SEP); + rustflags.push_str("-L"); + rustflags.push_str(SEP); rustflags.push_str( cargo_apk_link_dir .to_str() From b135fb1d89bbede4c807c9fa4c6d8d63b9931201 Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Tue, 1 Nov 2022 23:31:09 +0100 Subject: [PATCH 21/33] cargo-apk: Add `strip` configuration to manifest (#356) Add `strip` option to `android` metadata, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. --- cargo-apk/CHANGELOG.md | 3 +- cargo-apk/README.md | 19 +++++++++++ cargo-apk/src/apk.rs | 1 + cargo-apk/src/manifest.rs | 5 +++ ndk-build/CHANGELOG.md | 1 + ndk-build/src/apk.rs | 72 ++++++++++++++++++++++++++++++++++++++- 6 files changed, 99 insertions(+), 2 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 438f921d..8be438c6 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - Profile signing information can now be specified via the `CARGO_APK__KEYSTORE` and `CARGO_APK__KEYSTORE_PASSWORD` environment variables. The environment variables take precedence over signing information in the cargo manifest. Both environment variables are required except in the case of the `dev` profile, which will fall back to the default password if `CARGO_APK_DEV_KEYSTORE_PASSWORD` is not set. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) +- Add `strip` option to `android` metadata, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. ([#356](https://github.com/rust-windowing/android-ndk-rs/pull/356)) (0.9.5, released on 2022-10-14, was yanked due to unintentionally bumping MSRV through the `quick-xml` crate, and breaking `cargo apk --` parsing after switching to `clap`.) @@ -34,7 +35,7 @@ See for more details. - **Breaking:** Default `target_sdk_version` to `30` or lower (instead of the highest supported SDK version by the detected NDK toolchain) for more consistent interaction with Android backwards compatibility handling and its increasingly strict usage rules: - https://developer.android.com/distribute/best-practices/develop/target-sdk + ([#203](https://github.com/rust-windowing/android-ndk-rs/pull/203)) - Allow manifest `package` property to be provided in `Cargo.toml`. ([#236](https://github.com/rust-windowing/android-ndk-rs/pull/236)) - Add `MAIN` intent filter in `from_subcommand` instead of relying on a custom serialization function in `ndk-build`. ([#241](https://github.com/rust-windowing/android-ndk-rs/pull/241)) diff --git a/cargo-apk/README.md b/cargo-apk/README.md index 885527a4..edae6e11 100644 --- a/cargo-apk/README.md +++ b/cargo-apk/README.md @@ -45,6 +45,25 @@ assets = "path/to/assets_folder" # Defaults to package name. apk_name = "myapp" +# `default` (or unspecified) - Debug symbols, if they exist, are not treated +# specially. +# +# `strip` - Debug symbols are stripped from the shared +# libraries before being copied into the APK. +# +# `split` - Functions the same as `strip`, except the debug +# symbols are written to the apk output directory +# alongside the stripped shared libraries, with +# a `.dwarf` extension. +# +# Note that the `strip` and `split` options will only have an effect if +# debug symbols are present in the `.so` file(s) produced by your build, enabling +# https://doc.rust-lang.org/cargo/reference/profiles.html#strip or +# https://doc.rust-lang.org/cargo/reference/profiles.html#split-debuginfo +# in your cargo manifest can cause debug symbols to no longer be present +# in the `.so`. +strip = "default" + # Folder containing extra shared libraries intended to be dynamically loaded at runtime. # Files matching `libs_folder/${android_abi}/*.so` are added to the apk # according to the specified build_targets. diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index b2cc1cf3..4d943c2b 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -176,6 +176,7 @@ impl<'a> ApkBuilder<'a> { resources, manifest, disable_aapt_compression: is_debug_profile, + strip: self.manifest.strip, reverse_port_forward: self.manifest.reverse_port_forward.clone(), }; let mut apk = config.create_apk()?; diff --git a/cargo-apk/src/manifest.rs b/cargo-apk/src/manifest.rs index 7b540648..4e561a78 100644 --- a/cargo-apk/src/manifest.rs +++ b/cargo-apk/src/manifest.rs @@ -1,4 +1,5 @@ use crate::error::Error; +use ndk_build::apk::StripConfig; use ndk_build::manifest::AndroidManifest; use ndk_build::target::Target; use serde::Deserialize; @@ -18,6 +19,7 @@ pub(crate) struct Manifest { /// Maps profiles to keystores pub(crate) signing: HashMap, pub(crate) reverse_port_forward: HashMap, + pub(crate) strip: StripConfig, } impl Manifest { @@ -40,6 +42,7 @@ impl Manifest { runtime_libs: metadata.runtime_libs, signing: metadata.signing, reverse_port_forward: metadata.reverse_port_forward, + strip: metadata.strip, }) } } @@ -76,6 +79,8 @@ struct AndroidMetadata { /// Set up reverse port forwarding before launching the application #[serde(default)] reverse_port_forward: HashMap, + #[serde(default)] + strip: StripConfig, } #[derive(Clone, Debug, Default, Deserialize)] diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index 277ef739..f1b66505 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -3,6 +3,7 @@ - Add `ndk::DEFAULT_DEV_KEYSTORE_PASSWORD` and make `apk::ApkConfig::apk` public. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) - `RUSTFLAGS` is now considered if `CARGO_ENCODED_RUSTFLAGS` is not present allowing `cargo apk build` to not break users' builds if they depend on `RUSTFLAGS` being set prior to the build, as `CARGO_ENCODED_RUSTFLAGS` set by `ndk-build` before invoking `cargo` will take precedence over [all other sources of build flags](https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags). ([#357](https://github.com/rust-windowing/android-ndk-rs/pull/357)) +- Add `ApkConfig::strip`, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. ([#356](https://github.com/rust-windowing/android-ndk-rs/pull/356)) (0.8.1, released on 2022-10-14, was yanked due to violating semver.) diff --git a/ndk-build/src/apk.rs b/ndk-build/src/apk.rs index 8e1a15a7..0057661c 100644 --- a/ndk-build/src/apk.rs +++ b/ndk-build/src/apk.rs @@ -9,6 +9,31 @@ use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; +/// The options for how to treat debug symbols that are present in any `.so` +/// files that are added to the APK. +/// +/// Using [`strip`](https://doc.rust-lang.org/cargo/reference/profiles.html#strip) +/// or [`split-debuginfo`](https://doc.rust-lang.org/cargo/reference/profiles.html#split-debuginfo) +/// in your cargo manifest(s) may cause debug symbols to not be present in a +/// `.so`, which would cause these options to do nothing. +#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum StripConfig { + /// Does not treat debug symbols specially + Default, + /// Removes debug symbols from the library before copying it into the APK + Strip, + /// Splits the library into into an ELF (`.so`) and DWARF (`.dwarf`). Only the + /// `.so` is copied into the APK + Split, +} + +impl Default for StripConfig { + fn default() -> Self { + Self::Default + } +} + pub struct ApkConfig { pub ndk: Ndk, pub build_dir: PathBuf, @@ -17,6 +42,7 @@ pub struct ApkConfig { pub resources: Option, pub manifest: AndroidManifest, pub disable_aapt_compression: bool, + pub strip: StripConfig, pub reverse_port_forward: HashMap, } @@ -99,7 +125,49 @@ impl<'a> UnalignedApk<'a> { let lib_path = Path::new("lib").join(abi).join(path.file_name().unwrap()); let out = self.config.build_dir.join(&lib_path); std::fs::create_dir_all(out.parent().unwrap())?; - std::fs::copy(path, out)?; + + match self.config.strip { + StripConfig::Default => { + std::fs::copy(path, out)?; + } + StripConfig::Strip | StripConfig::Split => { + let obj_copy = self.config.ndk.toolchain_bin("objcopy", target)?; + + { + let mut cmd = Command::new(&obj_copy); + cmd.arg("--strip-debug"); + cmd.arg(path); + cmd.arg(&out); + + if !cmd.status()?.success() { + return Err(NdkError::CmdFailed(cmd)); + } + } + + if self.config.strip == StripConfig::Split { + let dwarf_path = out.with_extension("dwarf"); + + { + let mut cmd = Command::new(&obj_copy); + cmd.arg("--only-keep-debug"); + cmd.arg(path); + cmd.arg(&dwarf_path); + + if !cmd.status()?.success() { + return Err(NdkError::CmdFailed(cmd)); + } + } + + let mut cmd = Command::new(obj_copy); + cmd.arg(format!("--add-gnu-debuglink={}", dwarf_path.display())); + cmd.arg(out); + + if !cmd.status()?.success() { + return Err(NdkError::CmdFailed(cmd)); + } + } + } + } // Pass UNIX path separators to `aapt` on non-UNIX systems, ensuring the resulting separator // is compatible with the target device instead of the host platform. @@ -153,9 +221,11 @@ impl<'a> UnalignedApk<'a> { .arg("4") .arg(self.config.unaligned_apk()) .arg(self.config.apk()); + if !zipalign.status()?.success() { return Err(NdkError::CmdFailed(zipalign)); } + Ok(UnsignedApk(self.config)) } } From 4c01bd2f7e96fb5ae91e68e61eb65d9bdd37728f Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Sun, 6 Nov 2022 00:26:57 +0100 Subject: [PATCH 22/33] cargo-apk: Fix improved `clippy::needless_borrow` (#361) Rust 1.65 stepped up its `clippy::needless_borrow` game around types and their borrows implementing a certain trait, realizing that `&PathBuf` already implements `AsRef` and doesn't need to be reborrowed as `&&PathBuf`. --- cargo-apk/src/apk.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 4d943c2b..3a625d6d 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -151,17 +151,17 @@ impl<'a> ApkBuilder<'a> { .manifest .assets .as_ref() - .map(|assets| dunce::simplified(&crate_path.join(&assets)).to_owned()); + .map(|assets| dunce::simplified(&crate_path.join(assets)).to_owned()); let resources = self .manifest .resources .as_ref() - .map(|res| dunce::simplified(&crate_path.join(&res)).to_owned()); + .map(|res| dunce::simplified(&crate_path.join(res)).to_owned()); let runtime_libs = self .manifest .runtime_libs .as_ref() - .map(|libs| dunce::simplified(&crate_path.join(&libs)).to_owned()); + .map(|libs| dunce::simplified(&crate_path.join(libs)).to_owned()); let apk_name = self .manifest .apk_name From fefc1cbfa6f3e70aa58da17e827821fd5a1cb79f Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Mon, 21 Nov 2022 10:32:46 +0000 Subject: [PATCH 23/33] ndk-examples: update to use jni 0.20 (#366) --- ndk-examples/Cargo.toml | 2 +- ndk-examples/examples/jni_audio.rs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ndk-examples/Cargo.toml b/ndk-examples/Cargo.toml index ad250ffc..5c22b30f 100644 --- a/ndk-examples/Cargo.toml +++ b/ndk-examples/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" publish = false [target.'cfg(target_os = "android")'.dependencies] -jni = "0.19" +jni = "0.20" libc = "0.2" log = "0.4.14" ndk = { path = "../ndk", features = ["api-level-23"] } diff --git a/ndk-examples/examples/jni_audio.rs b/ndk-examples/examples/jni_audio.rs index 9880bf67..3a339858 100644 --- a/ndk-examples/examples/jni_audio.rs +++ b/ndk-examples/examples/jni_audio.rs @@ -1,3 +1,5 @@ +use jni::objects::JObject; + #[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] fn main() { enumerate_audio_devices().unwrap(); @@ -9,6 +11,7 @@ fn enumerate_audio_devices() -> Result<(), Box> { // Create a VM for executing Java calls let ctx = ndk_context::android_context(); let vm = unsafe { jni::JavaVM::from_raw(ctx.vm().cast()) }?; + let context = unsafe { JObject::from_raw(ctx.context().cast()) }; let env = vm.attach_current_thread()?; // Query the global Audio Service @@ -17,7 +20,7 @@ fn enumerate_audio_devices() -> Result<(), Box> { let audio_manager = env .call_method( - ctx.context().cast(), + context, "getSystemService", // JNI type signature needs to be derived from the Java API // (ArgTys)ResultTy @@ -36,7 +39,7 @@ fn enumerate_audio_devices() -> Result<(), Box> { println!("-- Output Audio Devices --"); - let device_array = devices.l()?.into_inner(); + let device_array = devices.l()?.into_raw(); let len = env.get_array_length(device_array)?; for i in 0..len { let device = env.get_object_array_element(device_array, i)?; @@ -56,7 +59,7 @@ fn enumerate_audio_devices() -> Result<(), Box> { let sample_array = env .call_method(device, "getSampleRates", "()[I", &[])? .l()? - .into_inner(); + .into_raw(); let len = env.get_array_length(sample_array)?; let mut sample_rates = vec![0; len as usize]; From d7e307efd32d8187b9f615c1f7ab2bf637f88481 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 21 Nov 2022 14:26:55 +0100 Subject: [PATCH 24/33] ndk-glue: Move native activity behind lock and remove it in `onDestroy` (#160) `NativeActivity` is now behind a lock, and will be removed as soon as `onDestroy` is called. Due to the async nature of events, make sure to hold on to the lock received from `native_activity()` _beforehand_ if you wish to use it during handling of `Event::Destroy`. --- ndk-examples/examples/looper.rs | 3 +-- ndk-glue/CHANGELOG.md | 5 +++++ ndk-glue/src/lib.rs | 24 +++++++++++++++--------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/ndk-examples/examples/looper.rs b/ndk-examples/examples/looper.rs index bd11b6b8..180c7082 100644 --- a/ndk-examples/examples/looper.rs +++ b/ndk-examples/examples/looper.rs @@ -154,6 +154,5 @@ fn main() { } // Stop the activity - #[allow(deprecated)] - ndk_glue::native_activity().finish() + ndk_glue::native_activity().unwrap().finish() } diff --git a/ndk-glue/CHANGELOG.md b/ndk-glue/CHANGELOG.md index 7e107e95..f4c96e06 100644 --- a/ndk-glue/CHANGELOG.md +++ b/ndk-glue/CHANGELOG.md @@ -1,5 +1,10 @@ # Unreleased +- **Breaking:** `NativeActivity` is now behind a lock, and will be removed as soon as `onDestroy` + is called. Due to the async nature of events, make sure to hold on to the lock received from + `native_activity()` _beforehand_ if you wish to use it during handling of `Event::Destroy`. The + lock should be released to allow `onDestroy` to return. + # 0.7.0 (2022-07-24) - **Breaking:** Provide a `LockReadGuard` newtype around `NativeWindow`/`InputQueue` to hide the underlying lock implementation. (#288) diff --git a/ndk-glue/src/lib.rs b/ndk-glue/src/lib.rs index 7564a498..60a0d6ff 100644 --- a/ndk-glue/src/lib.rs +++ b/ndk-glue/src/lib.rs @@ -51,21 +51,20 @@ pub fn android_log(level: Level, tag: &CStr, msg: &CStr) { } } +static NATIVE_ACTIVITY: Lazy>> = Lazy::new(Default::default); static NATIVE_WINDOW: Lazy>> = Lazy::new(Default::default); static INPUT_QUEUE: Lazy>> = Lazy::new(Default::default); static CONTENT_RECT: Lazy> = Lazy::new(Default::default); static LOOPER: Lazy>> = Lazy::new(Default::default); -static mut NATIVE_ACTIVITY: Option = None; - /// This function accesses a `static` variable internally and must only be used if you are sure -/// there is exactly one version of `ndk_glue` in your dependency tree. +/// there is exactly one version of [`ndk_glue`][crate] in your dependency tree. /// /// If you need access to the `JavaVM` through [`NativeActivity::vm()`] or Activity `Context` /// through [`NativeActivity::activity()`], please use the [`ndk_context`] crate and its /// [`ndk_context::android_context()`] getter to acquire the `JavaVM` and `Context` instead. -pub fn native_activity() -> &'static NativeActivity { - unsafe { NATIVE_ACTIVITY.as_ref().unwrap() } +pub fn native_activity() -> Option> { + LockReadGuard::from_wrapped_option(NATIVE_ACTIVITY.read()) } pub struct LockReadGuard(MappedRwLockReadGuard<'static, T>); @@ -182,6 +181,11 @@ pub enum Event { SaveInstanceState, Pause, Stop, + /// The native activity will be stopped and destroyed after this event. + /// Due to the async nature of these events, make sure to hold on to the + /// lock received from [`native_activity()`] _beforehand_ if you wish to use + /// it during handling of [`Event::Destroy`]. The lock should be released to + /// allow `onDestroy` to return. Destroy, ConfigChanged, LowMemory, @@ -249,7 +253,7 @@ pub unsafe fn init( let activity = NativeActivity::from_ptr(activity); ndk_context::initialize_android_context(activity.vm().cast(), activity.activity().cast()); - NATIVE_ACTIVITY.replace(activity); + NATIVE_ACTIVITY.write().replace(activity); let mut logpipe: [RawFd; 2] = Default::default(); libc::pipe(logpipe.as_mut_ptr()); @@ -334,6 +338,9 @@ unsafe extern "C" fn on_stop(activity: *mut ANativeActivity) { unsafe extern "C" fn on_destroy(activity: *mut ANativeActivity) { wake(activity, Event::Destroy); ndk_context::release_android_context(); + let mut native_activity_guard = NATIVE_ACTIVITY.write(); + let native_activity = native_activity_guard.take().unwrap(); + assert_eq!(native_activity.ptr().as_ptr(), activity); } unsafe extern "C" fn on_configuration_changed(activity: *mut ANativeActivity) { @@ -407,10 +414,9 @@ unsafe extern "C" fn on_input_queue_destroyed( ) { wake(activity, Event::InputQueueDestroyed); let mut input_queue_guard = INPUT_QUEUE.write(); - assert_eq!(input_queue_guard.as_ref().unwrap().ptr().as_ptr(), queue); - let input_queue = InputQueue::from_ptr(NonNull::new(queue).unwrap()); + let input_queue = input_queue_guard.take().unwrap(); + assert_eq!(input_queue.ptr().as_ptr(), queue); input_queue.detach_looper(); - input_queue_guard.take(); } unsafe extern "C" fn on_content_rect_changed(activity: *mut ANativeActivity, rect: *const ARect) { From 107f03e3858bdced3a7a898e43b339b73d7fc1af Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 21 Nov 2022 22:00:08 +0100 Subject: [PATCH 25/33] Lock MSRV to 1.60 and validate in CI (#362) * Lock MSRV to 1.60 and validate in CI Prevent inadvertently bumping MSRV in PRs by checking against MSRV in the CI, to disallow any large bumps without rationale. Rust 1.60 is 7 months old at the time of writing, and also required by `winit` which uses `android-ndk-rs`, hence must be compatible with it. This does not mean that we cannot bump MSRV at all, but we must remain a tad conservative; at the same time setting [`rust-version`] in the manifest provides everyone on Rust 1.56 and higher a helpful error message when their version is lower than what we require. [`rust-version`]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-rust-version-field * ndk-build: Bump quick-xml to 0.26 to solve accidental MSRV bump Git history suggests that `quick-xml` backed out of an (un?)intentional MSRV bump and is now back at Rust 1.46; well below our MSRV needed for `winit`. --- .github/workflows/rust.yml | 14 ++++++++++++++ README.md | 3 ++- cargo-apk/Cargo.toml | 1 + ndk-build/Cargo.toml | 3 ++- ndk-context/Cargo.toml | 1 + ndk-glue/Cargo.toml | 1 + ndk-macro/Cargo.toml | 1 + ndk-sys/Cargo.toml | 1 + ndk/Cargo.toml | 1 + 9 files changed, 24 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index d3c0e5ae..a6e2b01c 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -36,6 +36,20 @@ jobs: # also compile cleanly under this target. args: --all --all-targets --all-features --target aarch64-linux-android -- -Dwarnings + check_msrv: + name: Check MSRV (1.60.0) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: dtolnay/rust-toolchain@1.60.0 + with: + target: aarch64-linux-android + - uses: actions-rs/cargo@v1 + with: + command: check + # See comment above about using one of our supported targets. + args: --workspace --all-targets --all-features --target aarch64-linux-android + build: strategy: fail-fast: false diff --git a/README.md b/README.md index fe7d7b99..699d3667 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Rust on Android -[![Rust](https://github.com/rust-windowing/android-ndk-rs/workflows/Rust/badge.svg)](https://github.com/rust-windowing/android-ndk-rs/actions) ![MIT license](https://img.shields.io/badge/License-MIT-green.svg) ![APACHE2 license](https://img.shields.io/badge/License-APACHE2-green.svg) +[![Rust](https://github.com/rust-windowing/android-ndk-rs/workflows/Rust/badge.svg)](https://github.com/rust-windowing/android-ndk-rs/actions) ![MIT license](https://img.shields.io/badge/License-MIT-green.svg) ![APACHE2 license](https://img.shields.io/badge/License-APACHE2-green.svg) [![MSRV](https://img.shields.io/badge/rustc-1.60.0+-ab6000.svg)](https://blog.rust-lang.org/2022/04/07/Rust-1.60.0.html) + Libraries and tools for Rust programming on Android targets: diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index 3e9660e9..90689cde 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -9,6 +9,7 @@ keywords = ["android", "ndk", "apk"] documentation = "https://docs.rs/cargo-apk" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" [dependencies] anyhow = "1.0.57" diff --git a/ndk-build/Cargo.toml b/ndk-build/Cargo.toml index 6a1db96c..c6738944 100644 --- a/ndk-build/Cargo.toml +++ b/ndk-build/Cargo.toml @@ -9,11 +9,12 @@ keywords = ["android", "ndk", "apk"] documentation = "https://docs.rs/ndk-build" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" [dependencies] dirs = "4" dunce = "1" -quick-xml = { version = "0.25", features = ["serialize"] } +quick-xml = { version = "0.26", features = ["serialize"] } serde = { version = "1", features = ["derive"] } thiserror = "1" which = "4" diff --git a/ndk-context/Cargo.toml b/ndk-context/Cargo.toml index 79d1c307..484bd28d 100644 --- a/ndk-context/Cargo.toml +++ b/ndk-context/Cargo.toml @@ -9,3 +9,4 @@ keywords = ["android", "ndk", "apk", "jni"] documentation = "https://docs.rs/ndk-context" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" diff --git a/ndk-glue/Cargo.toml b/ndk-glue/Cargo.toml index d199acf4..beb91894 100644 --- a/ndk-glue/Cargo.toml +++ b/ndk-glue/Cargo.toml @@ -10,6 +10,7 @@ readme = "README.md" documentation = "https://docs.rs/ndk-glue" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" [dependencies] android_logger = { version = "0.11", optional = true } diff --git a/ndk-macro/Cargo.toml b/ndk-macro/Cargo.toml index bfbb3144..af0cc8db 100644 --- a/ndk-macro/Cargo.toml +++ b/ndk-macro/Cargo.toml @@ -10,6 +10,7 @@ readme = "README.md" documentation = "https://docs.rs/ndk-macro" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" [lib] proc-macro = true diff --git a/ndk-sys/Cargo.toml b/ndk-sys/Cargo.toml index 7c2ff123..3340c6ac 100644 --- a/ndk-sys/Cargo.toml +++ b/ndk-sys/Cargo.toml @@ -10,6 +10,7 @@ readme = "../README.md" documentation = "https://docs.rs/android-ndk-sys" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" [dependencies] jni-sys = "0.3.0" diff --git a/ndk/Cargo.toml b/ndk/Cargo.toml index 76af756d..1a232fbd 100644 --- a/ndk/Cargo.toml +++ b/ndk/Cargo.toml @@ -10,6 +10,7 @@ readme = "../README.md" documentation = "https://docs.rs/android-ndk" homepage = "https://github.com/rust-windowing/android-ndk-rs" repository = "https://github.com/rust-windowing/android-ndk-rs" +rust-version = "1.60" [features] all = ["audio", "bitmap","media", "api-level-30"] From 1e69f0f48a1ab8700d0102eb717fd9d0f1144ec2 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 21 Nov 2022 22:02:15 +0100 Subject: [PATCH 26/33] ndk-sys: Regenerate against NDK r25.0 (build 8775105) (#324) * ndk-sys: Regenerate against NDK r25.0 (build 8775105) Note that an `enum` suffix had to be added to `AMidi.h` to prevent `bindgen` from erroring out on: ~/Android/Sdk/ndk/25.0.8775105/toolchains/llvm/prebuilt/linux-x86_64/sysroot//usr/include/amidi/AMidi.h:230:1: error: must use 'enum' tag to refer to type 'AMidiDevice_Protocol' ~/Android/Sdk/ndk/25.0.8775105/toolchains/llvm/prebuilt/linux-x86_64/sysroot//usr/include/amidi/AMidi.h:230:1: error: must use 'enum' tag to refer to type 'AMidiDevice_Protocol', err: true thread 'main' panicked at 'Unable to generate bindings: ()', src/main.rs:52:36 stack backtrace: note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. Also list this NDK version in the `ndk-sys` version metadata, exposing it on the crates.io frontpage. * bitmap: Add new `RGBA_1010102` constant since NDK r25.0 --- ndk-sys/Cargo.toml | 2 +- ndk-sys/generate_bindings.sh | 3 + ndk-sys/src/ffi_aarch64.rs | 3808 ++++++++++++++++++++++++--------- ndk-sys/src/ffi_arm.rs | 3816 +++++++++++++++++++++++++--------- ndk-sys/src/ffi_i686.rs | 3816 +++++++++++++++++++++++++--------- ndk-sys/src/ffi_x86_64.rs | 3808 ++++++++++++++++++++++++--------- ndk/src/bitmap.rs | 32 +- 7 files changed, 11504 insertions(+), 3781 deletions(-) diff --git a/ndk-sys/Cargo.toml b/ndk-sys/Cargo.toml index 3340c6ac..34f1ef0f 100644 --- a/ndk-sys/Cargo.toml +++ b/ndk-sys/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ndk-sys" -version = "0.4.0" +version = "0.4.0+25.0.8775105" authors = ["The Rust Windowing contributors"] edition = "2018" description = "FFI bindings for the Android NDK" diff --git a/ndk-sys/generate_bindings.sh b/ndk-sys/generate_bindings.sh index 7694c17d..85e02154 100755 --- a/ndk-sys/generate_bindings.sh +++ b/ndk-sys/generate_bindings.sh @@ -14,8 +14,11 @@ while read ARCH && read TARGET ; do --newtype-enum 'AHdrMetadataType' \ --newtype-enum 'AIMAGE_FORMATS' \ --newtype-enum 'AMediaDrmEventType' \ + --newtype-enum 'AMediaDrmKeyRequestType' \ --newtype-enum 'AMediaDrmKeyType' \ --newtype-enum 'AMediaKeyStatusType' \ + --newtype-enum 'AMidiDevice_Protocol' \ + --newtype-enum 'AMotionClassification' \ --newtype-enum 'ANativeWindowTransform' \ --newtype-enum 'ANativeWindow_ChangeFrameRateStrategy' \ --newtype-enum 'ANativeWindow_FrameRateCompatibility' \ diff --git a/ndk-sys/src/ffi_aarch64.rs b/ndk-sys/src/ffi_aarch64.rs index 933d64fa..f7a08003 100644 --- a/ndk-sys/src/ffi_aarch64.rs +++ b/ndk-sys/src/ffi_aarch64.rs @@ -34,10 +34,10 @@ pub const __BIONIC__: u32 = 1; pub const __WORDSIZE: u32 = 64; pub const __bos_level: u32 = 0; pub const __ANDROID_NDK__: u32 = 1; -pub const __NDK_MAJOR__: u32 = 23; -pub const __NDK_MINOR__: u32 = 1; +pub const __NDK_MAJOR__: u32 = 25; +pub const __NDK_MINOR__: u32 = 0; pub const __NDK_BETA__: u32 = 0; -pub const __NDK_BUILD__: u32 = 7779620; +pub const __NDK_BUILD__: u32 = 8775105; pub const __NDK_CANARY__: u32 = 0; pub const __ANDROID_API_FUTURE__: u32 = 10000; pub const __ANDROID_API__: u32 = 10000; @@ -396,6 +396,8 @@ pub const SO_DETACH_REUSEPORT_BPF: u32 = 68; pub const SO_PREFER_BUSY_POLL: u32 = 69; pub const SO_BUSY_POLL_BUDGET: u32 = 70; pub const SO_NETNS_COOKIE: u32 = 71; +pub const SO_BUF_LOCK: u32 = 72; +pub const SO_RESERVE_MEM: u32 = 73; pub const SO_TIMESTAMP: u32 = 29; pub const SO_TIMESTAMPNS: u32 = 35; pub const SO_TIMESTAMPING: u32 = 37; @@ -1903,6 +1905,9 @@ impl AndroidBitmapFormat { impl AndroidBitmapFormat { pub const ANDROID_BITMAP_FORMAT_RGBA_F16: AndroidBitmapFormat = AndroidBitmapFormat(9); } +impl AndroidBitmapFormat { + pub const ANDROID_BITMAP_FORMAT_RGBA_1010102: AndroidBitmapFormat = AndroidBitmapFormat(10); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AndroidBitmapFormat(pub ::std::os::raw::c_uint); @@ -2060,12 +2065,24 @@ extern "C" { pub struct AChoreographer { _unused: [u8; 0], } +pub type AVsyncId = i64; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct AChoreographerFrameCallbackData { + _unused: [u8; 0], +} pub type AChoreographer_frameCallback = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: ::std::os::raw::c_long, data: *mut ::std::os::raw::c_void), >; pub type AChoreographer_frameCallback64 = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: i64, data: *mut ::std::os::raw::c_void), >; +pub type AChoreographer_vsyncCallback = ::std::option::Option< + unsafe extern "C" fn( + callbackData: *const AChoreographerFrameCallbackData, + data: *mut ::std::os::raw::c_void, + ), +>; pub type AChoreographer_refreshRateCallback = ::std::option::Option< unsafe extern "C" fn(vsyncPeriodNanos: i64, data: *mut ::std::os::raw::c_void), >; @@ -2102,6 +2119,13 @@ extern "C" { delayMillis: u32, ); } +extern "C" { + pub fn AChoreographer_postVsyncCallback( + choreographer: *mut AChoreographer, + callback: AChoreographer_vsyncCallback, + data: *mut ::std::os::raw::c_void, + ); +} extern "C" { pub fn AChoreographer_registerRefreshRateCallback( choreographer: *mut AChoreographer, @@ -2116,6 +2140,39 @@ extern "C" { data: *mut ::std::os::raw::c_void, ); } +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimeNanos( + data: *const AChoreographerFrameCallbackData, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelinesLength( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getPreferredFrameTimelineIndex( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineVsyncId( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> AVsyncId; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AConfiguration { @@ -2447,6 +2504,90 @@ extern "C" { impl ADataSpace { pub const ADATASPACE_UNKNOWN: ADataSpace = ADataSpace(0); } +impl ADataSpace { + pub const STANDARD_MASK: ADataSpace = ADataSpace(4128768); +} +impl ADataSpace { + pub const STANDARD_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const STANDARD_BT709: ADataSpace = ADataSpace(65536); +} +impl ADataSpace { + pub const STANDARD_BT601_625: ADataSpace = ADataSpace(131072); +} +impl ADataSpace { + pub const STANDARD_BT601_625_UNADJUSTED: ADataSpace = ADataSpace(196608); +} +impl ADataSpace { + pub const STANDARD_BT601_525: ADataSpace = ADataSpace(262144); +} +impl ADataSpace { + pub const STANDARD_BT601_525_UNADJUSTED: ADataSpace = ADataSpace(327680); +} +impl ADataSpace { + pub const STANDARD_BT2020: ADataSpace = ADataSpace(393216); +} +impl ADataSpace { + pub const STANDARD_BT2020_CONSTANT_LUMINANCE: ADataSpace = ADataSpace(458752); +} +impl ADataSpace { + pub const STANDARD_BT470M: ADataSpace = ADataSpace(524288); +} +impl ADataSpace { + pub const STANDARD_FILM: ADataSpace = ADataSpace(589824); +} +impl ADataSpace { + pub const STANDARD_DCI_P3: ADataSpace = ADataSpace(655360); +} +impl ADataSpace { + pub const STANDARD_ADOBE_RGB: ADataSpace = ADataSpace(720896); +} +impl ADataSpace { + pub const TRANSFER_MASK: ADataSpace = ADataSpace(130023424); +} +impl ADataSpace { + pub const TRANSFER_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const TRANSFER_LINEAR: ADataSpace = ADataSpace(4194304); +} +impl ADataSpace { + pub const TRANSFER_SRGB: ADataSpace = ADataSpace(8388608); +} +impl ADataSpace { + pub const TRANSFER_SMPTE_170M: ADataSpace = ADataSpace(12582912); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_2: ADataSpace = ADataSpace(16777216); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_6: ADataSpace = ADataSpace(20971520); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_8: ADataSpace = ADataSpace(25165824); +} +impl ADataSpace { + pub const TRANSFER_ST2084: ADataSpace = ADataSpace(29360128); +} +impl ADataSpace { + pub const TRANSFER_HLG: ADataSpace = ADataSpace(33554432); +} +impl ADataSpace { + pub const RANGE_MASK: ADataSpace = ADataSpace(939524096); +} +impl ADataSpace { + pub const RANGE_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const RANGE_FULL: ADataSpace = ADataSpace(134217728); +} +impl ADataSpace { + pub const RANGE_LIMITED: ADataSpace = ADataSpace(268435456); +} +impl ADataSpace { + pub const RANGE_EXTENDED: ADataSpace = ADataSpace(402653184); +} impl ADataSpace { pub const ADATASPACE_SCRGB_LINEAR: ADataSpace = ADataSpace(406913024); } @@ -2462,9 +2603,21 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_BT2020_PQ: ADataSpace = ADataSpace(163971072); } +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_PQ: ADataSpace = ADataSpace(298188800); +} impl ADataSpace { pub const ADATASPACE_ADOBE_RGB: ADataSpace = ADataSpace(151715840); } +impl ADataSpace { + pub const ADATASPACE_JFIF: ADataSpace = ADataSpace(146931712); +} +impl ADataSpace { + pub const ADATASPACE_BT601_625: ADataSpace = ADataSpace(281149440); +} +impl ADataSpace { + pub const ADATASPACE_BT601_525: ADataSpace = ADataSpace(281280512); +} impl ADataSpace { pub const ADATASPACE_BT2020: ADataSpace = ADataSpace(147193856); } @@ -2477,6 +2630,18 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_SRGB_LINEAR: ADataSpace = ADataSpace(138477568); } +impl ADataSpace { + pub const ADATASPACE_BT2020_HLG: ADataSpace = ADataSpace(168165376); +} +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_HLG: ADataSpace = ADataSpace(302383104); +} +impl ADataSpace { + pub const DEPTH: ADataSpace = ADataSpace(4096); +} +impl ADataSpace { + pub const DYNAMIC_DEPTH: ADataSpace = ADataSpace(4098); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct ADataSpace(pub ::std::os::raw::c_uint); @@ -2843,6 +3008,13 @@ impl AHardwareBuffer_Format { pub const AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: AHardwareBuffer_Format = AHardwareBuffer_Format(35); } +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_YCbCr_P010: AHardwareBuffer_Format = + AHardwareBuffer_Format(54); +} +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_R8_UNORM: AHardwareBuffer_Format = AHardwareBuffer_Format(56); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AHardwareBuffer_Format(pub ::std::os::raw::c_uint); @@ -4062,6 +4234,7 @@ pub const AINPUT_EVENT_TYPE_MOTION: ::std::os::raw::c_uint = 2; pub const AINPUT_EVENT_TYPE_FOCUS: ::std::os::raw::c_uint = 3; pub const AINPUT_EVENT_TYPE_CAPTURE: ::std::os::raw::c_uint = 4; pub const AINPUT_EVENT_TYPE_DRAG: ::std::os::raw::c_uint = 5; +pub const AINPUT_EVENT_TYPE_TOUCH_MODE: ::std::os::raw::c_uint = 6; pub type _bindgen_ty_17 = ::std::os::raw::c_uint; pub const AKEY_EVENT_ACTION_DOWN: ::std::os::raw::c_uint = 0; pub const AKEY_EVENT_ACTION_UP: ::std::os::raw::c_uint = 1; @@ -4164,6 +4337,20 @@ pub const AMOTION_EVENT_TOOL_TYPE_MOUSE: ::std::os::raw::c_uint = 3; pub const AMOTION_EVENT_TOOL_TYPE_ERASER: ::std::os::raw::c_uint = 4; pub const AMOTION_EVENT_TOOL_TYPE_PALM: ::std::os::raw::c_uint = 5; pub type _bindgen_ty_25 = ::std::os::raw::c_uint; +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_NONE: AMotionClassification = AMotionClassification(0); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE: AMotionClassification = + AMotionClassification(1); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS: AMotionClassification = + AMotionClassification(2); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMotionClassification(pub u32); pub const AINPUT_SOURCE_CLASS_MASK: ::std::os::raw::c_uint = 255; pub const AINPUT_SOURCE_CLASS_NONE: ::std::os::raw::c_uint = 0; pub const AINPUT_SOURCE_CLASS_BUTTON: ::std::os::raw::c_uint = 1; @@ -4439,6 +4626,12 @@ extern "C" { history_index: size_t, ) -> f32; } +extern "C" { + pub fn AMotionEvent_getActionButton(motion_event: *const AInputEvent) -> i32; +} +extern "C" { + pub fn AMotionEvent_getClassification(motion_event: *const AInputEvent) -> i32; +} extern "C" { pub fn AMotionEvent_fromJava(env: *mut JNIEnv, motionEvent: jobject) -> *const AInputEvent; } @@ -4475,6 +4668,9 @@ extern "C" { handled: ::std::os::raw::c_int, ); } +extern "C" { + pub fn AInputQueue_fromJava(env: *mut JNIEnv, inputQueue: jobject) -> *mut AInputQueue; +} impl android_LogPriority { pub const ANDROID_LOG_UNKNOWN: android_LogPriority = android_LogPriority(0); } @@ -6599,6 +6795,133 @@ fn bindgen_test_layout_mallinfo() { extern "C" { pub fn mallinfo() -> mallinfo; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mallinfo2 { + pub arena: size_t, + pub ordblks: size_t, + pub smblks: size_t, + pub hblks: size_t, + pub hblkhd: size_t, + pub usmblks: size_t, + pub fsmblks: size_t, + pub uordblks: size_t, + pub fordblks: size_t, + pub keepcost: size_t, +} +#[test] +fn bindgen_test_layout_mallinfo2() { + assert_eq!( + ::std::mem::size_of::(), + 80usize, + concat!("Size of: ", stringify!(mallinfo2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(mallinfo2)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).arena as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(arena) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ordblks as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(ordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).smblks as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(smblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblks as *const _ as usize }, + 24usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblkhd as *const _ as usize }, + 32usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblkhd) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).usmblks as *const _ as usize }, + 40usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(usmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fsmblks as *const _ as usize }, + 48usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fsmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).uordblks as *const _ as usize }, + 56usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(uordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fordblks as *const _ as usize }, + 64usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).keepcost as *const _ as usize }, + 72usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(keepcost) + ) + ); +} extern "C" { pub fn malloc_info( __must_be_zero: ::std::os::raw::c_int, @@ -7250,6 +7573,19 @@ extern "C" { extern "C" { pub fn android_res_cancel(nsend_fd: ::std::os::raw::c_int); } +extern "C" { + pub fn android_tag_socket_with_uid( + sockfd: ::std::os::raw::c_int, + tag: u32, + uid: uid_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_tag_socket(sockfd: ::std::os::raw::c_int, tag: u32) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_untag_socket(sockfd: ::std::os::raw::c_int) -> ::std::os::raw::c_int; +} impl ANativeWindow_LegacyFormat { pub const WINDOW_FORMAT_RGBA_8888: ANativeWindow_LegacyFormat = ANativeWindow_LegacyFormat(1); } @@ -8244,6 +8580,18 @@ impl OperationCode { impl OperationCode { pub const ANEURALNETWORKS_RANK: OperationCode = OperationCode(101); } +impl OperationCode { + pub const ANEURALNETWORKS_BATCH_MATMUL: OperationCode = OperationCode(102); +} +impl OperationCode { + pub const ANEURALNETWORKS_PACK: OperationCode = OperationCode(103); +} +impl OperationCode { + pub const ANEURALNETWORKS_MIRROR_PAD: OperationCode = OperationCode(104); +} +impl OperationCode { + pub const ANEURALNETWORKS_REVERSE: OperationCode = OperationCode(105); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct OperationCode(pub ::std::os::raw::c_uint); @@ -8316,6 +8664,15 @@ impl FeatureLevelCode { impl FeatureLevelCode { pub const ANEURALNETWORKS_FEATURE_LEVEL_5: FeatureLevelCode = FeatureLevelCode(31); } +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_6: FeatureLevelCode = FeatureLevelCode(1000006); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_7: FeatureLevelCode = FeatureLevelCode(1000007); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_8: FeatureLevelCode = FeatureLevelCode(1000008); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct FeatureLevelCode(pub ::std::os::raw::c_uint); @@ -9606,10 +9963,17 @@ pub const ASENSOR_TYPE_POSE_6DOF: ::std::os::raw::c_int = 28; pub const ASENSOR_TYPE_STATIONARY_DETECT: ::std::os::raw::c_int = 29; pub const ASENSOR_TYPE_MOTION_DETECT: ::std::os::raw::c_int = 30; pub const ASENSOR_TYPE_HEART_BEAT: ::std::os::raw::c_int = 31; +pub const ASENSOR_TYPE_DYNAMIC_SENSOR_META: ::std::os::raw::c_int = 32; pub const ASENSOR_TYPE_ADDITIONAL_INFO: ::std::os::raw::c_int = 33; pub const ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT: ::std::os::raw::c_int = 34; pub const ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED: ::std::os::raw::c_int = 35; pub const ASENSOR_TYPE_HINGE_ANGLE: ::std::os::raw::c_int = 36; +pub const ASENSOR_TYPE_HEAD_TRACKER: ::std::os::raw::c_int = 37; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES: ::std::os::raw::c_int = 38; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES: ::std::os::raw::c_int = 39; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 40; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 41; +pub const ASENSOR_TYPE_HEADING: ::std::os::raw::c_int = 42; pub type _bindgen_ty_38 = ::std::os::raw::c_int; pub const ASENSOR_STATUS_NO_CONTACT: ::std::os::raw::c_int = -1; pub const ASENSOR_STATUS_UNRELIABLE: ::std::os::raw::c_int = 0; @@ -10263,480 +10627,1228 @@ fn bindgen_test_layout_AAdditionalInfoEvent() { ); } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ASensorEvent { - pub version: i32, - pub sensor: i32, - pub type_: i32, - pub reserved0: i32, - pub timestamp: i64, - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, - pub flags: u32, - pub reserved1: [i32; 3usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1 { - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, - pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { - pub data: [f32; 16usize], - pub vector: ASensorVector, - pub acceleration: ASensorVector, - pub gyro: ASensorVector, - pub magnetic: ASensorVector, - pub temperature: f32, - pub distance: f32, - pub light: f32, - pub pressure: f32, - pub relative_humidity: f32, - pub uncalibrated_acceleration: AUncalibratedEvent, - pub uncalibrated_gyro: AUncalibratedEvent, - pub uncalibrated_magnetic: AUncalibratedEvent, - pub meta_data: AMetaDataEvent, - pub heart_rate: AHeartRateEvent, - pub dynamic_sensor_meta: ADynamicSensorEvent, - pub additional_info: AAdditionalInfoEvent, +#[derive(Debug, Copy, Clone)] +pub struct AHeadTrackerEvent { + pub rx: f32, + pub ry: f32, + pub rz: f32, + pub vx: f32, + pub vy: f32, + pub vz: f32, + pub discontinuity_count: i32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { +fn bindgen_test_layout_AHeadTrackerEvent() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!( - "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + ::std::mem::size_of::(), + 28usize, + concat!("Size of: ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!( - "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + concat!("Alignment of ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize - }, + unsafe { &(*(::std::ptr::null::())).rx as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(data) + stringify!(rx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).vector as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).ry as *const _ as usize }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(vector) + stringify!(ry) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).acceleration - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).rz as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(acceleration) + stringify!(rz) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).gyro as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vx as *const _ as usize }, + 12usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(gyro) + stringify!(vx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).magnetic - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vy as *const _ as usize }, + 16usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(magnetic) + stringify!(vy) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).temperature - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vz as *const _ as usize }, + 20usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(temperature) + stringify!(vz) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).distance - as *const _ as usize + &(*(::std::ptr::null::())).discontinuity_count as *const _ as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(distance) + stringify!(discontinuity_count) ) ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ALimitedAxesImuEvent { + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuEvent__bindgen_ty_2, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_1 { + pub calib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1 { + pub x: f32, + pub y: f32, + pub z: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - unsafe { - &(*(::std::ptr::null::())).light as *const _ - as usize - }, - 0usize, + ::std::mem::size_of::(), + 12usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(light) + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).pressure - as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 4usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(pressure) + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).relative_humidity + &(*(::std::ptr::null::())).x as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(relative_humidity) + stringify!(x) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_acceleration as *const _ as usize + &(*(::std::ptr::null::())).y + as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_acceleration) + stringify!(y) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).uncalibrated_gyro + &(*(::std::ptr::null::())).z as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_gyro) + stringify!(z) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_magnetic as *const _ as usize + &(*(::std::ptr::null::())).calib as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1), "::", - stringify!(uncalibrated_magnetic) + stringify!(calib) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_2 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).meta_data + &(*(::std::ptr::null::())).x_supported as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(meta_data) + stringify!(x_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).heart_rate + &(*(::std::ptr::null::())).y_supported as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(heart_rate) + stringify!(y_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).dynamic_sensor_meta + &(*(::std::ptr::null::())).z_supported as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(dynamic_sensor_meta) + stringify!(z_supported) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).additional_info - as *const _ as usize + &(*(::std::ptr::null::())).supported as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2), "::", - stringify!(additional_info) + stringify!(supported) ) ); } +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ALimitedAxesImuEvent)) + ); +} #[repr(C)] #[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { - pub data: [u64; 8usize], - pub step_counter: u64, +pub struct ALimitedAxesImuUncalibratedEvent { + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2, + pub __bindgen_anon_3: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_1 { + pub uncalib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1 { + pub x_uncalib: f32, + pub y_uncalib: f32, + pub z_uncalib: f32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, + ::std::mem::size_of::(), + 12usize, concat!( "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - ::std::mem::align_of::(), - 8usize, + ::std::mem::align_of::(), + 4usize, concat!( "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize + &(*(::std::ptr::null::())) + .x_uncalib as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(data) + stringify!(x_uncalib) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).step_counter - as *const _ as usize + &(*(::std::ptr::null::())) + .y_uncalib as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(step_counter) + stringify!(y_uncalib) ) ); -} -#[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + unsafe { + &(*(::std::ptr::null::())) + .z_uncalib as *const _ as usize + }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(z_uncalib) + ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalib + as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1), "::", - stringify!(u64_) + stringify!(uncalib) ) ); } +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_2 { + pub bias: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_bias: f32, + pub y_bias: f32, + pub z_bias: f32, +} #[test] -fn bindgen_test_layout_ASensorEvent() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 104usize, - concat!("Size of: ", stringify!(ASensorEvent)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ASensorEvent)) + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .x_bias as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(version) + stringify!(x_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .y_bias as *const _ as usize + }, 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(sensor) + stringify!(y_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .z_bias as *const _ as usize + }, 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(type_) + stringify!(z_bias) ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2() { assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + ::std::mem::size_of::(), 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).bias + as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2), "::", - stringify!(reserved0) + stringify!(bias) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_3 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, - 16usize, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .x_supported as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(timestamp) + stringify!(x_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, - 88usize, + unsafe { + &(*(::std::ptr::null::())) + .y_supported as *const _ as usize + }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(flags) + stringify!(y_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, - 92usize, + unsafe { + &(*(::std::ptr::null::())) + .z_supported as *const _ as usize + }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(reserved1) + stringify!(z_supported) ) ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorManager { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).supported + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3), + "::", + stringify!(supported) + ) + ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorEventQueue { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent() { + assert_eq!( + ::std::mem::size_of::(), + 36usize, + concat!("Size of: ", stringify!(ALimitedAxesImuUncalibratedEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent) + ) + ); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ASensor { - _unused: [u8; 0], +pub struct AHeadingEvent { + pub heading: f32, + pub accuracy: f32, } -pub type ASensorRef = *const ASensor; -pub type ASensorList = *const ASensorRef; -extern "C" { - pub fn ASensorManager_getInstance() -> *mut ASensorManager; +#[test] +fn bindgen_test_layout_AHeadingEvent() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(AHeadingEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(AHeadingEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).heading as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(heading) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).accuracy as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(accuracy) + ) + ); } -extern "C" { - pub fn ASensorManager_getInstanceForPackage( - packageName: *const ::std::os::raw::c_char, - ) -> *mut ASensorManager; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ASensorEvent { + pub version: i32, + pub sensor: i32, + pub type_: i32, + pub reserved0: i32, + pub timestamp: i64, + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, + pub flags: u32, + pub reserved1: [i32; 3usize], } -extern "C" { - pub fn ASensorManager_getSensorList( - manager: *mut ASensorManager, - list: *mut ASensorList, - ) -> ::std::os::raw::c_int; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1 { + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, + pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, } -extern "C" { - pub fn ASensorManager_getDefaultSensor( - manager: *mut ASensorManager, - type_: ::std::os::raw::c_int, - ) -> *const ASensor; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { + pub data: [f32; 16usize], + pub vector: ASensorVector, + pub acceleration: ASensorVector, + pub gyro: ASensorVector, + pub magnetic: ASensorVector, + pub temperature: f32, + pub distance: f32, + pub light: f32, + pub pressure: f32, + pub relative_humidity: f32, + pub uncalibrated_acceleration: AUncalibratedEvent, + pub uncalibrated_gyro: AUncalibratedEvent, + pub uncalibrated_magnetic: AUncalibratedEvent, + pub meta_data: AMetaDataEvent, + pub heart_rate: AHeartRateEvent, + pub dynamic_sensor_meta: ADynamicSensorEvent, + pub additional_info: AAdditionalInfoEvent, + pub head_tracker: AHeadTrackerEvent, + pub limited_axes_imu: ALimitedAxesImuEvent, + pub limited_axes_imu_uncalibrated: ALimitedAxesImuUncalibratedEvent, + pub heading: AHeadingEvent, } -extern "C" { - pub fn ASensorManager_getDefaultSensorEx( +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).vector as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(vector) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).acceleration + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).gyro as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).magnetic + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).temperature + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(temperature) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).distance + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(distance) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).light as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(light) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).pressure + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(pressure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).relative_humidity + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(relative_humidity) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_acceleration as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalibrated_gyro + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_magnetic as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).meta_data + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(meta_data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heart_rate + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heart_rate) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).dynamic_sensor_meta + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(dynamic_sensor_meta) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).additional_info + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(additional_info) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).head_tracker + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(head_tracker) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).limited_axes_imu + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .limited_axes_imu_uncalibrated as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu_uncalibrated) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heading as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heading) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { + pub data: [u64; 8usize], + pub step_counter: u64, +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).step_counter + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(step_counter) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1), + "::", + stringify!(u64_) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent() { + assert_eq!( + ::std::mem::size_of::(), + 104usize, + concat!("Size of: ", stringify!(ASensorEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ASensorEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(version) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(sensor) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved0) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(timestamp) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, + 88usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(flags) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, + 92usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved1) + ) + ); +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorManager { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorEventQueue { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensor { + _unused: [u8; 0], +} +pub type ASensorRef = *const ASensor; +pub type ASensorList = *const ASensorRef; +extern "C" { + pub fn ASensorManager_getInstance() -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getInstanceForPackage( + packageName: *const ::std::os::raw::c_char, + ) -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn ASensorManager_getDynamicSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ssize_t; +} +extern "C" { + pub fn ASensorManager_getDefaultSensor( + manager: *mut ASensorManager, + type_: ::std::os::raw::c_int, + ) -> *const ASensor; +} +extern "C" { + pub fn ASensorManager_getDefaultSensorEx( manager: *mut ASensorManager, type_: ::std::os::raw::c_int, wakeUp: bool, @@ -14251,23 +15363,81 @@ pub const AAUDIO_CONTENT_TYPE_MOVIE: ::std::os::raw::c_uint = 3; pub const AAUDIO_CONTENT_TYPE_SONIFICATION: ::std::os::raw::c_uint = 4; pub type _bindgen_ty_53 = ::std::os::raw::c_uint; pub type aaudio_content_type_t = i32; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_AUTO: ::std::os::raw::c_uint = 1; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_NEVER: ::std::os::raw::c_uint = 2; +pub type _bindgen_ty_54 = ::std::os::raw::c_uint; +pub type aaudio_spatialization_behavior_t = i32; pub const AAUDIO_INPUT_PRESET_GENERIC: ::std::os::raw::c_uint = 1; pub const AAUDIO_INPUT_PRESET_CAMCORDER: ::std::os::raw::c_uint = 5; pub const AAUDIO_INPUT_PRESET_VOICE_RECOGNITION: ::std::os::raw::c_uint = 6; pub const AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION: ::std::os::raw::c_uint = 7; pub const AAUDIO_INPUT_PRESET_UNPROCESSED: ::std::os::raw::c_uint = 9; pub const AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE: ::std::os::raw::c_uint = 10; -pub type _bindgen_ty_54 = ::std::os::raw::c_uint; +pub type _bindgen_ty_55 = ::std::os::raw::c_uint; pub type aaudio_input_preset_t = i32; pub const AAUDIO_ALLOW_CAPTURE_BY_ALL: ::std::os::raw::c_uint = 1; pub const AAUDIO_ALLOW_CAPTURE_BY_SYSTEM: ::std::os::raw::c_uint = 2; pub const AAUDIO_ALLOW_CAPTURE_BY_NONE: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type _bindgen_ty_56 = ::std::os::raw::c_uint; pub type aaudio_allowed_capture_policy_t = i32; pub const AAUDIO_SESSION_ID_NONE: ::std::os::raw::c_int = -1; pub const AAUDIO_SESSION_ID_ALLOCATE: ::std::os::raw::c_int = 0; -pub type _bindgen_ty_56 = ::std::os::raw::c_int; +pub type _bindgen_ty_57 = ::std::os::raw::c_int; pub type aaudio_session_id_t = i32; +pub const AAUDIO_CHANNEL_INVALID: ::std::os::raw::c_int = -1; +pub const AAUDIO_CHANNEL_FRONT_LEFT: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_FRONT_RIGHT: ::std::os::raw::c_int = 2; +pub const AAUDIO_CHANNEL_FRONT_CENTER: ::std::os::raw::c_int = 4; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY: ::std::os::raw::c_int = 8; +pub const AAUDIO_CHANNEL_BACK_LEFT: ::std::os::raw::c_int = 16; +pub const AAUDIO_CHANNEL_BACK_RIGHT: ::std::os::raw::c_int = 32; +pub const AAUDIO_CHANNEL_FRONT_LEFT_OF_CENTER: ::std::os::raw::c_int = 64; +pub const AAUDIO_CHANNEL_FRONT_RIGHT_OF_CENTER: ::std::os::raw::c_int = 128; +pub const AAUDIO_CHANNEL_BACK_CENTER: ::std::os::raw::c_int = 256; +pub const AAUDIO_CHANNEL_SIDE_LEFT: ::std::os::raw::c_int = 512; +pub const AAUDIO_CHANNEL_SIDE_RIGHT: ::std::os::raw::c_int = 1024; +pub const AAUDIO_CHANNEL_TOP_CENTER: ::std::os::raw::c_int = 2048; +pub const AAUDIO_CHANNEL_TOP_FRONT_LEFT: ::std::os::raw::c_int = 4096; +pub const AAUDIO_CHANNEL_TOP_FRONT_CENTER: ::std::os::raw::c_int = 8192; +pub const AAUDIO_CHANNEL_TOP_FRONT_RIGHT: ::std::os::raw::c_int = 16384; +pub const AAUDIO_CHANNEL_TOP_BACK_LEFT: ::std::os::raw::c_int = 32768; +pub const AAUDIO_CHANNEL_TOP_BACK_CENTER: ::std::os::raw::c_int = 65536; +pub const AAUDIO_CHANNEL_TOP_BACK_RIGHT: ::std::os::raw::c_int = 131072; +pub const AAUDIO_CHANNEL_TOP_SIDE_LEFT: ::std::os::raw::c_int = 262144; +pub const AAUDIO_CHANNEL_TOP_SIDE_RIGHT: ::std::os::raw::c_int = 524288; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_LEFT: ::std::os::raw::c_int = 1048576; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_CENTER: ::std::os::raw::c_int = 2097152; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_RIGHT: ::std::os::raw::c_int = 4194304; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY_2: ::std::os::raw::c_int = 8388608; +pub const AAUDIO_CHANNEL_FRONT_WIDE_LEFT: ::std::os::raw::c_int = 16777216; +pub const AAUDIO_CHANNEL_FRONT_WIDE_RIGHT: ::std::os::raw::c_int = 33554432; +pub const AAUDIO_CHANNEL_MONO: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_STEREO: ::std::os::raw::c_int = 3; +pub const AAUDIO_CHANNEL_2POINT1: ::std::os::raw::c_int = 11; +pub const AAUDIO_CHANNEL_TRI: ::std::os::raw::c_int = 7; +pub const AAUDIO_CHANNEL_TRI_BACK: ::std::os::raw::c_int = 259; +pub const AAUDIO_CHANNEL_3POINT1: ::std::os::raw::c_int = 15; +pub const AAUDIO_CHANNEL_2POINT0POINT2: ::std::os::raw::c_int = 786435; +pub const AAUDIO_CHANNEL_2POINT1POINT2: ::std::os::raw::c_int = 786443; +pub const AAUDIO_CHANNEL_3POINT0POINT2: ::std::os::raw::c_int = 786439; +pub const AAUDIO_CHANNEL_3POINT1POINT2: ::std::os::raw::c_int = 786447; +pub const AAUDIO_CHANNEL_QUAD: ::std::os::raw::c_int = 51; +pub const AAUDIO_CHANNEL_QUAD_SIDE: ::std::os::raw::c_int = 1539; +pub const AAUDIO_CHANNEL_SURROUND: ::std::os::raw::c_int = 263; +pub const AAUDIO_CHANNEL_PENTA: ::std::os::raw::c_int = 55; +pub const AAUDIO_CHANNEL_5POINT1: ::std::os::raw::c_int = 63; +pub const AAUDIO_CHANNEL_5POINT1_SIDE: ::std::os::raw::c_int = 1551; +pub const AAUDIO_CHANNEL_6POINT1: ::std::os::raw::c_int = 319; +pub const AAUDIO_CHANNEL_7POINT1: ::std::os::raw::c_int = 1599; +pub const AAUDIO_CHANNEL_5POINT1POINT2: ::std::os::raw::c_int = 786495; +pub const AAUDIO_CHANNEL_5POINT1POINT4: ::std::os::raw::c_int = 184383; +pub const AAUDIO_CHANNEL_7POINT1POINT2: ::std::os::raw::c_int = 788031; +pub const AAUDIO_CHANNEL_7POINT1POINT4: ::std::os::raw::c_int = 185919; +pub const AAUDIO_CHANNEL_9POINT1POINT4: ::std::os::raw::c_int = 50517567; +pub const AAUDIO_CHANNEL_9POINT1POINT6: ::std::os::raw::c_int = 51303999; +pub const AAUDIO_CHANNEL_FRONT_BACK: ::std::os::raw::c_int = 260; +pub type _bindgen_ty_58 = ::std::os::raw::c_int; +pub type aaudio_channel_mask_t = u32; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AAudioStreamStruct { @@ -14361,6 +15531,18 @@ extern "C" { contentType: aaudio_content_type_t, ); } +extern "C" { + pub fn AAudioStreamBuilder_setSpatializationBehavior( + builder: *mut AAudioStreamBuilder, + spatializationBehavior: aaudio_spatialization_behavior_t, + ); +} +extern "C" { + pub fn AAudioStreamBuilder_setIsContentSpatialized( + builder: *mut AAudioStreamBuilder, + isSpatialized: bool, + ); +} extern "C" { pub fn AAudioStreamBuilder_setInputPreset( builder: *mut AAudioStreamBuilder, @@ -14387,7 +15569,7 @@ extern "C" { } pub const AAUDIO_CALLBACK_RESULT_CONTINUE: ::std::os::raw::c_uint = 0; pub const AAUDIO_CALLBACK_RESULT_STOP: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_57 = ::std::os::raw::c_uint; +pub type _bindgen_ty_59 = ::std::os::raw::c_uint; pub type aaudio_data_callback_result_t = i32; pub type AAudioStream_dataCallback = ::std::option::Option< unsafe extern "C" fn( @@ -14433,6 +15615,12 @@ extern "C" { extern "C" { pub fn AAudioStreamBuilder_delete(builder: *mut AAudioStreamBuilder) -> aaudio_result_t; } +extern "C" { + pub fn AAudioStreamBuilder_setChannelMask( + builder: *mut AAudioStreamBuilder, + channelMask: aaudio_channel_mask_t, + ); +} extern "C" { pub fn AAudioStream_release(stream: *mut AAudioStream) -> aaudio_result_t; } @@ -14546,6 +15734,14 @@ extern "C" { extern "C" { pub fn AAudioStream_getContentType(stream: *mut AAudioStream) -> aaudio_content_type_t; } +extern "C" { + pub fn AAudioStream_getSpatializationBehavior( + stream: *mut AAudioStream, + ) -> aaudio_spatialization_behavior_t; +} +extern "C" { + pub fn AAudioStream_isContentSpatialized(stream: *mut AAudioStream) -> bool; +} extern "C" { pub fn AAudioStream_getInputPreset(stream: *mut AAudioStream) -> aaudio_input_preset_t; } @@ -14557,6 +15753,9 @@ extern "C" { extern "C" { pub fn AAudioStream_isPrivacySensitive(stream: *mut AAudioStream) -> bool; } +extern "C" { + pub fn AAudioStream_getChannelMask(stream: *mut AAudioStream) -> aaudio_channel_mask_t; +} impl media_status_t { pub const AMEDIA_OK: media_status_t = media_status_t(0); } @@ -14664,11 +15863,43 @@ pub struct AMidiOutputPort { } pub const AMIDI_OPCODE_DATA: ::std::os::raw::c_uint = 1; pub const AMIDI_OPCODE_FLUSH: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_58 = ::std::os::raw::c_uint; +pub type _bindgen_ty_60 = ::std::os::raw::c_uint; pub const AMIDI_DEVICE_TYPE_USB: ::std::os::raw::c_uint = 1; pub const AMIDI_DEVICE_TYPE_VIRTUAL: ::std::os::raw::c_uint = 2; pub const AMIDI_DEVICE_TYPE_BLUETOOTH: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_59 = ::std::os::raw::c_uint; +pub type _bindgen_ty_61 = ::std::os::raw::c_uint; +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_USE_MIDI_CI: AMidiDevice_Protocol = AMidiDevice_Protocol(0); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(1); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(2); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(3); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(4); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0: AMidiDevice_Protocol = AMidiDevice_Protocol(17); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(18); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UNKNOWN: AMidiDevice_Protocol = AMidiDevice_Protocol(-1); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMidiDevice_Protocol(pub i32); extern "C" { pub fn AMidiDevice_fromJava( env: *mut JNIEnv, @@ -14688,6 +15919,9 @@ extern "C" { extern "C" { pub fn AMidiDevice_getNumOutputPorts(device: *const AMidiDevice) -> ssize_t; } +extern "C" { + pub fn AMidiDevice_getDefaultProtocol(device: *const AMidiDevice) -> AMidiDevice_Protocol; +} extern "C" { pub fn AMidiOutputPort_open( device: *const AMidiDevice, @@ -14882,7 +16116,13 @@ impl acamera_metadata_section { pub const ACAMERA_HEIC_INFO: acamera_metadata_section = acamera_metadata_section(29); } impl acamera_metadata_section { - pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(30); + pub const ACAMERA_AUTOMOTIVE: acamera_metadata_section = acamera_metadata_section(30); +} +impl acamera_metadata_section { + pub const ACAMERA_AUTOMOTIVE_LENS: acamera_metadata_section = acamera_metadata_section(31); +} +impl acamera_metadata_section { + pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(32); } impl acamera_metadata_section { pub const ACAMERA_VENDOR: acamera_metadata_section = acamera_metadata_section(32768); @@ -15011,6 +16251,14 @@ impl acamera_metadata_section_start { pub const ACAMERA_HEIC_INFO_START: acamera_metadata_section_start = acamera_metadata_section_start(1900544); } +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_START: acamera_metadata_section_start = + acamera_metadata_section_start(1966080); +} +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_LENS_START: acamera_metadata_section_start = + acamera_metadata_section_start(2031616); +} impl acamera_metadata_section_start { pub const ACAMERA_VENDOR_START: acamera_metadata_section_start = acamera_metadata_section_start(-2147483648); @@ -15217,7 +16465,15 @@ impl acamera_metadata_tag { pub const ACAMERA_FLASH_INFO_AVAILABLE: acamera_metadata_tag = acamera_metadata_tag(327680); } impl acamera_metadata_tag { - pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327681); + pub const ACAMERA_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327682); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_STRENGTH_DEFAULT_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327683); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327684); } impl acamera_metadata_tag { pub const ACAMERA_HOT_PIXEL_MODE: acamera_metadata_tag = acamera_metadata_tag(393216); @@ -15398,7 +16654,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(786449); } impl acamera_metadata_tag { - pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786450); + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP: acamera_metadata_tag = + acamera_metadata_tag(786451); +} +impl acamera_metadata_tag { + pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786452); } impl acamera_metadata_tag { pub const ACAMERA_SCALER_CROP_REGION: acamera_metadata_tag = acamera_metadata_tag(851968); @@ -15462,7 +16722,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(851992); } impl acamera_metadata_tag { - pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851993); + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES: acamera_metadata_tag = + acamera_metadata_tag(851993); +} +impl acamera_metadata_tag { + pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851994); } impl acamera_metadata_tag { pub const ACAMERA_SENSOR_EXPOSURE_TIME: acamera_metadata_tag = acamera_metadata_tag(917504); @@ -15747,7 +17011,11 @@ impl acamera_metadata_tag { pub const ACAMERA_INFO_VERSION: acamera_metadata_tag = acamera_metadata_tag(1376257); } impl acamera_metadata_tag { - pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376258); + pub const ACAMERA_INFO_DEVICE_STATE_ORIENTATIONS: acamera_metadata_tag = + acamera_metadata_tag(1376259); +} +impl acamera_metadata_tag { + pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376260); } impl acamera_metadata_tag { pub const ACAMERA_BLACK_LEVEL_LOCK: acamera_metadata_tag = acamera_metadata_tag(1441792); @@ -15878,6 +17146,18 @@ impl acamera_metadata_tag { impl acamera_metadata_tag { pub const ACAMERA_HEIC_END: acamera_metadata_tag = acamera_metadata_tag(1835014); } +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LOCATION: acamera_metadata_tag = acamera_metadata_tag(1966080); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_END: acamera_metadata_tag = acamera_metadata_tag(1966081); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING: acamera_metadata_tag = acamera_metadata_tag(2031616); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_END: acamera_metadata_tag = acamera_metadata_tag(2031617); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_tag(pub ::std::os::raw::c_uint); @@ -16316,6 +17596,11 @@ impl acamera_metadata_enum_acamera_control_video_stabilization_mode { acamera_metadata_enum_acamera_control_video_stabilization_mode = acamera_metadata_enum_acamera_control_video_stabilization_mode(1); } +impl acamera_metadata_enum_acamera_control_video_stabilization_mode { + pub const ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION: + acamera_metadata_enum_acamera_control_video_stabilization_mode = + acamera_metadata_enum_acamera_control_video_stabilization_mode(2); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_control_video_stabilization_mode( @@ -16630,6 +17915,11 @@ impl acamera_metadata_enum_acamera_lens_pose_reference { acamera_metadata_enum_acamera_lens_pose_reference = acamera_metadata_enum_acamera_lens_pose_reference(2); } +impl acamera_metadata_enum_acamera_lens_pose_reference { + pub const ACAMERA_LENS_POSE_REFERENCE_AUTOMOTIVE: + acamera_metadata_enum_acamera_lens_pose_reference = + acamera_metadata_enum_acamera_lens_pose_reference(3); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_lens_pose_reference(pub ::std::os::raw::c_uint); @@ -16748,10 +18038,86 @@ impl acamera_metadata_enum_acamera_request_available_capabilities { acamera_metadata_enum_acamera_request_available_capabilities = acamera_metadata_enum_acamera_request_available_capabilities(16); } +impl acamera_metadata_enum_acamera_request_available_capabilities { + pub const ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE: + acamera_metadata_enum_acamera_request_available_capabilities = + acamera_metadata_enum_acamera_request_available_capabilities(19); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_request_available_capabilities(pub ::std::os::raw::c_uint); pub use self::acamera_metadata_enum_acamera_request_available_capabilities as acamera_metadata_enum_android_request_available_capabilities_t; +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HLG10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10_PLUS: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(8); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(16); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(32); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(64); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(128); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(256); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(512); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1024); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2048); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_MAX: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4096); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map as acamera_metadata_enum_android_request_available_dynamic_range_profiles_map_t; impl acamera_metadata_enum_acamera_scaler_available_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT: acamera_metadata_enum_acamera_scaler_available_stream_configurations = @@ -16822,6 +18188,16 @@ impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configura acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(7); } +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_10BIT_OUTPUT: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(8); +} +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PUBLIC_END_3_8: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(9); +} impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VENDOR_START: acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = @@ -16914,6 +18290,42 @@ pub struct acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supporte pub ::std::os::raw::c_uint, ); pub use self::acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supported as acamera_metadata_enum_android_scaler_multi_resolution_stream_supported_t; +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(0); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(1); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(2); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(3); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(4); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(5); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_scaler_available_stream_use_cases( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_scaler_available_stream_use_cases as acamera_metadata_enum_android_scaler_available_stream_use_cases_t; impl acamera_metadata_enum_acamera_sensor_reference_illuminant1 { pub const ACAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT: acamera_metadata_enum_acamera_sensor_reference_illuminant1 = @@ -17480,832 +18892,1386 @@ impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_max 0, ); } -impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { - pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - 1, - ); +impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { + pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + 1, + ); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_INTERIOR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(0); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(1); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(2); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(3); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(4); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(5); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(6); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(7); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(8); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(9); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(10); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_location(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_location as acamera_metadata_enum_android_automotive_location_t; +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(0); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(1); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(2); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(3); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(4); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(5); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(6); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(7); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(8); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(9); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(10); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(11); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(12); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(13); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(14); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_lens_facing(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_lens_facing as acamera_metadata_enum_android_automotive_lens_facing_t; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata { + _unused: [u8; 0], +} +pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; +pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; +pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; +pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; +pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; +pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; +pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; +pub type _bindgen_ty_62 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata_rational { + pub numerator: i32, + pub denominator: i32, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_rational() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).numerator as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(numerator) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).denominator as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(denominator) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ACameraMetadata_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_entry__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ACameraMetadata_entry__bindgen_ty_1 { + pub u8_: *mut u8, + pub i32_: *mut i32, + pub f: *mut f32, + pub i64_: *mut i64, + pub d: *mut f64, + pub r: *mut ACameraMetadata_rational, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ACameraMetadata_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(count) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(data) + ) + ); } -#[repr(transparent)] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - pub ::std::os::raw::c_uint, -); -pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct ACameraMetadata_const_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_const_entry__bindgen_ty_1, } -pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; -pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; -pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; -pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; -pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; -pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; -pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; -pub type _bindgen_ty_60 = ::std::os::raw::c_uint; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata_rational { - pub numerator: i32, - pub denominator: i32, +#[derive(Copy, Clone)] +pub union ACameraMetadata_const_entry__bindgen_ty_1 { + pub u8_: *const u8, + pub i32_: *const i32, + pub f: *const f32, + pub i64_: *const i64, + pub d: *const f64, + pub r: *const ACameraMetadata_rational, } #[test] -fn bindgen_test_layout_ACameraMetadata_rational() { +fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 8usize, - concat!("Size of: ", stringify!(ACameraMetadata_rational)) + concat!( + "Size of: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_const_entry() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).type_ as *const _ as usize + }, 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(type_) + ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).numerator as *const _ as usize + &(*(::std::ptr::null::())).count as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(numerator) + stringify!(count) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).denominator as *const _ as usize + &(*(::std::ptr::null::())).data as *const _ as usize }, - 4usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(denominator) + stringify!(data) ) ); } +extern "C" { + pub fn ACameraMetadata_getConstEntry( + metadata: *const ACameraMetadata, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_getAllTags( + metadata: *const ACameraMetadata, + numEntries: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; +} +extern "C" { + pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); +} +extern "C" { + pub fn ACameraMetadata_isLogicalMultiCamera( + staticMetadata: *const ACameraMetadata, + numPhysicalCameras: *mut size_t, + physicalCameraIds: *mut *const *const ::std::os::raw::c_char, + ) -> bool; +} +extern "C" { + pub fn ACameraMetadata_fromCameraMetadata( + env: *mut JNIEnv, + cameraMetadata: jobject, + ) -> *mut ACameraMetadata; +} +pub type ACameraWindowType = ANativeWindow; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_entry__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTargets { + _unused: [u8; 0], } #[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_entry__bindgen_ty_1 { - pub u8_: *mut u8, - pub i32_: *mut i32, - pub f: *mut f32, - pub i64_: *mut i64, - pub d: *mut f64, - pub r: *mut ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTarget { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACaptureRequest { + _unused: [u8; 0], +} +extern "C" { + pub fn ACameraOutputTarget_create( + window: *mut ACameraWindowType, + output: *mut *mut ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); +} +extern "C" { + pub fn ACaptureRequest_addTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_removeTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry( + request: *const ACaptureRequest, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getAllTags( + request: *const ACaptureRequest, + numTags: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_u8( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i32( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_float( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i64( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_double( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_rational( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_free(request: *mut ACaptureRequest); +} +extern "C" { + pub fn ACaptureRequest_setUserContext( + request: *mut ACaptureRequest, + context: *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getUserContext( + request: *const ACaptureRequest, + context: *mut *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry_physicalCamera( + request: *const ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_u8( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i32( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_float( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i64( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_double( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_rational( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession { + _unused: [u8; 0], +} +pub type ACameraCaptureSession_stateCallback = ::std::option::Option< + unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_stateCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onClosed: ACameraCaptureSession_stateCallback, + pub onReady: ACameraCaptureSession_stateCallback, + pub onActive: ACameraCaptureSession_stateCallback, } #[test] -fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { - assert_eq!( - ::std::mem::size_of::(), - 8usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) - ); +fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { assert_eq!( - ::std::mem::align_of::(), - 8usize, + ::std::mem::size_of::(), + 32usize, concat!( - "Alignment of ", - stringify!(ACameraMetadata_entry__bindgen_ty_1) + "Size of: ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 8usize, concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(u8_) + "Alignment of ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(i32_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).f as *const _ as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ + &(*(::std::ptr::null::())).onClosed as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(i64_) + stringify!(onClosed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ as usize + &(*(::std::ptr::null::())).onReady as *const _ + as usize }, - 0usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(d) + stringify!(onReady) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ as usize + &(*(::std::ptr::null::())).onActive as *const _ + as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(r) + stringify!(onActive) ) ); } +pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; +pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; +pub type _bindgen_ty_63 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureFailure { + pub frameNumber: i64, + pub reason: ::std::os::raw::c_int, + pub sequenceId: ::std::os::raw::c_int, + pub wasImageCaptured: bool, +} #[test] -fn bindgen_test_layout_ACameraMetadata_entry() { +fn bindgen_test_layout_ACameraCaptureFailure() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 24usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry)) + concat!("Size of: ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, - concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + concat!("Alignment of ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).frameNumber as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(tag) + stringify!(frameNumber) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, - 4usize, + unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(type_) + stringify!(reason) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())).sequenceId as *const _ as usize + }, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(count) + stringify!(sequenceId) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(data) + stringify!(wasImageCaptured) ) ); } +pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *const ACaptureRequest, + timestamp: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + ), +>; +pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ACameraCaptureFailure, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + frameNumber: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + ), +>; +pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + window: *mut ACameraWindowType, + frameNumber: i64, + ), +>; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_const_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_const_entry__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_const_entry__bindgen_ty_1 { - pub u8_: *const u8, - pub i32_: *const i32, - pub f: *const f32, - pub i64_: *const i64, - pub d: *const f64, - pub r: *const ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_captureCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, + pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { assert_eq!( - ::std::mem::size_of::(), - 8usize, + ::std::mem::size_of::(), + 64usize, concat!( "Size of: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(u8_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(i32_) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).f as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureStarted + as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(i64_) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureProgressed + as *const _ as usize }, - 0usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(d) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureCompleted + as *const _ as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(r) + stringify!(onCaptureCompleted) ) ); -} -#[test] -fn bindgen_test_layout_ACameraMetadata_const_entry() { - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) - ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, - 0usize, + unsafe { + &(*(::std::ptr::null::())).onCaptureFailed + as *const _ as usize + }, + 32usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(tag) + stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).type_ as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize }, - 4usize, + 40usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(type_) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).count as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 8usize, + 48usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(count) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ as usize + &(*(::std::ptr::null::())).onCaptureBufferLost + as *const _ as usize }, - 16usize, + 56usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(data) + stringify!(onCaptureBufferLost) ) ); } +pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; +pub type _bindgen_ty_64 = ::std::os::raw::c_int; extern "C" { - pub fn ACameraMetadata_getConstEntry( - metadata: *const ACameraMetadata, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_getAllTags( - metadata: *const ACameraMetadata, - numEntries: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; -} -extern "C" { - pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); -} -extern "C" { - pub fn ACameraMetadata_isLogicalMultiCamera( - staticMetadata: *const ACameraMetadata, - numPhysicalCameras: *mut size_t, - physicalCameraIds: *mut *const *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn ACameraMetadata_fromCameraMetadata( - env: *mut JNIEnv, - cameraMetadata: jobject, - ) -> *mut ACameraMetadata; -} -pub type ACameraWindowType = ANativeWindow; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTargets { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTarget { - _unused: [u8; 0], + pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACaptureRequest { +pub struct ACameraDevice { _unused: [u8; 0], } extern "C" { - pub fn ACameraOutputTarget_create( - window: *mut ACameraWindowType, - output: *mut *mut ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); -} -extern "C" { - pub fn ACaptureRequest_addTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_removeTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry( - request: *const ACaptureRequest, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getAllTags( - request: *const ACaptureRequest, - numTags: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_u8( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i32( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_float( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i64( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_double( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_rational( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_free(request: *mut ACaptureRequest); -} -extern "C" { - pub fn ACaptureRequest_setUserContext( - request: *mut ACaptureRequest, - context: *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getUserContext( - request: *const ACaptureRequest, - context: *mut *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry_physicalCamera( - request: *const ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_u8( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i32( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i32, + pub fn ACameraCaptureSession_getDevice( + session: *mut ACameraCaptureSession, + device: *mut *mut ACameraDevice, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_float( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f32, + pub fn ACameraCaptureSession_capture( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i64( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i64, + pub fn ACameraCaptureSession_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_double( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f64, + pub fn ACameraCaptureSession_stopRepeating( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_rational( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, + pub fn ACameraCaptureSession_abortCaptures( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession { +pub struct ACaptureSessionOutput { _unused: [u8; 0], } -pub type ACameraCaptureSession_stateCallback = ::std::option::Option< - unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +extern "C" { + pub fn ACameraCaptureSession_updateSharedOutput( + session: *mut ACameraCaptureSession, + output: *mut ACaptureSessionOutput, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + physicalResultCount: size_t, + physicalCameraIds: *mut *const ::std::os::raw::c_char, + physicalResults: *mut *const ACameraMetadata, + ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_stateCallbacks { - pub context: *mut ::std::os::raw::c_void, - pub onClosed: ACameraCaptureSession_stateCallback, - pub onReady: ACameraCaptureSession_stateCallback, - pub onActive: ACameraCaptureSession_stateCallback, +pub struct ALogicalCameraCaptureFailure { + pub captureFailure: ACameraCaptureFailure, + pub physicalCameraId: *const ::std::os::raw::c_char, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { +fn bindgen_test_layout_ALogicalCameraCaptureFailure() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 32usize, + concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).captureFailure as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(captureFailure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).physicalCameraId as *const _ + as usize + }, + 24usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(physicalCameraId) + ) + ); +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ALogicalCameraCaptureFailure, + ), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, + pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, +} +#[test] +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ - as usize + &(*(::std::ptr::null::())).context + as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onClosed as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureStarted as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onClosed) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onReady as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureProgressed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onReady) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onActive as *const _ - as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureCompleted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onActive) + stringify!(onLogicalCameraCaptureCompleted) ) ); -} -pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; -pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_61 = ::std::os::raw::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureFailure { - pub frameNumber: i64, - pub reason: ::std::os::raw::c_int, - pub sequenceId: ::std::os::raw::c_int, - pub wasImageCaptured: bool, -} -#[test] -fn bindgen_test_layout_ACameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(ACameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ACameraCaptureFailure)) - ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).frameNumber as *const _ as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureFailed as *const _ as usize }, - 0usize, + 32usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(frameNumber) + stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize + }, + 40usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(reason) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).sequenceId as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 12usize, + 48usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(sequenceId) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureBufferLost as *const _ as usize }, - 16usize, + 56usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(wasImageCaptured) + stringify!(onCaptureBufferLost) ) - ); -} -pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *const ACaptureRequest, - timestamp: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - ), ->; -pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ACameraCaptureFailure, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - frameNumber: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, + ); +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_capture( session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - ), ->; -pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_captureCallback_startV2 = ::std::option::Option< unsafe extern "C" fn( context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - window: *mut ACameraWindowType, + request: *const ACaptureRequest, + timestamp: i64, frameNumber: i64, ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_captureCallbacks { +pub struct ACameraCaptureSession_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, @@ -18314,252 +20280,133 @@ pub struct ACameraCaptureSession_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 64usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureStarted + &(*(::std::ptr::null::())).onCaptureStarted as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureProgressed + &(*(::std::ptr::null::())).onCaptureProgressed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureCompleted + &(*(::std::ptr::null::())).onCaptureCompleted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureFailed + &(*(::std::ptr::null::())).onCaptureFailed as *const _ as usize }, 32usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 40usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 48usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureBufferLost + &(*(::std::ptr::null::())).onCaptureBufferLost as *const _ as usize }, 56usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } -pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_62 = ::std::os::raw::c_int; -extern "C" { - pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraDevice { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_getDevice( - session: *mut ACameraCaptureSession, - device: *mut *mut ACameraDevice, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_capture( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_setRepeatingRequest( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_stopRepeating( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_abortCaptures( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACaptureSessionOutput { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_updateSharedOutput( - session: *mut ACameraCaptureSession, - output: *mut ACaptureSessionOutput, - ) -> camera_status_t; -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - physicalResultCount: size_t, - physicalCameraIds: *mut *const ::std::os::raw::c_char, - physicalResults: *mut *const ACameraMetadata, - ), ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ALogicalCameraCaptureFailure { - pub captureFailure: ACameraCaptureFailure, - pub physicalCameraId: *const ::std::os::raw::c_char, -} -#[test] -fn bindgen_test_layout_ALogicalCameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 32usize, - concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).captureFailure as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(captureFailure) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).physicalCameraId as *const _ - as usize - }, - 24usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(physicalCameraId) - ) - ); -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ALogicalCameraCaptureFailure, - ), ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { +pub struct ACameraCaptureSession_logicalCamera_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, @@ -18568,141 +20415,159 @@ pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 64usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context - as *const _ as usize + &(*(::std::ptr::null::())) + .context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureStarted as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureProgressed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureCompleted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureFailed as *const _ as usize }, 32usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 40usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 48usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureBufferLost as *const _ as usize }, 56usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_capture( + pub fn ACameraCaptureSession_captureV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + pub fn ACameraCaptureSession_setRepeatingRequestV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_captureV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, @@ -18752,7 +20617,7 @@ pub const ERROR_MAX_CAMERAS_IN_USE: ::std::os::raw::c_uint = 2; pub const ERROR_CAMERA_DISABLED: ::std::os::raw::c_uint = 3; pub const ERROR_CAMERA_DEVICE: ::std::os::raw::c_uint = 4; pub const ERROR_CAMERA_SERVICE: ::std::os::raw::c_uint = 5; -pub type _bindgen_ty_63 = ::std::os::raw::c_uint; +pub type _bindgen_ty_65 = ::std::os::raw::c_uint; pub type ACameraDevice_StateCallback = ::std::option::Option< unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, device: *mut ACameraDevice), >; @@ -20102,6 +21967,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_PICTURE_TYPE: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE: *const ::std::os::raw::c_char; +} extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_B_MAX: *const ::std::os::raw::c_char; } @@ -20126,6 +22000,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_P_MIN: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT: *const ::std::os::raw::c_char; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaCodec { @@ -20207,7 +22090,7 @@ pub const AMEDIACODEC_CONFIGURE_FLAG_ENCODE: ::std::os::raw::c_int = 1; pub const AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED: ::std::os::raw::c_int = -3; pub const AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED: ::std::os::raw::c_int = -2; pub const AMEDIACODEC_INFO_TRY_AGAIN_LATER: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_64 = ::std::os::raw::c_int; +pub type _bindgen_ty_66 = ::std::os::raw::c_int; pub type AMediaCodecOnAsyncInputAvailable = ::std::option::Option< unsafe extern "C" fn( codec: *mut AMediaCodec, @@ -20315,6 +22198,14 @@ fn bindgen_test_layout_AMediaCodecOnAsyncNotifyCallback() { ) ); } +pub type AMediaCodecOnFrameRendered = ::std::option::Option< + unsafe extern "C" fn( + codec: *mut AMediaCodec, + userdata: *mut ::std::os::raw::c_void, + mediaTimeUs: i64, + systemNano: i64, + ), +>; extern "C" { pub fn AMediaCodec_createCodecByName(name: *const ::std::os::raw::c_char) -> *mut AMediaCodec; } @@ -20476,6 +22367,13 @@ extern "C" { userdata: *mut ::std::os::raw::c_void, ) -> media_status_t; } +extern "C" { + pub fn AMediaCodec_setOnFrameRenderedCallback( + arg1: *mut AMediaCodec, + callback: AMediaCodecOnFrameRendered, + userdata: *mut ::std::os::raw::c_void, + ) -> media_status_t; +} extern "C" { pub fn AMediaCodec_releaseCrypto(arg1: *mut AMediaCodec) -> media_status_t; } @@ -20750,6 +22648,24 @@ impl AMediaDrmKeyType { #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AMediaDrmKeyType(pub ::std::os::raw::c_uint); +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_INITIAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(0); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RENEWAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(1); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RELEASE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(2); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_NONE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(3); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_UPDATE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(4); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMediaDrmKeyRequestType(pub i32); #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaDrmKeyValuePair { @@ -20930,6 +22846,22 @@ extern "C" { keyRequestSize: *mut size_t, ) -> media_status_t; } +extern "C" { + pub fn AMediaDrm_getKeyRequestWithDefaultUrlAndType( + arg1: *mut AMediaDrm, + scope: *const AMediaDrmScope, + init: *const u8, + initSize: size_t, + mimeType: *const ::std::os::raw::c_char, + keyType: AMediaDrmKeyType, + optionalParameters: *const AMediaDrmKeyValue, + numOptionalParameters: size_t, + keyRequest: *mut *const u8, + keyRequestSize: *mut size_t, + defaultUrl: *mut *const ::std::os::raw::c_char, + keyRequestType: *mut AMediaDrmKeyRequestType, + ) -> media_status_t; +} extern "C" { pub fn AMediaDrm_provideKeyResponse( arg1: *mut AMediaDrm, @@ -21250,7 +23182,7 @@ extern "C" { } pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC: ::std::os::raw::c_uint = 1; pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_65 = ::std::os::raw::c_uint; +pub type _bindgen_ty_67 = ::std::os::raw::c_uint; extern "C" { pub fn AMediaExtractor_getFileFormat(arg1: *mut AMediaExtractor) -> *mut AMediaFormat; } diff --git a/ndk-sys/src/ffi_arm.rs b/ndk-sys/src/ffi_arm.rs index 2806bf6b..deaa04c2 100644 --- a/ndk-sys/src/ffi_arm.rs +++ b/ndk-sys/src/ffi_arm.rs @@ -114,10 +114,10 @@ pub const __BIONIC__: u32 = 1; pub const __WORDSIZE: u32 = 32; pub const __bos_level: u32 = 0; pub const __ANDROID_NDK__: u32 = 1; -pub const __NDK_MAJOR__: u32 = 23; -pub const __NDK_MINOR__: u32 = 1; +pub const __NDK_MAJOR__: u32 = 25; +pub const __NDK_MINOR__: u32 = 0; pub const __NDK_BETA__: u32 = 0; -pub const __NDK_BUILD__: u32 = 7779620; +pub const __NDK_BUILD__: u32 = 8775105; pub const __NDK_CANARY__: u32 = 0; pub const __ANDROID_API_FUTURE__: u32 = 10000; pub const __ANDROID_API__: u32 = 10000; @@ -450,6 +450,8 @@ pub const SO_DETACH_REUSEPORT_BPF: u32 = 68; pub const SO_PREFER_BUSY_POLL: u32 = 69; pub const SO_BUSY_POLL_BUDGET: u32 = 70; pub const SO_NETNS_COOKIE: u32 = 71; +pub const SO_BUF_LOCK: u32 = 72; +pub const SO_RESERVE_MEM: u32 = 73; pub const SOCK_IOC_TYPE: u32 = 137; pub const SIOCADDRT: u32 = 35083; pub const SIOCDELRT: u32 = 35084; @@ -1915,6 +1917,9 @@ impl AndroidBitmapFormat { impl AndroidBitmapFormat { pub const ANDROID_BITMAP_FORMAT_RGBA_F16: AndroidBitmapFormat = AndroidBitmapFormat(9); } +impl AndroidBitmapFormat { + pub const ANDROID_BITMAP_FORMAT_RGBA_1010102: AndroidBitmapFormat = AndroidBitmapFormat(10); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AndroidBitmapFormat(pub ::std::os::raw::c_uint); @@ -2072,12 +2077,24 @@ extern "C" { pub struct AChoreographer { _unused: [u8; 0], } +pub type AVsyncId = i64; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct AChoreographerFrameCallbackData { + _unused: [u8; 0], +} pub type AChoreographer_frameCallback = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: ::std::os::raw::c_long, data: *mut ::std::os::raw::c_void), >; pub type AChoreographer_frameCallback64 = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: i64, data: *mut ::std::os::raw::c_void), >; +pub type AChoreographer_vsyncCallback = ::std::option::Option< + unsafe extern "C" fn( + callbackData: *const AChoreographerFrameCallbackData, + data: *mut ::std::os::raw::c_void, + ), +>; pub type AChoreographer_refreshRateCallback = ::std::option::Option< unsafe extern "C" fn(vsyncPeriodNanos: i64, data: *mut ::std::os::raw::c_void), >; @@ -2114,6 +2131,13 @@ extern "C" { delayMillis: u32, ); } +extern "C" { + pub fn AChoreographer_postVsyncCallback( + choreographer: *mut AChoreographer, + callback: AChoreographer_vsyncCallback, + data: *mut ::std::os::raw::c_void, + ); +} extern "C" { pub fn AChoreographer_registerRefreshRateCallback( choreographer: *mut AChoreographer, @@ -2128,6 +2152,39 @@ extern "C" { data: *mut ::std::os::raw::c_void, ); } +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimeNanos( + data: *const AChoreographerFrameCallbackData, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelinesLength( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getPreferredFrameTimelineIndex( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineVsyncId( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> AVsyncId; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AConfiguration { @@ -2459,6 +2516,90 @@ extern "C" { impl ADataSpace { pub const ADATASPACE_UNKNOWN: ADataSpace = ADataSpace(0); } +impl ADataSpace { + pub const STANDARD_MASK: ADataSpace = ADataSpace(4128768); +} +impl ADataSpace { + pub const STANDARD_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const STANDARD_BT709: ADataSpace = ADataSpace(65536); +} +impl ADataSpace { + pub const STANDARD_BT601_625: ADataSpace = ADataSpace(131072); +} +impl ADataSpace { + pub const STANDARD_BT601_625_UNADJUSTED: ADataSpace = ADataSpace(196608); +} +impl ADataSpace { + pub const STANDARD_BT601_525: ADataSpace = ADataSpace(262144); +} +impl ADataSpace { + pub const STANDARD_BT601_525_UNADJUSTED: ADataSpace = ADataSpace(327680); +} +impl ADataSpace { + pub const STANDARD_BT2020: ADataSpace = ADataSpace(393216); +} +impl ADataSpace { + pub const STANDARD_BT2020_CONSTANT_LUMINANCE: ADataSpace = ADataSpace(458752); +} +impl ADataSpace { + pub const STANDARD_BT470M: ADataSpace = ADataSpace(524288); +} +impl ADataSpace { + pub const STANDARD_FILM: ADataSpace = ADataSpace(589824); +} +impl ADataSpace { + pub const STANDARD_DCI_P3: ADataSpace = ADataSpace(655360); +} +impl ADataSpace { + pub const STANDARD_ADOBE_RGB: ADataSpace = ADataSpace(720896); +} +impl ADataSpace { + pub const TRANSFER_MASK: ADataSpace = ADataSpace(130023424); +} +impl ADataSpace { + pub const TRANSFER_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const TRANSFER_LINEAR: ADataSpace = ADataSpace(4194304); +} +impl ADataSpace { + pub const TRANSFER_SRGB: ADataSpace = ADataSpace(8388608); +} +impl ADataSpace { + pub const TRANSFER_SMPTE_170M: ADataSpace = ADataSpace(12582912); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_2: ADataSpace = ADataSpace(16777216); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_6: ADataSpace = ADataSpace(20971520); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_8: ADataSpace = ADataSpace(25165824); +} +impl ADataSpace { + pub const TRANSFER_ST2084: ADataSpace = ADataSpace(29360128); +} +impl ADataSpace { + pub const TRANSFER_HLG: ADataSpace = ADataSpace(33554432); +} +impl ADataSpace { + pub const RANGE_MASK: ADataSpace = ADataSpace(939524096); +} +impl ADataSpace { + pub const RANGE_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const RANGE_FULL: ADataSpace = ADataSpace(134217728); +} +impl ADataSpace { + pub const RANGE_LIMITED: ADataSpace = ADataSpace(268435456); +} +impl ADataSpace { + pub const RANGE_EXTENDED: ADataSpace = ADataSpace(402653184); +} impl ADataSpace { pub const ADATASPACE_SCRGB_LINEAR: ADataSpace = ADataSpace(406913024); } @@ -2474,9 +2615,21 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_BT2020_PQ: ADataSpace = ADataSpace(163971072); } +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_PQ: ADataSpace = ADataSpace(298188800); +} impl ADataSpace { pub const ADATASPACE_ADOBE_RGB: ADataSpace = ADataSpace(151715840); } +impl ADataSpace { + pub const ADATASPACE_JFIF: ADataSpace = ADataSpace(146931712); +} +impl ADataSpace { + pub const ADATASPACE_BT601_625: ADataSpace = ADataSpace(281149440); +} +impl ADataSpace { + pub const ADATASPACE_BT601_525: ADataSpace = ADataSpace(281280512); +} impl ADataSpace { pub const ADATASPACE_BT2020: ADataSpace = ADataSpace(147193856); } @@ -2489,6 +2642,18 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_SRGB_LINEAR: ADataSpace = ADataSpace(138477568); } +impl ADataSpace { + pub const ADATASPACE_BT2020_HLG: ADataSpace = ADataSpace(168165376); +} +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_HLG: ADataSpace = ADataSpace(302383104); +} +impl ADataSpace { + pub const DEPTH: ADataSpace = ADataSpace(4096); +} +impl ADataSpace { + pub const DYNAMIC_DEPTH: ADataSpace = ADataSpace(4098); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct ADataSpace(pub ::std::os::raw::c_uint); @@ -2855,6 +3020,13 @@ impl AHardwareBuffer_Format { pub const AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: AHardwareBuffer_Format = AHardwareBuffer_Format(35); } +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_YCbCr_P010: AHardwareBuffer_Format = + AHardwareBuffer_Format(54); +} +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_R8_UNORM: AHardwareBuffer_Format = AHardwareBuffer_Format(56); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AHardwareBuffer_Format(pub ::std::os::raw::c_uint); @@ -4074,6 +4246,7 @@ pub const AINPUT_EVENT_TYPE_MOTION: ::std::os::raw::c_uint = 2; pub const AINPUT_EVENT_TYPE_FOCUS: ::std::os::raw::c_uint = 3; pub const AINPUT_EVENT_TYPE_CAPTURE: ::std::os::raw::c_uint = 4; pub const AINPUT_EVENT_TYPE_DRAG: ::std::os::raw::c_uint = 5; +pub const AINPUT_EVENT_TYPE_TOUCH_MODE: ::std::os::raw::c_uint = 6; pub type _bindgen_ty_17 = ::std::os::raw::c_uint; pub const AKEY_EVENT_ACTION_DOWN: ::std::os::raw::c_uint = 0; pub const AKEY_EVENT_ACTION_UP: ::std::os::raw::c_uint = 1; @@ -4176,6 +4349,20 @@ pub const AMOTION_EVENT_TOOL_TYPE_MOUSE: ::std::os::raw::c_uint = 3; pub const AMOTION_EVENT_TOOL_TYPE_ERASER: ::std::os::raw::c_uint = 4; pub const AMOTION_EVENT_TOOL_TYPE_PALM: ::std::os::raw::c_uint = 5; pub type _bindgen_ty_25 = ::std::os::raw::c_uint; +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_NONE: AMotionClassification = AMotionClassification(0); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE: AMotionClassification = + AMotionClassification(1); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS: AMotionClassification = + AMotionClassification(2); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMotionClassification(pub u32); pub const AINPUT_SOURCE_CLASS_MASK: ::std::os::raw::c_uint = 255; pub const AINPUT_SOURCE_CLASS_NONE: ::std::os::raw::c_uint = 0; pub const AINPUT_SOURCE_CLASS_BUTTON: ::std::os::raw::c_uint = 1; @@ -4451,6 +4638,12 @@ extern "C" { history_index: size_t, ) -> f32; } +extern "C" { + pub fn AMotionEvent_getActionButton(motion_event: *const AInputEvent) -> i32; +} +extern "C" { + pub fn AMotionEvent_getClassification(motion_event: *const AInputEvent) -> i32; +} extern "C" { pub fn AMotionEvent_fromJava(env: *mut JNIEnv, motionEvent: jobject) -> *const AInputEvent; } @@ -4487,6 +4680,9 @@ extern "C" { handled: ::std::os::raw::c_int, ); } +extern "C" { + pub fn AInputQueue_fromJava(env: *mut JNIEnv, inputQueue: jobject) -> *mut AInputQueue; +} impl android_LogPriority { pub const ANDROID_LOG_UNKNOWN: android_LogPriority = android_LogPriority(0); } @@ -6605,6 +6801,133 @@ fn bindgen_test_layout_mallinfo() { extern "C" { pub fn mallinfo() -> mallinfo; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mallinfo2 { + pub arena: size_t, + pub ordblks: size_t, + pub smblks: size_t, + pub hblks: size_t, + pub hblkhd: size_t, + pub usmblks: size_t, + pub fsmblks: size_t, + pub uordblks: size_t, + pub fordblks: size_t, + pub keepcost: size_t, +} +#[test] +fn bindgen_test_layout_mallinfo2() { + assert_eq!( + ::std::mem::size_of::(), + 40usize, + concat!("Size of: ", stringify!(mallinfo2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(mallinfo2)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).arena as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(arena) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ordblks as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(ordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).smblks as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(smblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblks as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblkhd as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblkhd) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).usmblks as *const _ as usize }, + 20usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(usmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fsmblks as *const _ as usize }, + 24usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fsmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).uordblks as *const _ as usize }, + 28usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(uordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fordblks as *const _ as usize }, + 32usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).keepcost as *const _ as usize }, + 36usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(keepcost) + ) + ); +} extern "C" { pub fn malloc_info( __must_be_zero: ::std::os::raw::c_int, @@ -7250,6 +7573,19 @@ extern "C" { extern "C" { pub fn android_res_cancel(nsend_fd: ::std::os::raw::c_int); } +extern "C" { + pub fn android_tag_socket_with_uid( + sockfd: ::std::os::raw::c_int, + tag: u32, + uid: uid_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_tag_socket(sockfd: ::std::os::raw::c_int, tag: u32) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_untag_socket(sockfd: ::std::os::raw::c_int) -> ::std::os::raw::c_int; +} impl ANativeWindow_LegacyFormat { pub const WINDOW_FORMAT_RGBA_8888: ANativeWindow_LegacyFormat = ANativeWindow_LegacyFormat(1); } @@ -8244,6 +8580,18 @@ impl OperationCode { impl OperationCode { pub const ANEURALNETWORKS_RANK: OperationCode = OperationCode(101); } +impl OperationCode { + pub const ANEURALNETWORKS_BATCH_MATMUL: OperationCode = OperationCode(102); +} +impl OperationCode { + pub const ANEURALNETWORKS_PACK: OperationCode = OperationCode(103); +} +impl OperationCode { + pub const ANEURALNETWORKS_MIRROR_PAD: OperationCode = OperationCode(104); +} +impl OperationCode { + pub const ANEURALNETWORKS_REVERSE: OperationCode = OperationCode(105); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct OperationCode(pub ::std::os::raw::c_uint); @@ -8316,6 +8664,15 @@ impl FeatureLevelCode { impl FeatureLevelCode { pub const ANEURALNETWORKS_FEATURE_LEVEL_5: FeatureLevelCode = FeatureLevelCode(31); } +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_6: FeatureLevelCode = FeatureLevelCode(1000006); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_7: FeatureLevelCode = FeatureLevelCode(1000007); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_8: FeatureLevelCode = FeatureLevelCode(1000008); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct FeatureLevelCode(pub ::std::os::raw::c_uint); @@ -9441,10 +9798,17 @@ pub const ASENSOR_TYPE_POSE_6DOF: ::std::os::raw::c_int = 28; pub const ASENSOR_TYPE_STATIONARY_DETECT: ::std::os::raw::c_int = 29; pub const ASENSOR_TYPE_MOTION_DETECT: ::std::os::raw::c_int = 30; pub const ASENSOR_TYPE_HEART_BEAT: ::std::os::raw::c_int = 31; +pub const ASENSOR_TYPE_DYNAMIC_SENSOR_META: ::std::os::raw::c_int = 32; pub const ASENSOR_TYPE_ADDITIONAL_INFO: ::std::os::raw::c_int = 33; pub const ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT: ::std::os::raw::c_int = 34; pub const ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED: ::std::os::raw::c_int = 35; pub const ASENSOR_TYPE_HINGE_ANGLE: ::std::os::raw::c_int = 36; +pub const ASENSOR_TYPE_HEAD_TRACKER: ::std::os::raw::c_int = 37; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES: ::std::os::raw::c_int = 38; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES: ::std::os::raw::c_int = 39; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 40; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 41; +pub const ASENSOR_TYPE_HEADING: ::std::os::raw::c_int = 42; pub type _bindgen_ty_38 = ::std::os::raw::c_int; pub const ASENSOR_STATUS_NO_CONTACT: ::std::os::raw::c_int = -1; pub const ASENSOR_STATUS_UNRELIABLE: ::std::os::raw::c_int = 0; @@ -10098,480 +10462,1228 @@ fn bindgen_test_layout_AAdditionalInfoEvent() { ); } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ASensorEvent { - pub version: i32, - pub sensor: i32, - pub type_: i32, - pub reserved0: i32, - pub timestamp: i64, - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, - pub flags: u32, - pub reserved1: [i32; 3usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1 { - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, - pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { - pub data: [f32; 16usize], - pub vector: ASensorVector, - pub acceleration: ASensorVector, - pub gyro: ASensorVector, - pub magnetic: ASensorVector, - pub temperature: f32, - pub distance: f32, - pub light: f32, - pub pressure: f32, - pub relative_humidity: f32, - pub uncalibrated_acceleration: AUncalibratedEvent, - pub uncalibrated_gyro: AUncalibratedEvent, - pub uncalibrated_magnetic: AUncalibratedEvent, - pub meta_data: AMetaDataEvent, - pub heart_rate: AHeartRateEvent, - pub dynamic_sensor_meta: ADynamicSensorEvent, - pub additional_info: AAdditionalInfoEvent, +#[derive(Debug, Copy, Clone)] +pub struct AHeadTrackerEvent { + pub rx: f32, + pub ry: f32, + pub rz: f32, + pub vx: f32, + pub vy: f32, + pub vz: f32, + pub discontinuity_count: i32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { +fn bindgen_test_layout_AHeadTrackerEvent() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!( - "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + ::std::mem::size_of::(), + 28usize, + concat!("Size of: ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!( - "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + concat!("Alignment of ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize - }, + unsafe { &(*(::std::ptr::null::())).rx as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(data) + stringify!(rx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).vector as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).ry as *const _ as usize }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(vector) + stringify!(ry) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).acceleration - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).rz as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(acceleration) + stringify!(rz) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).gyro as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vx as *const _ as usize }, + 12usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(gyro) + stringify!(vx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).magnetic - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vy as *const _ as usize }, + 16usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(magnetic) + stringify!(vy) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).temperature - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vz as *const _ as usize }, + 20usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(temperature) + stringify!(vz) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).distance - as *const _ as usize + &(*(::std::ptr::null::())).discontinuity_count as *const _ as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(distance) + stringify!(discontinuity_count) ) ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ALimitedAxesImuEvent { + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuEvent__bindgen_ty_2, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_1 { + pub calib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1 { + pub x: f32, + pub y: f32, + pub z: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - unsafe { - &(*(::std::ptr::null::())).light as *const _ - as usize - }, - 0usize, + ::std::mem::size_of::(), + 12usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(light) + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).pressure - as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 4usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(pressure) + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).relative_humidity + &(*(::std::ptr::null::())).x as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(relative_humidity) + stringify!(x) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_acceleration as *const _ as usize + &(*(::std::ptr::null::())).y + as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_acceleration) + stringify!(y) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).uncalibrated_gyro + &(*(::std::ptr::null::())).z as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_gyro) + stringify!(z) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_magnetic as *const _ as usize + &(*(::std::ptr::null::())).calib as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1), "::", - stringify!(uncalibrated_magnetic) + stringify!(calib) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_2 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).meta_data + &(*(::std::ptr::null::())).x_supported as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(meta_data) + stringify!(x_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).heart_rate + &(*(::std::ptr::null::())).y_supported as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(heart_rate) + stringify!(y_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).dynamic_sensor_meta + &(*(::std::ptr::null::())).z_supported as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(dynamic_sensor_meta) + stringify!(z_supported) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).additional_info - as *const _ as usize + &(*(::std::ptr::null::())).supported as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2), "::", - stringify!(additional_info) + stringify!(supported) ) ); } +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ALimitedAxesImuEvent)) + ); +} #[repr(C)] #[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { - pub data: [u64; 8usize], - pub step_counter: u64, +pub struct ALimitedAxesImuUncalibratedEvent { + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2, + pub __bindgen_anon_3: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_1 { + pub uncalib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1 { + pub x_uncalib: f32, + pub y_uncalib: f32, + pub z_uncalib: f32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, + ::std::mem::size_of::(), + 12usize, concat!( "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - ::std::mem::align_of::(), - 8usize, + ::std::mem::align_of::(), + 4usize, concat!( "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize + &(*(::std::ptr::null::())) + .x_uncalib as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(data) + stringify!(x_uncalib) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).step_counter - as *const _ as usize + &(*(::std::ptr::null::())) + .y_uncalib as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(step_counter) + stringify!(y_uncalib) ) ); -} -#[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + unsafe { + &(*(::std::ptr::null::())) + .z_uncalib as *const _ as usize + }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(z_uncalib) + ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalib + as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1), "::", - stringify!(u64_) + stringify!(uncalib) ) ); } +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_2 { + pub bias: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_bias: f32, + pub y_bias: f32, + pub z_bias: f32, +} #[test] -fn bindgen_test_layout_ASensorEvent() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 104usize, - concat!("Size of: ", stringify!(ASensorEvent)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ASensorEvent)) + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .x_bias as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(version) + stringify!(x_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .y_bias as *const _ as usize + }, 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(sensor) + stringify!(y_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .z_bias as *const _ as usize + }, 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(type_) + stringify!(z_bias) ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2() { assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + ::std::mem::size_of::(), 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).bias + as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2), "::", - stringify!(reserved0) + stringify!(bias) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_3 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, - 16usize, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .x_supported as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(timestamp) + stringify!(x_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, - 88usize, + unsafe { + &(*(::std::ptr::null::())) + .y_supported as *const _ as usize + }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(flags) + stringify!(y_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, - 92usize, + unsafe { + &(*(::std::ptr::null::())) + .z_supported as *const _ as usize + }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(reserved1) + stringify!(z_supported) ) ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorManager { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).supported + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3), + "::", + stringify!(supported) + ) + ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorEventQueue { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent() { + assert_eq!( + ::std::mem::size_of::(), + 36usize, + concat!("Size of: ", stringify!(ALimitedAxesImuUncalibratedEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent) + ) + ); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ASensor { - _unused: [u8; 0], +pub struct AHeadingEvent { + pub heading: f32, + pub accuracy: f32, } -pub type ASensorRef = *const ASensor; -pub type ASensorList = *const ASensorRef; -extern "C" { - pub fn ASensorManager_getInstance() -> *mut ASensorManager; +#[test] +fn bindgen_test_layout_AHeadingEvent() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(AHeadingEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(AHeadingEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).heading as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(heading) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).accuracy as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(accuracy) + ) + ); } -extern "C" { - pub fn ASensorManager_getInstanceForPackage( - packageName: *const ::std::os::raw::c_char, - ) -> *mut ASensorManager; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ASensorEvent { + pub version: i32, + pub sensor: i32, + pub type_: i32, + pub reserved0: i32, + pub timestamp: i64, + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, + pub flags: u32, + pub reserved1: [i32; 3usize], } -extern "C" { - pub fn ASensorManager_getSensorList( - manager: *mut ASensorManager, - list: *mut ASensorList, - ) -> ::std::os::raw::c_int; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1 { + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, + pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, } -extern "C" { - pub fn ASensorManager_getDefaultSensor( - manager: *mut ASensorManager, - type_: ::std::os::raw::c_int, - ) -> *const ASensor; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { + pub data: [f32; 16usize], + pub vector: ASensorVector, + pub acceleration: ASensorVector, + pub gyro: ASensorVector, + pub magnetic: ASensorVector, + pub temperature: f32, + pub distance: f32, + pub light: f32, + pub pressure: f32, + pub relative_humidity: f32, + pub uncalibrated_acceleration: AUncalibratedEvent, + pub uncalibrated_gyro: AUncalibratedEvent, + pub uncalibrated_magnetic: AUncalibratedEvent, + pub meta_data: AMetaDataEvent, + pub heart_rate: AHeartRateEvent, + pub dynamic_sensor_meta: ADynamicSensorEvent, + pub additional_info: AAdditionalInfoEvent, + pub head_tracker: AHeadTrackerEvent, + pub limited_axes_imu: ALimitedAxesImuEvent, + pub limited_axes_imu_uncalibrated: ALimitedAxesImuUncalibratedEvent, + pub heading: AHeadingEvent, } -extern "C" { - pub fn ASensorManager_getDefaultSensorEx( +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).vector as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(vector) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).acceleration + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).gyro as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).magnetic + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).temperature + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(temperature) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).distance + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(distance) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).light as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(light) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).pressure + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(pressure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).relative_humidity + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(relative_humidity) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_acceleration as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalibrated_gyro + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_magnetic as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).meta_data + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(meta_data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heart_rate + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heart_rate) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).dynamic_sensor_meta + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(dynamic_sensor_meta) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).additional_info + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(additional_info) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).head_tracker + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(head_tracker) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).limited_axes_imu + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .limited_axes_imu_uncalibrated as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu_uncalibrated) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heading as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heading) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { + pub data: [u64; 8usize], + pub step_counter: u64, +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).step_counter + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(step_counter) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1), + "::", + stringify!(u64_) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent() { + assert_eq!( + ::std::mem::size_of::(), + 104usize, + concat!("Size of: ", stringify!(ASensorEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ASensorEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(version) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(sensor) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved0) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(timestamp) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, + 88usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(flags) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, + 92usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved1) + ) + ); +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorManager { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorEventQueue { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensor { + _unused: [u8; 0], +} +pub type ASensorRef = *const ASensor; +pub type ASensorList = *const ASensorRef; +extern "C" { + pub fn ASensorManager_getInstance() -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getInstanceForPackage( + packageName: *const ::std::os::raw::c_char, + ) -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn ASensorManager_getDynamicSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ssize_t; +} +extern "C" { + pub fn ASensorManager_getDefaultSensor( + manager: *mut ASensorManager, + type_: ::std::os::raw::c_int, + ) -> *const ASensor; +} +extern "C" { + pub fn ASensorManager_getDefaultSensorEx( manager: *mut ASensorManager, type_: ::std::os::raw::c_int, wakeUp: bool, @@ -14536,23 +15648,81 @@ pub const AAUDIO_CONTENT_TYPE_MOVIE: ::std::os::raw::c_uint = 3; pub const AAUDIO_CONTENT_TYPE_SONIFICATION: ::std::os::raw::c_uint = 4; pub type _bindgen_ty_54 = ::std::os::raw::c_uint; pub type aaudio_content_type_t = i32; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_AUTO: ::std::os::raw::c_uint = 1; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_NEVER: ::std::os::raw::c_uint = 2; +pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type aaudio_spatialization_behavior_t = i32; pub const AAUDIO_INPUT_PRESET_GENERIC: ::std::os::raw::c_uint = 1; pub const AAUDIO_INPUT_PRESET_CAMCORDER: ::std::os::raw::c_uint = 5; pub const AAUDIO_INPUT_PRESET_VOICE_RECOGNITION: ::std::os::raw::c_uint = 6; pub const AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION: ::std::os::raw::c_uint = 7; pub const AAUDIO_INPUT_PRESET_UNPROCESSED: ::std::os::raw::c_uint = 9; pub const AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE: ::std::os::raw::c_uint = 10; -pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type _bindgen_ty_56 = ::std::os::raw::c_uint; pub type aaudio_input_preset_t = i32; pub const AAUDIO_ALLOW_CAPTURE_BY_ALL: ::std::os::raw::c_uint = 1; pub const AAUDIO_ALLOW_CAPTURE_BY_SYSTEM: ::std::os::raw::c_uint = 2; pub const AAUDIO_ALLOW_CAPTURE_BY_NONE: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_56 = ::std::os::raw::c_uint; +pub type _bindgen_ty_57 = ::std::os::raw::c_uint; pub type aaudio_allowed_capture_policy_t = i32; pub const AAUDIO_SESSION_ID_NONE: ::std::os::raw::c_int = -1; pub const AAUDIO_SESSION_ID_ALLOCATE: ::std::os::raw::c_int = 0; -pub type _bindgen_ty_57 = ::std::os::raw::c_int; +pub type _bindgen_ty_58 = ::std::os::raw::c_int; pub type aaudio_session_id_t = i32; +pub const AAUDIO_CHANNEL_INVALID: ::std::os::raw::c_int = -1; +pub const AAUDIO_CHANNEL_FRONT_LEFT: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_FRONT_RIGHT: ::std::os::raw::c_int = 2; +pub const AAUDIO_CHANNEL_FRONT_CENTER: ::std::os::raw::c_int = 4; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY: ::std::os::raw::c_int = 8; +pub const AAUDIO_CHANNEL_BACK_LEFT: ::std::os::raw::c_int = 16; +pub const AAUDIO_CHANNEL_BACK_RIGHT: ::std::os::raw::c_int = 32; +pub const AAUDIO_CHANNEL_FRONT_LEFT_OF_CENTER: ::std::os::raw::c_int = 64; +pub const AAUDIO_CHANNEL_FRONT_RIGHT_OF_CENTER: ::std::os::raw::c_int = 128; +pub const AAUDIO_CHANNEL_BACK_CENTER: ::std::os::raw::c_int = 256; +pub const AAUDIO_CHANNEL_SIDE_LEFT: ::std::os::raw::c_int = 512; +pub const AAUDIO_CHANNEL_SIDE_RIGHT: ::std::os::raw::c_int = 1024; +pub const AAUDIO_CHANNEL_TOP_CENTER: ::std::os::raw::c_int = 2048; +pub const AAUDIO_CHANNEL_TOP_FRONT_LEFT: ::std::os::raw::c_int = 4096; +pub const AAUDIO_CHANNEL_TOP_FRONT_CENTER: ::std::os::raw::c_int = 8192; +pub const AAUDIO_CHANNEL_TOP_FRONT_RIGHT: ::std::os::raw::c_int = 16384; +pub const AAUDIO_CHANNEL_TOP_BACK_LEFT: ::std::os::raw::c_int = 32768; +pub const AAUDIO_CHANNEL_TOP_BACK_CENTER: ::std::os::raw::c_int = 65536; +pub const AAUDIO_CHANNEL_TOP_BACK_RIGHT: ::std::os::raw::c_int = 131072; +pub const AAUDIO_CHANNEL_TOP_SIDE_LEFT: ::std::os::raw::c_int = 262144; +pub const AAUDIO_CHANNEL_TOP_SIDE_RIGHT: ::std::os::raw::c_int = 524288; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_LEFT: ::std::os::raw::c_int = 1048576; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_CENTER: ::std::os::raw::c_int = 2097152; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_RIGHT: ::std::os::raw::c_int = 4194304; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY_2: ::std::os::raw::c_int = 8388608; +pub const AAUDIO_CHANNEL_FRONT_WIDE_LEFT: ::std::os::raw::c_int = 16777216; +pub const AAUDIO_CHANNEL_FRONT_WIDE_RIGHT: ::std::os::raw::c_int = 33554432; +pub const AAUDIO_CHANNEL_MONO: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_STEREO: ::std::os::raw::c_int = 3; +pub const AAUDIO_CHANNEL_2POINT1: ::std::os::raw::c_int = 11; +pub const AAUDIO_CHANNEL_TRI: ::std::os::raw::c_int = 7; +pub const AAUDIO_CHANNEL_TRI_BACK: ::std::os::raw::c_int = 259; +pub const AAUDIO_CHANNEL_3POINT1: ::std::os::raw::c_int = 15; +pub const AAUDIO_CHANNEL_2POINT0POINT2: ::std::os::raw::c_int = 786435; +pub const AAUDIO_CHANNEL_2POINT1POINT2: ::std::os::raw::c_int = 786443; +pub const AAUDIO_CHANNEL_3POINT0POINT2: ::std::os::raw::c_int = 786439; +pub const AAUDIO_CHANNEL_3POINT1POINT2: ::std::os::raw::c_int = 786447; +pub const AAUDIO_CHANNEL_QUAD: ::std::os::raw::c_int = 51; +pub const AAUDIO_CHANNEL_QUAD_SIDE: ::std::os::raw::c_int = 1539; +pub const AAUDIO_CHANNEL_SURROUND: ::std::os::raw::c_int = 263; +pub const AAUDIO_CHANNEL_PENTA: ::std::os::raw::c_int = 55; +pub const AAUDIO_CHANNEL_5POINT1: ::std::os::raw::c_int = 63; +pub const AAUDIO_CHANNEL_5POINT1_SIDE: ::std::os::raw::c_int = 1551; +pub const AAUDIO_CHANNEL_6POINT1: ::std::os::raw::c_int = 319; +pub const AAUDIO_CHANNEL_7POINT1: ::std::os::raw::c_int = 1599; +pub const AAUDIO_CHANNEL_5POINT1POINT2: ::std::os::raw::c_int = 786495; +pub const AAUDIO_CHANNEL_5POINT1POINT4: ::std::os::raw::c_int = 184383; +pub const AAUDIO_CHANNEL_7POINT1POINT2: ::std::os::raw::c_int = 788031; +pub const AAUDIO_CHANNEL_7POINT1POINT4: ::std::os::raw::c_int = 185919; +pub const AAUDIO_CHANNEL_9POINT1POINT4: ::std::os::raw::c_int = 50517567; +pub const AAUDIO_CHANNEL_9POINT1POINT6: ::std::os::raw::c_int = 51303999; +pub const AAUDIO_CHANNEL_FRONT_BACK: ::std::os::raw::c_int = 260; +pub type _bindgen_ty_59 = ::std::os::raw::c_int; +pub type aaudio_channel_mask_t = u32; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AAudioStreamStruct { @@ -14646,6 +15816,18 @@ extern "C" { contentType: aaudio_content_type_t, ); } +extern "C" { + pub fn AAudioStreamBuilder_setSpatializationBehavior( + builder: *mut AAudioStreamBuilder, + spatializationBehavior: aaudio_spatialization_behavior_t, + ); +} +extern "C" { + pub fn AAudioStreamBuilder_setIsContentSpatialized( + builder: *mut AAudioStreamBuilder, + isSpatialized: bool, + ); +} extern "C" { pub fn AAudioStreamBuilder_setInputPreset( builder: *mut AAudioStreamBuilder, @@ -14672,7 +15854,7 @@ extern "C" { } pub const AAUDIO_CALLBACK_RESULT_CONTINUE: ::std::os::raw::c_uint = 0; pub const AAUDIO_CALLBACK_RESULT_STOP: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_58 = ::std::os::raw::c_uint; +pub type _bindgen_ty_60 = ::std::os::raw::c_uint; pub type aaudio_data_callback_result_t = i32; pub type AAudioStream_dataCallback = ::std::option::Option< unsafe extern "C" fn( @@ -14718,6 +15900,12 @@ extern "C" { extern "C" { pub fn AAudioStreamBuilder_delete(builder: *mut AAudioStreamBuilder) -> aaudio_result_t; } +extern "C" { + pub fn AAudioStreamBuilder_setChannelMask( + builder: *mut AAudioStreamBuilder, + channelMask: aaudio_channel_mask_t, + ); +} extern "C" { pub fn AAudioStream_release(stream: *mut AAudioStream) -> aaudio_result_t; } @@ -14831,6 +16019,14 @@ extern "C" { extern "C" { pub fn AAudioStream_getContentType(stream: *mut AAudioStream) -> aaudio_content_type_t; } +extern "C" { + pub fn AAudioStream_getSpatializationBehavior( + stream: *mut AAudioStream, + ) -> aaudio_spatialization_behavior_t; +} +extern "C" { + pub fn AAudioStream_isContentSpatialized(stream: *mut AAudioStream) -> bool; +} extern "C" { pub fn AAudioStream_getInputPreset(stream: *mut AAudioStream) -> aaudio_input_preset_t; } @@ -14842,6 +16038,9 @@ extern "C" { extern "C" { pub fn AAudioStream_isPrivacySensitive(stream: *mut AAudioStream) -> bool; } +extern "C" { + pub fn AAudioStream_getChannelMask(stream: *mut AAudioStream) -> aaudio_channel_mask_t; +} impl media_status_t { pub const AMEDIA_OK: media_status_t = media_status_t(0); } @@ -14949,11 +16148,43 @@ pub struct AMidiOutputPort { } pub const AMIDI_OPCODE_DATA: ::std::os::raw::c_uint = 1; pub const AMIDI_OPCODE_FLUSH: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_59 = ::std::os::raw::c_uint; +pub type _bindgen_ty_61 = ::std::os::raw::c_uint; pub const AMIDI_DEVICE_TYPE_USB: ::std::os::raw::c_uint = 1; pub const AMIDI_DEVICE_TYPE_VIRTUAL: ::std::os::raw::c_uint = 2; pub const AMIDI_DEVICE_TYPE_BLUETOOTH: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_60 = ::std::os::raw::c_uint; +pub type _bindgen_ty_62 = ::std::os::raw::c_uint; +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_USE_MIDI_CI: AMidiDevice_Protocol = AMidiDevice_Protocol(0); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(1); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(2); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(3); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(4); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0: AMidiDevice_Protocol = AMidiDevice_Protocol(17); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(18); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UNKNOWN: AMidiDevice_Protocol = AMidiDevice_Protocol(-1); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMidiDevice_Protocol(pub i32); extern "C" { pub fn AMidiDevice_fromJava( env: *mut JNIEnv, @@ -14973,6 +16204,9 @@ extern "C" { extern "C" { pub fn AMidiDevice_getNumOutputPorts(device: *const AMidiDevice) -> ssize_t; } +extern "C" { + pub fn AMidiDevice_getDefaultProtocol(device: *const AMidiDevice) -> AMidiDevice_Protocol; +} extern "C" { pub fn AMidiOutputPort_open( device: *const AMidiDevice, @@ -15167,7 +16401,13 @@ impl acamera_metadata_section { pub const ACAMERA_HEIC_INFO: acamera_metadata_section = acamera_metadata_section(29); } impl acamera_metadata_section { - pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(30); + pub const ACAMERA_AUTOMOTIVE: acamera_metadata_section = acamera_metadata_section(30); +} +impl acamera_metadata_section { + pub const ACAMERA_AUTOMOTIVE_LENS: acamera_metadata_section = acamera_metadata_section(31); +} +impl acamera_metadata_section { + pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(32); } impl acamera_metadata_section { pub const ACAMERA_VENDOR: acamera_metadata_section = acamera_metadata_section(32768); @@ -15296,6 +16536,14 @@ impl acamera_metadata_section_start { pub const ACAMERA_HEIC_INFO_START: acamera_metadata_section_start = acamera_metadata_section_start(1900544); } +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_START: acamera_metadata_section_start = + acamera_metadata_section_start(1966080); +} +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_LENS_START: acamera_metadata_section_start = + acamera_metadata_section_start(2031616); +} impl acamera_metadata_section_start { pub const ACAMERA_VENDOR_START: acamera_metadata_section_start = acamera_metadata_section_start(-2147483648); @@ -15502,7 +16750,15 @@ impl acamera_metadata_tag { pub const ACAMERA_FLASH_INFO_AVAILABLE: acamera_metadata_tag = acamera_metadata_tag(327680); } impl acamera_metadata_tag { - pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327681); + pub const ACAMERA_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327682); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_STRENGTH_DEFAULT_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327683); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327684); } impl acamera_metadata_tag { pub const ACAMERA_HOT_PIXEL_MODE: acamera_metadata_tag = acamera_metadata_tag(393216); @@ -15683,7 +16939,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(786449); } impl acamera_metadata_tag { - pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786450); + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP: acamera_metadata_tag = + acamera_metadata_tag(786451); +} +impl acamera_metadata_tag { + pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786452); } impl acamera_metadata_tag { pub const ACAMERA_SCALER_CROP_REGION: acamera_metadata_tag = acamera_metadata_tag(851968); @@ -15747,7 +17007,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(851992); } impl acamera_metadata_tag { - pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851993); + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES: acamera_metadata_tag = + acamera_metadata_tag(851993); +} +impl acamera_metadata_tag { + pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851994); } impl acamera_metadata_tag { pub const ACAMERA_SENSOR_EXPOSURE_TIME: acamera_metadata_tag = acamera_metadata_tag(917504); @@ -16032,7 +17296,11 @@ impl acamera_metadata_tag { pub const ACAMERA_INFO_VERSION: acamera_metadata_tag = acamera_metadata_tag(1376257); } impl acamera_metadata_tag { - pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376258); + pub const ACAMERA_INFO_DEVICE_STATE_ORIENTATIONS: acamera_metadata_tag = + acamera_metadata_tag(1376259); +} +impl acamera_metadata_tag { + pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376260); } impl acamera_metadata_tag { pub const ACAMERA_BLACK_LEVEL_LOCK: acamera_metadata_tag = acamera_metadata_tag(1441792); @@ -16163,6 +17431,18 @@ impl acamera_metadata_tag { impl acamera_metadata_tag { pub const ACAMERA_HEIC_END: acamera_metadata_tag = acamera_metadata_tag(1835014); } +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LOCATION: acamera_metadata_tag = acamera_metadata_tag(1966080); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_END: acamera_metadata_tag = acamera_metadata_tag(1966081); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING: acamera_metadata_tag = acamera_metadata_tag(2031616); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_END: acamera_metadata_tag = acamera_metadata_tag(2031617); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_tag(pub ::std::os::raw::c_uint); @@ -16601,6 +17881,11 @@ impl acamera_metadata_enum_acamera_control_video_stabilization_mode { acamera_metadata_enum_acamera_control_video_stabilization_mode = acamera_metadata_enum_acamera_control_video_stabilization_mode(1); } +impl acamera_metadata_enum_acamera_control_video_stabilization_mode { + pub const ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION: + acamera_metadata_enum_acamera_control_video_stabilization_mode = + acamera_metadata_enum_acamera_control_video_stabilization_mode(2); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_control_video_stabilization_mode( @@ -16915,6 +18200,11 @@ impl acamera_metadata_enum_acamera_lens_pose_reference { acamera_metadata_enum_acamera_lens_pose_reference = acamera_metadata_enum_acamera_lens_pose_reference(2); } +impl acamera_metadata_enum_acamera_lens_pose_reference { + pub const ACAMERA_LENS_POSE_REFERENCE_AUTOMOTIVE: + acamera_metadata_enum_acamera_lens_pose_reference = + acamera_metadata_enum_acamera_lens_pose_reference(3); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_lens_pose_reference(pub ::std::os::raw::c_uint); @@ -17033,10 +18323,86 @@ impl acamera_metadata_enum_acamera_request_available_capabilities { acamera_metadata_enum_acamera_request_available_capabilities = acamera_metadata_enum_acamera_request_available_capabilities(16); } +impl acamera_metadata_enum_acamera_request_available_capabilities { + pub const ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE: + acamera_metadata_enum_acamera_request_available_capabilities = + acamera_metadata_enum_acamera_request_available_capabilities(19); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_request_available_capabilities(pub ::std::os::raw::c_uint); pub use self::acamera_metadata_enum_acamera_request_available_capabilities as acamera_metadata_enum_android_request_available_capabilities_t; +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HLG10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10_PLUS: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(8); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(16); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(32); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(64); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(128); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(256); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(512); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1024); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2048); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_MAX: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4096); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map as acamera_metadata_enum_android_request_available_dynamic_range_profiles_map_t; impl acamera_metadata_enum_acamera_scaler_available_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT: acamera_metadata_enum_acamera_scaler_available_stream_configurations = @@ -17107,6 +18473,16 @@ impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configura acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(7); } +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_10BIT_OUTPUT: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(8); +} +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PUBLIC_END_3_8: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(9); +} impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VENDOR_START: acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = @@ -17199,6 +18575,42 @@ pub struct acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supporte pub ::std::os::raw::c_uint, ); pub use self::acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supported as acamera_metadata_enum_android_scaler_multi_resolution_stream_supported_t; +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(0); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(1); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(2); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(3); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(4); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(5); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_scaler_available_stream_use_cases( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_scaler_available_stream_use_cases as acamera_metadata_enum_android_scaler_available_stream_use_cases_t; impl acamera_metadata_enum_acamera_sensor_reference_illuminant1 { pub const ACAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT: acamera_metadata_enum_acamera_sensor_reference_illuminant1 = @@ -17765,832 +19177,1386 @@ impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_max 0, ); } -impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { - pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - 1, - ); +impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { + pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + 1, + ); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_INTERIOR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(0); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(1); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(2); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(3); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(4); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(5); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(6); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(7); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(8); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(9); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(10); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_location(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_location as acamera_metadata_enum_android_automotive_location_t; +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(0); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(1); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(2); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(3); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(4); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(5); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(6); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(7); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(8); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(9); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(10); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(11); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(12); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(13); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(14); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_lens_facing(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_lens_facing as acamera_metadata_enum_android_automotive_lens_facing_t; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata { + _unused: [u8; 0], +} +pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; +pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; +pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; +pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; +pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; +pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; +pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; +pub type _bindgen_ty_63 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata_rational { + pub numerator: i32, + pub denominator: i32, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_rational() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).numerator as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(numerator) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).denominator as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(denominator) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ACameraMetadata_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_entry__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ACameraMetadata_entry__bindgen_ty_1 { + pub u8_: *mut u8, + pub i32_: *mut i32, + pub f: *mut f32, + pub i64_: *mut i64, + pub d: *mut f64, + pub r: *mut ACameraMetadata_rational, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 4usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ACameraMetadata_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry() { + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(count) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(data) + ) + ); } -#[repr(transparent)] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - pub ::std::os::raw::c_uint, -); -pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct ACameraMetadata_const_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_const_entry__bindgen_ty_1, } -pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; -pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; -pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; -pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; -pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; -pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; -pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; -pub type _bindgen_ty_61 = ::std::os::raw::c_uint; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata_rational { - pub numerator: i32, - pub denominator: i32, +#[derive(Copy, Clone)] +pub union ACameraMetadata_const_entry__bindgen_ty_1 { + pub u8_: *const u8, + pub i32_: *const i32, + pub f: *const f32, + pub i64_: *const i64, + pub d: *const f64, + pub r: *const ACameraMetadata_rational, } #[test] -fn bindgen_test_layout_ACameraMetadata_rational() { +fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 8usize, - concat!("Size of: ", stringify!(ACameraMetadata_rational)) + ::std::mem::size_of::(), + 4usize, + concat!( + "Size of: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + concat!( + "Alignment of ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).numerator as *const _ as usize + &(*(::std::ptr::null::())).u8_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_const_entry() { + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).type_ as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).count as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(numerator) + stringify!(count) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).denominator as *const _ as usize + &(*(::std::ptr::null::())).data as *const _ as usize }, - 4usize, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(denominator) + stringify!(data) ) ); } +extern "C" { + pub fn ACameraMetadata_getConstEntry( + metadata: *const ACameraMetadata, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_getAllTags( + metadata: *const ACameraMetadata, + numEntries: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; +} +extern "C" { + pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); +} +extern "C" { + pub fn ACameraMetadata_isLogicalMultiCamera( + staticMetadata: *const ACameraMetadata, + numPhysicalCameras: *mut size_t, + physicalCameraIds: *mut *const *const ::std::os::raw::c_char, + ) -> bool; +} +extern "C" { + pub fn ACameraMetadata_fromCameraMetadata( + env: *mut JNIEnv, + cameraMetadata: jobject, + ) -> *mut ACameraMetadata; +} +pub type ACameraWindowType = ANativeWindow; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_entry__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTargets { + _unused: [u8; 0], } #[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_entry__bindgen_ty_1 { - pub u8_: *mut u8, - pub i32_: *mut i32, - pub f: *mut f32, - pub i64_: *mut i64, - pub d: *mut f64, - pub r: *mut ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTarget { + _unused: [u8; 0], } -#[test] -fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { - assert_eq!( - ::std::mem::size_of::(), - 4usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) - ); +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACaptureRequest { + _unused: [u8; 0], +} +extern "C" { + pub fn ACameraOutputTarget_create( + window: *mut ACameraWindowType, + output: *mut *mut ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); +} +extern "C" { + pub fn ACaptureRequest_addTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_removeTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry( + request: *const ACaptureRequest, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getAllTags( + request: *const ACaptureRequest, + numTags: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_u8( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i32( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_float( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i64( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_double( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_rational( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_free(request: *mut ACaptureRequest); +} +extern "C" { + pub fn ACaptureRequest_setUserContext( + request: *mut ACaptureRequest, + context: *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getUserContext( + request: *const ACaptureRequest, + context: *mut *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry_physicalCamera( + request: *const ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_u8( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i32( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_float( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i64( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_double( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_rational( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession { + _unused: [u8; 0], +} +pub type ACameraCaptureSession_stateCallback = ::std::option::Option< + unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_stateCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onClosed: ACameraCaptureSession_stateCallback, + pub onReady: ACameraCaptureSession_stateCallback, + pub onActive: ACameraCaptureSession_stateCallback, +} +#[test] +fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { assert_eq!( - ::std::mem::align_of::(), - 4usize, + ::std::mem::size_of::(), + 16usize, concat!( - "Alignment of ", - stringify!(ACameraMetadata_entry__bindgen_ty_1) + "Size of: ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 4usize, concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(u8_) + "Alignment of ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(i32_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).f as *const _ as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ + &(*(::std::ptr::null::())).onClosed as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(i64_) + stringify!(onClosed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ as usize + &(*(::std::ptr::null::())).onReady as *const _ + as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(d) + stringify!(onReady) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ as usize + &(*(::std::ptr::null::())).onActive as *const _ + as usize }, - 0usize, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(r) + stringify!(onActive) ) ); } +pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; +pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; +pub type _bindgen_ty_64 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureFailure { + pub frameNumber: i64, + pub reason: ::std::os::raw::c_int, + pub sequenceId: ::std::os::raw::c_int, + pub wasImageCaptured: bool, +} #[test] -fn bindgen_test_layout_ACameraMetadata_entry() { +fn bindgen_test_layout_ACameraCaptureFailure() { assert_eq!( - ::std::mem::size_of::(), - 16usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry)) + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - ::std::mem::align_of::(), - 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).frameNumber as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(tag) + stringify!(frameNumber) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, - 4usize, + unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(type_) + stringify!(reason) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())).sequenceId as *const _ as usize + }, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(count) + stringify!(sequenceId) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, - 12usize, + unsafe { + &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + }, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(data) + stringify!(wasImageCaptured) ) ); } +pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *const ACaptureRequest, + timestamp: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + ), +>; +pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ACameraCaptureFailure, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + frameNumber: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + ), +>; +pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + window: *mut ACameraWindowType, + frameNumber: i64, + ), +>; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_const_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_const_entry__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_const_entry__bindgen_ty_1 { - pub u8_: *const u8, - pub i32_: *const i32, - pub f: *const f32, - pub i64_: *const i64, - pub d: *const f64, - pub r: *const ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_captureCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, + pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { assert_eq!( - ::std::mem::size_of::(), - 4usize, + ::std::mem::size_of::(), + 32usize, concat!( "Size of: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(u8_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(i32_) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).f as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureStarted + as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(i64_) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureProgressed + as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(d) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureCompleted + as *const _ as usize }, - 0usize, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(r) + stringify!(onCaptureCompleted) ) ); -} -#[test] -fn bindgen_test_layout_ACameraMetadata_const_entry() { assert_eq!( - ::std::mem::size_of::(), + unsafe { + &(*(::std::ptr::null::())).onCaptureFailed + as *const _ as usize + }, 16usize, - concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) - ); - assert_eq!( - ::std::mem::align_of::(), - 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, - 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(tag) + stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).type_ as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize }, - 4usize, + 20usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(type_) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).count as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 8usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(count) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ as usize + &(*(::std::ptr::null::())).onCaptureBufferLost + as *const _ as usize }, - 12usize, + 28usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(data) + stringify!(onCaptureBufferLost) ) ); } +pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; +pub type _bindgen_ty_65 = ::std::os::raw::c_int; extern "C" { - pub fn ACameraMetadata_getConstEntry( - metadata: *const ACameraMetadata, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_getAllTags( - metadata: *const ACameraMetadata, - numEntries: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; -} -extern "C" { - pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); -} -extern "C" { - pub fn ACameraMetadata_isLogicalMultiCamera( - staticMetadata: *const ACameraMetadata, - numPhysicalCameras: *mut size_t, - physicalCameraIds: *mut *const *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn ACameraMetadata_fromCameraMetadata( - env: *mut JNIEnv, - cameraMetadata: jobject, - ) -> *mut ACameraMetadata; -} -pub type ACameraWindowType = ANativeWindow; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTargets { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTarget { - _unused: [u8; 0], + pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACaptureRequest { +pub struct ACameraDevice { _unused: [u8; 0], } extern "C" { - pub fn ACameraOutputTarget_create( - window: *mut ACameraWindowType, - output: *mut *mut ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); -} -extern "C" { - pub fn ACaptureRequest_addTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_removeTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry( - request: *const ACaptureRequest, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getAllTags( - request: *const ACaptureRequest, - numTags: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_u8( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i32( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_float( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i64( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_double( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_rational( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_free(request: *mut ACaptureRequest); -} -extern "C" { - pub fn ACaptureRequest_setUserContext( - request: *mut ACaptureRequest, - context: *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getUserContext( - request: *const ACaptureRequest, - context: *mut *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry_physicalCamera( - request: *const ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_u8( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i32( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i32, + pub fn ACameraCaptureSession_getDevice( + session: *mut ACameraCaptureSession, + device: *mut *mut ACameraDevice, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_float( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f32, + pub fn ACameraCaptureSession_capture( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i64( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i64, + pub fn ACameraCaptureSession_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_double( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f64, + pub fn ACameraCaptureSession_stopRepeating( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_rational( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, + pub fn ACameraCaptureSession_abortCaptures( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession { +pub struct ACaptureSessionOutput { _unused: [u8; 0], } -pub type ACameraCaptureSession_stateCallback = ::std::option::Option< - unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +extern "C" { + pub fn ACameraCaptureSession_updateSharedOutput( + session: *mut ACameraCaptureSession, + output: *mut ACaptureSessionOutput, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + physicalResultCount: size_t, + physicalCameraIds: *mut *const ::std::os::raw::c_char, + physicalResults: *mut *const ACameraMetadata, + ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_stateCallbacks { +pub struct ALogicalCameraCaptureFailure { + pub captureFailure: ACameraCaptureFailure, + pub physicalCameraId: *const ::std::os::raw::c_char, +} +#[test] +fn bindgen_test_layout_ALogicalCameraCaptureFailure() { + assert_eq!( + ::std::mem::size_of::(), + 32usize, + concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).captureFailure as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(captureFailure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).physicalCameraId as *const _ + as usize + }, + 24usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(physicalCameraId) + ) + ); +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ALogicalCameraCaptureFailure, + ), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { pub context: *mut ::std::os::raw::c_void, - pub onClosed: ACameraCaptureSession_stateCallback, - pub onReady: ACameraCaptureSession_stateCallback, - pub onActive: ACameraCaptureSession_stateCallback, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, + pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { assert_eq!( - ::std::mem::size_of::(), - 16usize, + ::std::mem::size_of::(), + 32usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ - as usize + &(*(::std::ptr::null::())).context + as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onClosed as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureStarted as *const _ as usize }, 4usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onClosed) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onReady as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureProgressed as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onReady) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onActive as *const _ - as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureCompleted as *const _ as usize }, 12usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onActive) + stringify!(onLogicalCameraCaptureCompleted) ) ); -} -pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; -pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_62 = ::std::os::raw::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureFailure { - pub frameNumber: i64, - pub reason: ::std::os::raw::c_int, - pub sequenceId: ::std::os::raw::c_int, - pub wasImageCaptured: bool, -} -#[test] -fn bindgen_test_layout_ACameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(ACameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ACameraCaptureFailure)) - ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).frameNumber as *const _ as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureFailed as *const _ as usize }, - 0usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(frameNumber) + stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize + }, + 20usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(reason) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).sequenceId as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 12usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(sequenceId) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureBufferLost as *const _ as usize }, - 16usize, + 28usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(wasImageCaptured) + stringify!(onCaptureBufferLost) ) - ); -} -pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *const ACaptureRequest, - timestamp: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - ), ->; -pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ACameraCaptureFailure, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - frameNumber: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, + ); +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_capture( session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - ), ->; -pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_captureCallback_startV2 = ::std::option::Option< unsafe extern "C" fn( context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - window: *mut ACameraWindowType, + request: *const ACaptureRequest, + timestamp: i64, frameNumber: i64, ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_captureCallbacks { +pub struct ACameraCaptureSession_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, @@ -18599,252 +20565,133 @@ pub struct ACameraCaptureSession_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 32usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureStarted + &(*(::std::ptr::null::())).onCaptureStarted as *const _ as usize }, 4usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureProgressed + &(*(::std::ptr::null::())).onCaptureProgressed as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureCompleted + &(*(::std::ptr::null::())).onCaptureCompleted as *const _ as usize }, 12usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureFailed + &(*(::std::ptr::null::())).onCaptureFailed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 20usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureBufferLost + &(*(::std::ptr::null::())).onCaptureBufferLost as *const _ as usize }, 28usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } -pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_63 = ::std::os::raw::c_int; -extern "C" { - pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraDevice { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_getDevice( - session: *mut ACameraCaptureSession, - device: *mut *mut ACameraDevice, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_capture( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_setRepeatingRequest( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_stopRepeating( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_abortCaptures( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACaptureSessionOutput { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_updateSharedOutput( - session: *mut ACameraCaptureSession, - output: *mut ACaptureSessionOutput, - ) -> camera_status_t; -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - physicalResultCount: size_t, - physicalCameraIds: *mut *const ::std::os::raw::c_char, - physicalResults: *mut *const ACameraMetadata, - ), ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ALogicalCameraCaptureFailure { - pub captureFailure: ACameraCaptureFailure, - pub physicalCameraId: *const ::std::os::raw::c_char, -} -#[test] -fn bindgen_test_layout_ALogicalCameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 32usize, - concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).captureFailure as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(captureFailure) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).physicalCameraId as *const _ - as usize - }, - 24usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(physicalCameraId) - ) - ); -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ALogicalCameraCaptureFailure, - ), ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { +pub struct ACameraCaptureSession_logicalCamera_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, @@ -18853,141 +20700,159 @@ pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 32usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context - as *const _ as usize + &(*(::std::ptr::null::())) + .context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureStarted as *const _ as usize }, 4usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureProgressed as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureCompleted as *const _ as usize }, 12usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureFailed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 20usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureBufferLost as *const _ as usize }, 28usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_capture( + pub fn ACameraCaptureSession_captureV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + pub fn ACameraCaptureSession_setRepeatingRequestV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_captureV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, @@ -19037,7 +20902,7 @@ pub const ERROR_MAX_CAMERAS_IN_USE: ::std::os::raw::c_uint = 2; pub const ERROR_CAMERA_DISABLED: ::std::os::raw::c_uint = 3; pub const ERROR_CAMERA_DEVICE: ::std::os::raw::c_uint = 4; pub const ERROR_CAMERA_SERVICE: ::std::os::raw::c_uint = 5; -pub type _bindgen_ty_64 = ::std::os::raw::c_uint; +pub type _bindgen_ty_66 = ::std::os::raw::c_uint; pub type ACameraDevice_StateCallback = ::std::option::Option< unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, device: *mut ACameraDevice), >; @@ -20387,6 +22252,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_PICTURE_TYPE: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE: *const ::std::os::raw::c_char; +} extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_B_MAX: *const ::std::os::raw::c_char; } @@ -20411,6 +22285,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_P_MIN: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT: *const ::std::os::raw::c_char; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaCodec { @@ -20492,7 +22375,7 @@ pub const AMEDIACODEC_CONFIGURE_FLAG_ENCODE: ::std::os::raw::c_int = 1; pub const AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED: ::std::os::raw::c_int = -3; pub const AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED: ::std::os::raw::c_int = -2; pub const AMEDIACODEC_INFO_TRY_AGAIN_LATER: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_65 = ::std::os::raw::c_int; +pub type _bindgen_ty_67 = ::std::os::raw::c_int; pub type AMediaCodecOnAsyncInputAvailable = ::std::option::Option< unsafe extern "C" fn( codec: *mut AMediaCodec, @@ -20600,6 +22483,14 @@ fn bindgen_test_layout_AMediaCodecOnAsyncNotifyCallback() { ) ); } +pub type AMediaCodecOnFrameRendered = ::std::option::Option< + unsafe extern "C" fn( + codec: *mut AMediaCodec, + userdata: *mut ::std::os::raw::c_void, + mediaTimeUs: i64, + systemNano: i64, + ), +>; extern "C" { pub fn AMediaCodec_createCodecByName(name: *const ::std::os::raw::c_char) -> *mut AMediaCodec; } @@ -20761,6 +22652,13 @@ extern "C" { userdata: *mut ::std::os::raw::c_void, ) -> media_status_t; } +extern "C" { + pub fn AMediaCodec_setOnFrameRenderedCallback( + arg1: *mut AMediaCodec, + callback: AMediaCodecOnFrameRendered, + userdata: *mut ::std::os::raw::c_void, + ) -> media_status_t; +} extern "C" { pub fn AMediaCodec_releaseCrypto(arg1: *mut AMediaCodec) -> media_status_t; } @@ -21035,6 +22933,24 @@ impl AMediaDrmKeyType { #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AMediaDrmKeyType(pub ::std::os::raw::c_uint); +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_INITIAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(0); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RENEWAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(1); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RELEASE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(2); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_NONE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(3); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_UPDATE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(4); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMediaDrmKeyRequestType(pub i32); #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaDrmKeyValuePair { @@ -21215,6 +23131,22 @@ extern "C" { keyRequestSize: *mut size_t, ) -> media_status_t; } +extern "C" { + pub fn AMediaDrm_getKeyRequestWithDefaultUrlAndType( + arg1: *mut AMediaDrm, + scope: *const AMediaDrmScope, + init: *const u8, + initSize: size_t, + mimeType: *const ::std::os::raw::c_char, + keyType: AMediaDrmKeyType, + optionalParameters: *const AMediaDrmKeyValue, + numOptionalParameters: size_t, + keyRequest: *mut *const u8, + keyRequestSize: *mut size_t, + defaultUrl: *mut *const ::std::os::raw::c_char, + keyRequestType: *mut AMediaDrmKeyRequestType, + ) -> media_status_t; +} extern "C" { pub fn AMediaDrm_provideKeyResponse( arg1: *mut AMediaDrm, @@ -21535,7 +23467,7 @@ extern "C" { } pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC: ::std::os::raw::c_uint = 1; pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_66 = ::std::os::raw::c_uint; +pub type _bindgen_ty_68 = ::std::os::raw::c_uint; extern "C" { pub fn AMediaExtractor_getFileFormat(arg1: *mut AMediaExtractor) -> *mut AMediaFormat; } diff --git a/ndk-sys/src/ffi_i686.rs b/ndk-sys/src/ffi_i686.rs index 3d6ae114..076412a4 100644 --- a/ndk-sys/src/ffi_i686.rs +++ b/ndk-sys/src/ffi_i686.rs @@ -34,10 +34,10 @@ pub const __BIONIC__: u32 = 1; pub const __WORDSIZE: u32 = 32; pub const __bos_level: u32 = 0; pub const __ANDROID_NDK__: u32 = 1; -pub const __NDK_MAJOR__: u32 = 23; -pub const __NDK_MINOR__: u32 = 1; +pub const __NDK_MAJOR__: u32 = 25; +pub const __NDK_MINOR__: u32 = 0; pub const __NDK_BETA__: u32 = 0; -pub const __NDK_BUILD__: u32 = 7779620; +pub const __NDK_BUILD__: u32 = 8775105; pub const __NDK_CANARY__: u32 = 0; pub const __ANDROID_API_FUTURE__: u32 = 10000; pub const __ANDROID_API__: u32 = 10000; @@ -369,6 +369,8 @@ pub const SO_DETACH_REUSEPORT_BPF: u32 = 68; pub const SO_PREFER_BUSY_POLL: u32 = 69; pub const SO_BUSY_POLL_BUDGET: u32 = 70; pub const SO_NETNS_COOKIE: u32 = 71; +pub const SO_BUF_LOCK: u32 = 72; +pub const SO_RESERVE_MEM: u32 = 73; pub const SOCK_IOC_TYPE: u32 = 137; pub const SIOCADDRT: u32 = 35083; pub const SIOCDELRT: u32 = 35084; @@ -1836,6 +1838,9 @@ impl AndroidBitmapFormat { impl AndroidBitmapFormat { pub const ANDROID_BITMAP_FORMAT_RGBA_F16: AndroidBitmapFormat = AndroidBitmapFormat(9); } +impl AndroidBitmapFormat { + pub const ANDROID_BITMAP_FORMAT_RGBA_1010102: AndroidBitmapFormat = AndroidBitmapFormat(10); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AndroidBitmapFormat(pub ::std::os::raw::c_uint); @@ -1993,12 +1998,24 @@ extern "C" { pub struct AChoreographer { _unused: [u8; 0], } +pub type AVsyncId = i64; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct AChoreographerFrameCallbackData { + _unused: [u8; 0], +} pub type AChoreographer_frameCallback = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: ::std::os::raw::c_long, data: *mut ::std::os::raw::c_void), >; pub type AChoreographer_frameCallback64 = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: i64, data: *mut ::std::os::raw::c_void), >; +pub type AChoreographer_vsyncCallback = ::std::option::Option< + unsafe extern "C" fn( + callbackData: *const AChoreographerFrameCallbackData, + data: *mut ::std::os::raw::c_void, + ), +>; pub type AChoreographer_refreshRateCallback = ::std::option::Option< unsafe extern "C" fn(vsyncPeriodNanos: i64, data: *mut ::std::os::raw::c_void), >; @@ -2035,6 +2052,13 @@ extern "C" { delayMillis: u32, ); } +extern "C" { + pub fn AChoreographer_postVsyncCallback( + choreographer: *mut AChoreographer, + callback: AChoreographer_vsyncCallback, + data: *mut ::std::os::raw::c_void, + ); +} extern "C" { pub fn AChoreographer_registerRefreshRateCallback( choreographer: *mut AChoreographer, @@ -2049,6 +2073,39 @@ extern "C" { data: *mut ::std::os::raw::c_void, ); } +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimeNanos( + data: *const AChoreographerFrameCallbackData, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelinesLength( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getPreferredFrameTimelineIndex( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineVsyncId( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> AVsyncId; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AConfiguration { @@ -2380,6 +2437,90 @@ extern "C" { impl ADataSpace { pub const ADATASPACE_UNKNOWN: ADataSpace = ADataSpace(0); } +impl ADataSpace { + pub const STANDARD_MASK: ADataSpace = ADataSpace(4128768); +} +impl ADataSpace { + pub const STANDARD_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const STANDARD_BT709: ADataSpace = ADataSpace(65536); +} +impl ADataSpace { + pub const STANDARD_BT601_625: ADataSpace = ADataSpace(131072); +} +impl ADataSpace { + pub const STANDARD_BT601_625_UNADJUSTED: ADataSpace = ADataSpace(196608); +} +impl ADataSpace { + pub const STANDARD_BT601_525: ADataSpace = ADataSpace(262144); +} +impl ADataSpace { + pub const STANDARD_BT601_525_UNADJUSTED: ADataSpace = ADataSpace(327680); +} +impl ADataSpace { + pub const STANDARD_BT2020: ADataSpace = ADataSpace(393216); +} +impl ADataSpace { + pub const STANDARD_BT2020_CONSTANT_LUMINANCE: ADataSpace = ADataSpace(458752); +} +impl ADataSpace { + pub const STANDARD_BT470M: ADataSpace = ADataSpace(524288); +} +impl ADataSpace { + pub const STANDARD_FILM: ADataSpace = ADataSpace(589824); +} +impl ADataSpace { + pub const STANDARD_DCI_P3: ADataSpace = ADataSpace(655360); +} +impl ADataSpace { + pub const STANDARD_ADOBE_RGB: ADataSpace = ADataSpace(720896); +} +impl ADataSpace { + pub const TRANSFER_MASK: ADataSpace = ADataSpace(130023424); +} +impl ADataSpace { + pub const TRANSFER_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const TRANSFER_LINEAR: ADataSpace = ADataSpace(4194304); +} +impl ADataSpace { + pub const TRANSFER_SRGB: ADataSpace = ADataSpace(8388608); +} +impl ADataSpace { + pub const TRANSFER_SMPTE_170M: ADataSpace = ADataSpace(12582912); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_2: ADataSpace = ADataSpace(16777216); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_6: ADataSpace = ADataSpace(20971520); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_8: ADataSpace = ADataSpace(25165824); +} +impl ADataSpace { + pub const TRANSFER_ST2084: ADataSpace = ADataSpace(29360128); +} +impl ADataSpace { + pub const TRANSFER_HLG: ADataSpace = ADataSpace(33554432); +} +impl ADataSpace { + pub const RANGE_MASK: ADataSpace = ADataSpace(939524096); +} +impl ADataSpace { + pub const RANGE_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const RANGE_FULL: ADataSpace = ADataSpace(134217728); +} +impl ADataSpace { + pub const RANGE_LIMITED: ADataSpace = ADataSpace(268435456); +} +impl ADataSpace { + pub const RANGE_EXTENDED: ADataSpace = ADataSpace(402653184); +} impl ADataSpace { pub const ADATASPACE_SCRGB_LINEAR: ADataSpace = ADataSpace(406913024); } @@ -2395,9 +2536,21 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_BT2020_PQ: ADataSpace = ADataSpace(163971072); } +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_PQ: ADataSpace = ADataSpace(298188800); +} impl ADataSpace { pub const ADATASPACE_ADOBE_RGB: ADataSpace = ADataSpace(151715840); } +impl ADataSpace { + pub const ADATASPACE_JFIF: ADataSpace = ADataSpace(146931712); +} +impl ADataSpace { + pub const ADATASPACE_BT601_625: ADataSpace = ADataSpace(281149440); +} +impl ADataSpace { + pub const ADATASPACE_BT601_525: ADataSpace = ADataSpace(281280512); +} impl ADataSpace { pub const ADATASPACE_BT2020: ADataSpace = ADataSpace(147193856); } @@ -2410,6 +2563,18 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_SRGB_LINEAR: ADataSpace = ADataSpace(138477568); } +impl ADataSpace { + pub const ADATASPACE_BT2020_HLG: ADataSpace = ADataSpace(168165376); +} +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_HLG: ADataSpace = ADataSpace(302383104); +} +impl ADataSpace { + pub const DEPTH: ADataSpace = ADataSpace(4096); +} +impl ADataSpace { + pub const DYNAMIC_DEPTH: ADataSpace = ADataSpace(4098); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct ADataSpace(pub ::std::os::raw::c_uint); @@ -2776,6 +2941,13 @@ impl AHardwareBuffer_Format { pub const AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: AHardwareBuffer_Format = AHardwareBuffer_Format(35); } +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_YCbCr_P010: AHardwareBuffer_Format = + AHardwareBuffer_Format(54); +} +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_R8_UNORM: AHardwareBuffer_Format = AHardwareBuffer_Format(56); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AHardwareBuffer_Format(pub ::std::os::raw::c_uint); @@ -3995,6 +4167,7 @@ pub const AINPUT_EVENT_TYPE_MOTION: ::std::os::raw::c_uint = 2; pub const AINPUT_EVENT_TYPE_FOCUS: ::std::os::raw::c_uint = 3; pub const AINPUT_EVENT_TYPE_CAPTURE: ::std::os::raw::c_uint = 4; pub const AINPUT_EVENT_TYPE_DRAG: ::std::os::raw::c_uint = 5; +pub const AINPUT_EVENT_TYPE_TOUCH_MODE: ::std::os::raw::c_uint = 6; pub type _bindgen_ty_17 = ::std::os::raw::c_uint; pub const AKEY_EVENT_ACTION_DOWN: ::std::os::raw::c_uint = 0; pub const AKEY_EVENT_ACTION_UP: ::std::os::raw::c_uint = 1; @@ -4097,6 +4270,20 @@ pub const AMOTION_EVENT_TOOL_TYPE_MOUSE: ::std::os::raw::c_uint = 3; pub const AMOTION_EVENT_TOOL_TYPE_ERASER: ::std::os::raw::c_uint = 4; pub const AMOTION_EVENT_TOOL_TYPE_PALM: ::std::os::raw::c_uint = 5; pub type _bindgen_ty_25 = ::std::os::raw::c_uint; +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_NONE: AMotionClassification = AMotionClassification(0); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE: AMotionClassification = + AMotionClassification(1); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS: AMotionClassification = + AMotionClassification(2); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMotionClassification(pub u32); pub const AINPUT_SOURCE_CLASS_MASK: ::std::os::raw::c_uint = 255; pub const AINPUT_SOURCE_CLASS_NONE: ::std::os::raw::c_uint = 0; pub const AINPUT_SOURCE_CLASS_BUTTON: ::std::os::raw::c_uint = 1; @@ -4372,6 +4559,12 @@ extern "C" { history_index: size_t, ) -> f32; } +extern "C" { + pub fn AMotionEvent_getActionButton(motion_event: *const AInputEvent) -> i32; +} +extern "C" { + pub fn AMotionEvent_getClassification(motion_event: *const AInputEvent) -> i32; +} extern "C" { pub fn AMotionEvent_fromJava(env: *mut JNIEnv, motionEvent: jobject) -> *const AInputEvent; } @@ -4408,6 +4601,9 @@ extern "C" { handled: ::std::os::raw::c_int, ); } +extern "C" { + pub fn AInputQueue_fromJava(env: *mut JNIEnv, inputQueue: jobject) -> *mut AInputQueue; +} impl android_LogPriority { pub const ANDROID_LOG_UNKNOWN: android_LogPriority = android_LogPriority(0); } @@ -6532,6 +6728,133 @@ fn bindgen_test_layout_mallinfo() { extern "C" { pub fn mallinfo() -> mallinfo; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mallinfo2 { + pub arena: size_t, + pub ordblks: size_t, + pub smblks: size_t, + pub hblks: size_t, + pub hblkhd: size_t, + pub usmblks: size_t, + pub fsmblks: size_t, + pub uordblks: size_t, + pub fordblks: size_t, + pub keepcost: size_t, +} +#[test] +fn bindgen_test_layout_mallinfo2() { + assert_eq!( + ::std::mem::size_of::(), + 40usize, + concat!("Size of: ", stringify!(mallinfo2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(mallinfo2)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).arena as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(arena) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ordblks as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(ordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).smblks as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(smblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblks as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblkhd as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblkhd) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).usmblks as *const _ as usize }, + 20usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(usmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fsmblks as *const _ as usize }, + 24usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fsmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).uordblks as *const _ as usize }, + 28usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(uordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fordblks as *const _ as usize }, + 32usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).keepcost as *const _ as usize }, + 36usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(keepcost) + ) + ); +} extern "C" { pub fn malloc_info( __must_be_zero: ::std::os::raw::c_int, @@ -7177,6 +7500,19 @@ extern "C" { extern "C" { pub fn android_res_cancel(nsend_fd: ::std::os::raw::c_int); } +extern "C" { + pub fn android_tag_socket_with_uid( + sockfd: ::std::os::raw::c_int, + tag: u32, + uid: uid_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_tag_socket(sockfd: ::std::os::raw::c_int, tag: u32) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_untag_socket(sockfd: ::std::os::raw::c_int) -> ::std::os::raw::c_int; +} impl ANativeWindow_LegacyFormat { pub const WINDOW_FORMAT_RGBA_8888: ANativeWindow_LegacyFormat = ANativeWindow_LegacyFormat(1); } @@ -8171,6 +8507,18 @@ impl OperationCode { impl OperationCode { pub const ANEURALNETWORKS_RANK: OperationCode = OperationCode(101); } +impl OperationCode { + pub const ANEURALNETWORKS_BATCH_MATMUL: OperationCode = OperationCode(102); +} +impl OperationCode { + pub const ANEURALNETWORKS_PACK: OperationCode = OperationCode(103); +} +impl OperationCode { + pub const ANEURALNETWORKS_MIRROR_PAD: OperationCode = OperationCode(104); +} +impl OperationCode { + pub const ANEURALNETWORKS_REVERSE: OperationCode = OperationCode(105); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct OperationCode(pub ::std::os::raw::c_uint); @@ -8243,6 +8591,15 @@ impl FeatureLevelCode { impl FeatureLevelCode { pub const ANEURALNETWORKS_FEATURE_LEVEL_5: FeatureLevelCode = FeatureLevelCode(31); } +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_6: FeatureLevelCode = FeatureLevelCode(1000006); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_7: FeatureLevelCode = FeatureLevelCode(1000007); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_8: FeatureLevelCode = FeatureLevelCode(1000008); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct FeatureLevelCode(pub ::std::os::raw::c_uint); @@ -9368,10 +9725,17 @@ pub const ASENSOR_TYPE_POSE_6DOF: ::std::os::raw::c_int = 28; pub const ASENSOR_TYPE_STATIONARY_DETECT: ::std::os::raw::c_int = 29; pub const ASENSOR_TYPE_MOTION_DETECT: ::std::os::raw::c_int = 30; pub const ASENSOR_TYPE_HEART_BEAT: ::std::os::raw::c_int = 31; +pub const ASENSOR_TYPE_DYNAMIC_SENSOR_META: ::std::os::raw::c_int = 32; pub const ASENSOR_TYPE_ADDITIONAL_INFO: ::std::os::raw::c_int = 33; pub const ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT: ::std::os::raw::c_int = 34; pub const ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED: ::std::os::raw::c_int = 35; pub const ASENSOR_TYPE_HINGE_ANGLE: ::std::os::raw::c_int = 36; +pub const ASENSOR_TYPE_HEAD_TRACKER: ::std::os::raw::c_int = 37; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES: ::std::os::raw::c_int = 38; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES: ::std::os::raw::c_int = 39; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 40; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 41; +pub const ASENSOR_TYPE_HEADING: ::std::os::raw::c_int = 42; pub type _bindgen_ty_38 = ::std::os::raw::c_int; pub const ASENSOR_STATUS_NO_CONTACT: ::std::os::raw::c_int = -1; pub const ASENSOR_STATUS_UNRELIABLE: ::std::os::raw::c_int = 0; @@ -10025,484 +10389,1232 @@ fn bindgen_test_layout_AAdditionalInfoEvent() { ); } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ASensorEvent { - pub version: i32, - pub sensor: i32, - pub type_: i32, - pub reserved0: i32, - pub timestamp: i64, - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, - pub flags: u32, - pub reserved1: [i32; 3usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1 { - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, - pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { - pub data: [f32; 16usize], - pub vector: ASensorVector, - pub acceleration: ASensorVector, - pub gyro: ASensorVector, - pub magnetic: ASensorVector, - pub temperature: f32, - pub distance: f32, - pub light: f32, - pub pressure: f32, - pub relative_humidity: f32, - pub uncalibrated_acceleration: AUncalibratedEvent, - pub uncalibrated_gyro: AUncalibratedEvent, - pub uncalibrated_magnetic: AUncalibratedEvent, - pub meta_data: AMetaDataEvent, - pub heart_rate: AHeartRateEvent, - pub dynamic_sensor_meta: ADynamicSensorEvent, - pub additional_info: AAdditionalInfoEvent, +#[derive(Debug, Copy, Clone)] +pub struct AHeadTrackerEvent { + pub rx: f32, + pub ry: f32, + pub rz: f32, + pub vx: f32, + pub vy: f32, + pub vz: f32, + pub discontinuity_count: i32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { +fn bindgen_test_layout_AHeadTrackerEvent() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!( - "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + ::std::mem::size_of::(), + 28usize, + concat!("Size of: ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!( - "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + concat!("Alignment of ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize - }, + unsafe { &(*(::std::ptr::null::())).rx as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(data) + stringify!(rx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).vector as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).ry as *const _ as usize }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(vector) + stringify!(ry) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).acceleration - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).rz as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(acceleration) + stringify!(rz) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).gyro as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vx as *const _ as usize }, + 12usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(gyro) + stringify!(vx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).magnetic - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vy as *const _ as usize }, + 16usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(magnetic) + stringify!(vy) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).temperature - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vz as *const _ as usize }, + 20usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(temperature) + stringify!(vz) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).distance - as *const _ as usize + &(*(::std::ptr::null::())).discontinuity_count as *const _ as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(distance) + stringify!(discontinuity_count) ) ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ALimitedAxesImuEvent { + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuEvent__bindgen_ty_2, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_1 { + pub calib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1 { + pub x: f32, + pub y: f32, + pub z: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - unsafe { - &(*(::std::ptr::null::())).light as *const _ - as usize - }, - 0usize, + ::std::mem::size_of::(), + 12usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(light) + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).pressure - as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 4usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(pressure) + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).relative_humidity + &(*(::std::ptr::null::())).x as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(relative_humidity) + stringify!(x) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_acceleration as *const _ as usize + &(*(::std::ptr::null::())).y + as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_acceleration) + stringify!(y) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).uncalibrated_gyro + &(*(::std::ptr::null::())).z as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_gyro) + stringify!(z) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_magnetic as *const _ as usize + &(*(::std::ptr::null::())).calib as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1), "::", - stringify!(uncalibrated_magnetic) + stringify!(calib) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_2 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).meta_data + &(*(::std::ptr::null::())).x_supported as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(meta_data) + stringify!(x_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).heart_rate + &(*(::std::ptr::null::())).y_supported as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(heart_rate) + stringify!(y_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).dynamic_sensor_meta + &(*(::std::ptr::null::())).z_supported as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(dynamic_sensor_meta) + stringify!(z_supported) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).additional_info - as *const _ as usize + &(*(::std::ptr::null::())).supported as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2), "::", - stringify!(additional_info) + stringify!(supported) ) ); } +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ALimitedAxesImuEvent)) + ); +} #[repr(C)] #[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { - pub data: [u64; 8usize], - pub step_counter: u64, +pub struct ALimitedAxesImuUncalibratedEvent { + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2, + pub __bindgen_anon_3: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_1 { + pub uncalib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1 { + pub x_uncalib: f32, + pub y_uncalib: f32, + pub z_uncalib: f32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, + ::std::mem::size_of::(), + 12usize, concat!( "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize + &(*(::std::ptr::null::())) + .x_uncalib as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(data) + stringify!(x_uncalib) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).step_counter - as *const _ as usize + &(*(::std::ptr::null::())) + .y_uncalib as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(step_counter) + stringify!(y_uncalib) ) ); -} -#[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) - ); + unsafe { + &(*(::std::ptr::null::())) + .z_uncalib as *const _ as usize + }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(z_uncalib) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::align_of::(), + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), 4usize, - concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).uncalib + as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1), "::", - stringify!(u64_) + stringify!(uncalib) ) ); } +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_2 { + pub bias: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_bias: f32, + pub y_bias: f32, + pub z_bias: f32, +} #[test] -fn bindgen_test_layout_ASensorEvent() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 104usize, - concat!("Size of: ", stringify!(ASensorEvent)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!("Alignment of ", stringify!(ASensorEvent)) + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .x_bias as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(version) + stringify!(x_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .y_bias as *const _ as usize + }, 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(sensor) + stringify!(y_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .z_bias as *const _ as usize + }, 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(type_) + stringify!(z_bias) ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2() { assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + ::std::mem::size_of::(), 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).bias + as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2), "::", - stringify!(reserved0) + stringify!(bias) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_3 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, - 16usize, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .x_supported as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(timestamp) + stringify!(x_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, - 88usize, + unsafe { + &(*(::std::ptr::null::())) + .y_supported as *const _ as usize + }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(flags) + stringify!(y_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, - 92usize, + unsafe { + &(*(::std::ptr::null::())) + .z_supported as *const _ as usize + }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(reserved1) + stringify!(z_supported) ) ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorManager { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).supported + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3), + "::", + stringify!(supported) + ) + ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorEventQueue { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent() { + assert_eq!( + ::std::mem::size_of::(), + 36usize, + concat!("Size of: ", stringify!(ALimitedAxesImuUncalibratedEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent) + ) + ); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ASensor { - _unused: [u8; 0], +pub struct AHeadingEvent { + pub heading: f32, + pub accuracy: f32, } -pub type ASensorRef = *const ASensor; -pub type ASensorList = *const ASensorRef; -extern "C" { - pub fn ASensorManager_getInstance() -> *mut ASensorManager; +#[test] +fn bindgen_test_layout_AHeadingEvent() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(AHeadingEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(AHeadingEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).heading as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(heading) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).accuracy as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(accuracy) + ) + ); } -extern "C" { - pub fn ASensorManager_getInstanceForPackage( - packageName: *const ::std::os::raw::c_char, - ) -> *mut ASensorManager; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ASensorEvent { + pub version: i32, + pub sensor: i32, + pub type_: i32, + pub reserved0: i32, + pub timestamp: i64, + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, + pub flags: u32, + pub reserved1: [i32; 3usize], } -extern "C" { - pub fn ASensorManager_getSensorList( - manager: *mut ASensorManager, - list: *mut ASensorList, - ) -> ::std::os::raw::c_int; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1 { + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, + pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, } -extern "C" { - pub fn ASensorManager_getDefaultSensor( - manager: *mut ASensorManager, - type_: ::std::os::raw::c_int, - ) -> *const ASensor; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { + pub data: [f32; 16usize], + pub vector: ASensorVector, + pub acceleration: ASensorVector, + pub gyro: ASensorVector, + pub magnetic: ASensorVector, + pub temperature: f32, + pub distance: f32, + pub light: f32, + pub pressure: f32, + pub relative_humidity: f32, + pub uncalibrated_acceleration: AUncalibratedEvent, + pub uncalibrated_gyro: AUncalibratedEvent, + pub uncalibrated_magnetic: AUncalibratedEvent, + pub meta_data: AMetaDataEvent, + pub heart_rate: AHeartRateEvent, + pub dynamic_sensor_meta: ADynamicSensorEvent, + pub additional_info: AAdditionalInfoEvent, + pub head_tracker: AHeadTrackerEvent, + pub limited_axes_imu: ALimitedAxesImuEvent, + pub limited_axes_imu_uncalibrated: ALimitedAxesImuUncalibratedEvent, + pub heading: AHeadingEvent, } -extern "C" { - pub fn ASensorManager_getDefaultSensorEx( - manager: *mut ASensorManager, - type_: ::std::os::raw::c_int, - wakeUp: bool, - ) -> *const ASensor; +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).vector as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(vector) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).acceleration + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).gyro as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).magnetic + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).temperature + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(temperature) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).distance + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(distance) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).light as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(light) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).pressure + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(pressure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).relative_humidity + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(relative_humidity) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_acceleration as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalibrated_gyro + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_magnetic as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).meta_data + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(meta_data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heart_rate + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heart_rate) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).dynamic_sensor_meta + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(dynamic_sensor_meta) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).additional_info + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(additional_info) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).head_tracker + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(head_tracker) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).limited_axes_imu + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .limited_axes_imu_uncalibrated as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu_uncalibrated) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heading as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heading) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { + pub data: [u64; 8usize], + pub step_counter: u64, +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).step_counter + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(step_counter) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1), + "::", + stringify!(u64_) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent() { + assert_eq!( + ::std::mem::size_of::(), + 104usize, + concat!("Size of: ", stringify!(ASensorEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ASensorEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(version) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(sensor) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved0) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(timestamp) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, + 88usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(flags) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, + 92usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved1) + ) + ); +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorManager { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorEventQueue { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensor { + _unused: [u8; 0], +} +pub type ASensorRef = *const ASensor; +pub type ASensorList = *const ASensorRef; +extern "C" { + pub fn ASensorManager_getInstance() -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getInstanceForPackage( + packageName: *const ::std::os::raw::c_char, + ) -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn ASensorManager_getDynamicSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ssize_t; +} +extern "C" { + pub fn ASensorManager_getDefaultSensor( + manager: *mut ASensorManager, + type_: ::std::os::raw::c_int, + ) -> *const ASensor; +} +extern "C" { + pub fn ASensorManager_getDefaultSensorEx( + manager: *mut ASensorManager, + type_: ::std::os::raw::c_int, + wakeUp: bool, + ) -> *const ASensor; } extern "C" { pub fn ASensorManager_createEventQueue( @@ -16286,23 +17398,81 @@ pub const AAUDIO_CONTENT_TYPE_MOVIE: ::std::os::raw::c_uint = 3; pub const AAUDIO_CONTENT_TYPE_SONIFICATION: ::std::os::raw::c_uint = 4; pub type _bindgen_ty_54 = ::std::os::raw::c_uint; pub type aaudio_content_type_t = i32; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_AUTO: ::std::os::raw::c_uint = 1; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_NEVER: ::std::os::raw::c_uint = 2; +pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type aaudio_spatialization_behavior_t = i32; pub const AAUDIO_INPUT_PRESET_GENERIC: ::std::os::raw::c_uint = 1; pub const AAUDIO_INPUT_PRESET_CAMCORDER: ::std::os::raw::c_uint = 5; pub const AAUDIO_INPUT_PRESET_VOICE_RECOGNITION: ::std::os::raw::c_uint = 6; pub const AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION: ::std::os::raw::c_uint = 7; pub const AAUDIO_INPUT_PRESET_UNPROCESSED: ::std::os::raw::c_uint = 9; pub const AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE: ::std::os::raw::c_uint = 10; -pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type _bindgen_ty_56 = ::std::os::raw::c_uint; pub type aaudio_input_preset_t = i32; pub const AAUDIO_ALLOW_CAPTURE_BY_ALL: ::std::os::raw::c_uint = 1; pub const AAUDIO_ALLOW_CAPTURE_BY_SYSTEM: ::std::os::raw::c_uint = 2; pub const AAUDIO_ALLOW_CAPTURE_BY_NONE: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_56 = ::std::os::raw::c_uint; +pub type _bindgen_ty_57 = ::std::os::raw::c_uint; pub type aaudio_allowed_capture_policy_t = i32; pub const AAUDIO_SESSION_ID_NONE: ::std::os::raw::c_int = -1; pub const AAUDIO_SESSION_ID_ALLOCATE: ::std::os::raw::c_int = 0; -pub type _bindgen_ty_57 = ::std::os::raw::c_int; +pub type _bindgen_ty_58 = ::std::os::raw::c_int; pub type aaudio_session_id_t = i32; +pub const AAUDIO_CHANNEL_INVALID: ::std::os::raw::c_int = -1; +pub const AAUDIO_CHANNEL_FRONT_LEFT: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_FRONT_RIGHT: ::std::os::raw::c_int = 2; +pub const AAUDIO_CHANNEL_FRONT_CENTER: ::std::os::raw::c_int = 4; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY: ::std::os::raw::c_int = 8; +pub const AAUDIO_CHANNEL_BACK_LEFT: ::std::os::raw::c_int = 16; +pub const AAUDIO_CHANNEL_BACK_RIGHT: ::std::os::raw::c_int = 32; +pub const AAUDIO_CHANNEL_FRONT_LEFT_OF_CENTER: ::std::os::raw::c_int = 64; +pub const AAUDIO_CHANNEL_FRONT_RIGHT_OF_CENTER: ::std::os::raw::c_int = 128; +pub const AAUDIO_CHANNEL_BACK_CENTER: ::std::os::raw::c_int = 256; +pub const AAUDIO_CHANNEL_SIDE_LEFT: ::std::os::raw::c_int = 512; +pub const AAUDIO_CHANNEL_SIDE_RIGHT: ::std::os::raw::c_int = 1024; +pub const AAUDIO_CHANNEL_TOP_CENTER: ::std::os::raw::c_int = 2048; +pub const AAUDIO_CHANNEL_TOP_FRONT_LEFT: ::std::os::raw::c_int = 4096; +pub const AAUDIO_CHANNEL_TOP_FRONT_CENTER: ::std::os::raw::c_int = 8192; +pub const AAUDIO_CHANNEL_TOP_FRONT_RIGHT: ::std::os::raw::c_int = 16384; +pub const AAUDIO_CHANNEL_TOP_BACK_LEFT: ::std::os::raw::c_int = 32768; +pub const AAUDIO_CHANNEL_TOP_BACK_CENTER: ::std::os::raw::c_int = 65536; +pub const AAUDIO_CHANNEL_TOP_BACK_RIGHT: ::std::os::raw::c_int = 131072; +pub const AAUDIO_CHANNEL_TOP_SIDE_LEFT: ::std::os::raw::c_int = 262144; +pub const AAUDIO_CHANNEL_TOP_SIDE_RIGHT: ::std::os::raw::c_int = 524288; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_LEFT: ::std::os::raw::c_int = 1048576; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_CENTER: ::std::os::raw::c_int = 2097152; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_RIGHT: ::std::os::raw::c_int = 4194304; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY_2: ::std::os::raw::c_int = 8388608; +pub const AAUDIO_CHANNEL_FRONT_WIDE_LEFT: ::std::os::raw::c_int = 16777216; +pub const AAUDIO_CHANNEL_FRONT_WIDE_RIGHT: ::std::os::raw::c_int = 33554432; +pub const AAUDIO_CHANNEL_MONO: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_STEREO: ::std::os::raw::c_int = 3; +pub const AAUDIO_CHANNEL_2POINT1: ::std::os::raw::c_int = 11; +pub const AAUDIO_CHANNEL_TRI: ::std::os::raw::c_int = 7; +pub const AAUDIO_CHANNEL_TRI_BACK: ::std::os::raw::c_int = 259; +pub const AAUDIO_CHANNEL_3POINT1: ::std::os::raw::c_int = 15; +pub const AAUDIO_CHANNEL_2POINT0POINT2: ::std::os::raw::c_int = 786435; +pub const AAUDIO_CHANNEL_2POINT1POINT2: ::std::os::raw::c_int = 786443; +pub const AAUDIO_CHANNEL_3POINT0POINT2: ::std::os::raw::c_int = 786439; +pub const AAUDIO_CHANNEL_3POINT1POINT2: ::std::os::raw::c_int = 786447; +pub const AAUDIO_CHANNEL_QUAD: ::std::os::raw::c_int = 51; +pub const AAUDIO_CHANNEL_QUAD_SIDE: ::std::os::raw::c_int = 1539; +pub const AAUDIO_CHANNEL_SURROUND: ::std::os::raw::c_int = 263; +pub const AAUDIO_CHANNEL_PENTA: ::std::os::raw::c_int = 55; +pub const AAUDIO_CHANNEL_5POINT1: ::std::os::raw::c_int = 63; +pub const AAUDIO_CHANNEL_5POINT1_SIDE: ::std::os::raw::c_int = 1551; +pub const AAUDIO_CHANNEL_6POINT1: ::std::os::raw::c_int = 319; +pub const AAUDIO_CHANNEL_7POINT1: ::std::os::raw::c_int = 1599; +pub const AAUDIO_CHANNEL_5POINT1POINT2: ::std::os::raw::c_int = 786495; +pub const AAUDIO_CHANNEL_5POINT1POINT4: ::std::os::raw::c_int = 184383; +pub const AAUDIO_CHANNEL_7POINT1POINT2: ::std::os::raw::c_int = 788031; +pub const AAUDIO_CHANNEL_7POINT1POINT4: ::std::os::raw::c_int = 185919; +pub const AAUDIO_CHANNEL_9POINT1POINT4: ::std::os::raw::c_int = 50517567; +pub const AAUDIO_CHANNEL_9POINT1POINT6: ::std::os::raw::c_int = 51303999; +pub const AAUDIO_CHANNEL_FRONT_BACK: ::std::os::raw::c_int = 260; +pub type _bindgen_ty_59 = ::std::os::raw::c_int; +pub type aaudio_channel_mask_t = u32; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AAudioStreamStruct { @@ -16396,6 +17566,18 @@ extern "C" { contentType: aaudio_content_type_t, ); } +extern "C" { + pub fn AAudioStreamBuilder_setSpatializationBehavior( + builder: *mut AAudioStreamBuilder, + spatializationBehavior: aaudio_spatialization_behavior_t, + ); +} +extern "C" { + pub fn AAudioStreamBuilder_setIsContentSpatialized( + builder: *mut AAudioStreamBuilder, + isSpatialized: bool, + ); +} extern "C" { pub fn AAudioStreamBuilder_setInputPreset( builder: *mut AAudioStreamBuilder, @@ -16422,7 +17604,7 @@ extern "C" { } pub const AAUDIO_CALLBACK_RESULT_CONTINUE: ::std::os::raw::c_uint = 0; pub const AAUDIO_CALLBACK_RESULT_STOP: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_58 = ::std::os::raw::c_uint; +pub type _bindgen_ty_60 = ::std::os::raw::c_uint; pub type aaudio_data_callback_result_t = i32; pub type AAudioStream_dataCallback = ::std::option::Option< unsafe extern "C" fn( @@ -16468,6 +17650,12 @@ extern "C" { extern "C" { pub fn AAudioStreamBuilder_delete(builder: *mut AAudioStreamBuilder) -> aaudio_result_t; } +extern "C" { + pub fn AAudioStreamBuilder_setChannelMask( + builder: *mut AAudioStreamBuilder, + channelMask: aaudio_channel_mask_t, + ); +} extern "C" { pub fn AAudioStream_release(stream: *mut AAudioStream) -> aaudio_result_t; } @@ -16581,6 +17769,14 @@ extern "C" { extern "C" { pub fn AAudioStream_getContentType(stream: *mut AAudioStream) -> aaudio_content_type_t; } +extern "C" { + pub fn AAudioStream_getSpatializationBehavior( + stream: *mut AAudioStream, + ) -> aaudio_spatialization_behavior_t; +} +extern "C" { + pub fn AAudioStream_isContentSpatialized(stream: *mut AAudioStream) -> bool; +} extern "C" { pub fn AAudioStream_getInputPreset(stream: *mut AAudioStream) -> aaudio_input_preset_t; } @@ -16592,6 +17788,9 @@ extern "C" { extern "C" { pub fn AAudioStream_isPrivacySensitive(stream: *mut AAudioStream) -> bool; } +extern "C" { + pub fn AAudioStream_getChannelMask(stream: *mut AAudioStream) -> aaudio_channel_mask_t; +} impl media_status_t { pub const AMEDIA_OK: media_status_t = media_status_t(0); } @@ -16699,11 +17898,43 @@ pub struct AMidiOutputPort { } pub const AMIDI_OPCODE_DATA: ::std::os::raw::c_uint = 1; pub const AMIDI_OPCODE_FLUSH: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_59 = ::std::os::raw::c_uint; +pub type _bindgen_ty_61 = ::std::os::raw::c_uint; pub const AMIDI_DEVICE_TYPE_USB: ::std::os::raw::c_uint = 1; pub const AMIDI_DEVICE_TYPE_VIRTUAL: ::std::os::raw::c_uint = 2; pub const AMIDI_DEVICE_TYPE_BLUETOOTH: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_60 = ::std::os::raw::c_uint; +pub type _bindgen_ty_62 = ::std::os::raw::c_uint; +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_USE_MIDI_CI: AMidiDevice_Protocol = AMidiDevice_Protocol(0); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(1); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(2); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(3); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(4); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0: AMidiDevice_Protocol = AMidiDevice_Protocol(17); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(18); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UNKNOWN: AMidiDevice_Protocol = AMidiDevice_Protocol(-1); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMidiDevice_Protocol(pub i32); extern "C" { pub fn AMidiDevice_fromJava( env: *mut JNIEnv, @@ -16723,6 +17954,9 @@ extern "C" { extern "C" { pub fn AMidiDevice_getNumOutputPorts(device: *const AMidiDevice) -> ssize_t; } +extern "C" { + pub fn AMidiDevice_getDefaultProtocol(device: *const AMidiDevice) -> AMidiDevice_Protocol; +} extern "C" { pub fn AMidiOutputPort_open( device: *const AMidiDevice, @@ -16917,7 +18151,13 @@ impl acamera_metadata_section { pub const ACAMERA_HEIC_INFO: acamera_metadata_section = acamera_metadata_section(29); } impl acamera_metadata_section { - pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(30); + pub const ACAMERA_AUTOMOTIVE: acamera_metadata_section = acamera_metadata_section(30); +} +impl acamera_metadata_section { + pub const ACAMERA_AUTOMOTIVE_LENS: acamera_metadata_section = acamera_metadata_section(31); +} +impl acamera_metadata_section { + pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(32); } impl acamera_metadata_section { pub const ACAMERA_VENDOR: acamera_metadata_section = acamera_metadata_section(32768); @@ -17046,6 +18286,14 @@ impl acamera_metadata_section_start { pub const ACAMERA_HEIC_INFO_START: acamera_metadata_section_start = acamera_metadata_section_start(1900544); } +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_START: acamera_metadata_section_start = + acamera_metadata_section_start(1966080); +} +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_LENS_START: acamera_metadata_section_start = + acamera_metadata_section_start(2031616); +} impl acamera_metadata_section_start { pub const ACAMERA_VENDOR_START: acamera_metadata_section_start = acamera_metadata_section_start(-2147483648); @@ -17252,7 +18500,15 @@ impl acamera_metadata_tag { pub const ACAMERA_FLASH_INFO_AVAILABLE: acamera_metadata_tag = acamera_metadata_tag(327680); } impl acamera_metadata_tag { - pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327681); + pub const ACAMERA_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327682); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_STRENGTH_DEFAULT_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327683); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327684); } impl acamera_metadata_tag { pub const ACAMERA_HOT_PIXEL_MODE: acamera_metadata_tag = acamera_metadata_tag(393216); @@ -17433,7 +18689,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(786449); } impl acamera_metadata_tag { - pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786450); + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP: acamera_metadata_tag = + acamera_metadata_tag(786451); +} +impl acamera_metadata_tag { + pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786452); } impl acamera_metadata_tag { pub const ACAMERA_SCALER_CROP_REGION: acamera_metadata_tag = acamera_metadata_tag(851968); @@ -17497,7 +18757,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(851992); } impl acamera_metadata_tag { - pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851993); + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES: acamera_metadata_tag = + acamera_metadata_tag(851993); +} +impl acamera_metadata_tag { + pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851994); } impl acamera_metadata_tag { pub const ACAMERA_SENSOR_EXPOSURE_TIME: acamera_metadata_tag = acamera_metadata_tag(917504); @@ -17782,7 +19046,11 @@ impl acamera_metadata_tag { pub const ACAMERA_INFO_VERSION: acamera_metadata_tag = acamera_metadata_tag(1376257); } impl acamera_metadata_tag { - pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376258); + pub const ACAMERA_INFO_DEVICE_STATE_ORIENTATIONS: acamera_metadata_tag = + acamera_metadata_tag(1376259); +} +impl acamera_metadata_tag { + pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376260); } impl acamera_metadata_tag { pub const ACAMERA_BLACK_LEVEL_LOCK: acamera_metadata_tag = acamera_metadata_tag(1441792); @@ -17913,6 +19181,18 @@ impl acamera_metadata_tag { impl acamera_metadata_tag { pub const ACAMERA_HEIC_END: acamera_metadata_tag = acamera_metadata_tag(1835014); } +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LOCATION: acamera_metadata_tag = acamera_metadata_tag(1966080); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_END: acamera_metadata_tag = acamera_metadata_tag(1966081); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING: acamera_metadata_tag = acamera_metadata_tag(2031616); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_END: acamera_metadata_tag = acamera_metadata_tag(2031617); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_tag(pub ::std::os::raw::c_uint); @@ -18351,6 +19631,11 @@ impl acamera_metadata_enum_acamera_control_video_stabilization_mode { acamera_metadata_enum_acamera_control_video_stabilization_mode = acamera_metadata_enum_acamera_control_video_stabilization_mode(1); } +impl acamera_metadata_enum_acamera_control_video_stabilization_mode { + pub const ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION: + acamera_metadata_enum_acamera_control_video_stabilization_mode = + acamera_metadata_enum_acamera_control_video_stabilization_mode(2); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_control_video_stabilization_mode( @@ -18665,6 +19950,11 @@ impl acamera_metadata_enum_acamera_lens_pose_reference { acamera_metadata_enum_acamera_lens_pose_reference = acamera_metadata_enum_acamera_lens_pose_reference(2); } +impl acamera_metadata_enum_acamera_lens_pose_reference { + pub const ACAMERA_LENS_POSE_REFERENCE_AUTOMOTIVE: + acamera_metadata_enum_acamera_lens_pose_reference = + acamera_metadata_enum_acamera_lens_pose_reference(3); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_lens_pose_reference(pub ::std::os::raw::c_uint); @@ -18783,10 +20073,86 @@ impl acamera_metadata_enum_acamera_request_available_capabilities { acamera_metadata_enum_acamera_request_available_capabilities = acamera_metadata_enum_acamera_request_available_capabilities(16); } +impl acamera_metadata_enum_acamera_request_available_capabilities { + pub const ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE: + acamera_metadata_enum_acamera_request_available_capabilities = + acamera_metadata_enum_acamera_request_available_capabilities(19); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_request_available_capabilities(pub ::std::os::raw::c_uint); pub use self::acamera_metadata_enum_acamera_request_available_capabilities as acamera_metadata_enum_android_request_available_capabilities_t; +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HLG10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10_PLUS: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(8); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(16); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(32); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(64); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(128); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(256); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(512); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1024); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2048); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_MAX: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4096); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map as acamera_metadata_enum_android_request_available_dynamic_range_profiles_map_t; impl acamera_metadata_enum_acamera_scaler_available_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT: acamera_metadata_enum_acamera_scaler_available_stream_configurations = @@ -18857,6 +20223,16 @@ impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configura acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(7); } +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_10BIT_OUTPUT: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(8); +} +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PUBLIC_END_3_8: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(9); +} impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VENDOR_START: acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = @@ -18949,6 +20325,42 @@ pub struct acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supporte pub ::std::os::raw::c_uint, ); pub use self::acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supported as acamera_metadata_enum_android_scaler_multi_resolution_stream_supported_t; +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(0); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(1); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(2); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(3); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(4); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(5); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_scaler_available_stream_use_cases( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_scaler_available_stream_use_cases as acamera_metadata_enum_android_scaler_available_stream_use_cases_t; impl acamera_metadata_enum_acamera_sensor_reference_illuminant1 { pub const ACAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT: acamera_metadata_enum_acamera_sensor_reference_illuminant1 = @@ -19515,832 +20927,1386 @@ impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_max 0, ); } -impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { - pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - 1, - ); +impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { + pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + 1, + ); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_INTERIOR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(0); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(1); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(2); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(3); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(4); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(5); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(6); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(7); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(8); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(9); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(10); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_location(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_location as acamera_metadata_enum_android_automotive_location_t; +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(0); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(1); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(2); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(3); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(4); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(5); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(6); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(7); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(8); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(9); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(10); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(11); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(12); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(13); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(14); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_lens_facing(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_lens_facing as acamera_metadata_enum_android_automotive_lens_facing_t; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata { + _unused: [u8; 0], +} +pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; +pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; +pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; +pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; +pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; +pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; +pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; +pub type _bindgen_ty_63 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata_rational { + pub numerator: i32, + pub denominator: i32, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_rational() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).numerator as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(numerator) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).denominator as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(denominator) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ACameraMetadata_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_entry__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ACameraMetadata_entry__bindgen_ty_1 { + pub u8_: *mut u8, + pub i32_: *mut i32, + pub f: *mut f32, + pub i64_: *mut i64, + pub d: *mut f64, + pub r: *mut ACameraMetadata_rational, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 4usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ACameraMetadata_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry() { + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(count) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(data) + ) + ); } -#[repr(transparent)] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - pub ::std::os::raw::c_uint, -); -pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct ACameraMetadata_const_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_const_entry__bindgen_ty_1, } -pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; -pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; -pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; -pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; -pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; -pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; -pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; -pub type _bindgen_ty_61 = ::std::os::raw::c_uint; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata_rational { - pub numerator: i32, - pub denominator: i32, +#[derive(Copy, Clone)] +pub union ACameraMetadata_const_entry__bindgen_ty_1 { + pub u8_: *const u8, + pub i32_: *const i32, + pub f: *const f32, + pub i64_: *const i64, + pub d: *const f64, + pub r: *const ACameraMetadata_rational, } #[test] -fn bindgen_test_layout_ACameraMetadata_rational() { +fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 8usize, - concat!("Size of: ", stringify!(ACameraMetadata_rational)) + ::std::mem::size_of::(), + 4usize, + concat!( + "Size of: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + concat!( + "Alignment of ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_const_entry() { + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).type_ as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(type_) + ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).numerator as *const _ as usize + &(*(::std::ptr::null::())).count as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(numerator) + stringify!(count) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).denominator as *const _ as usize + &(*(::std::ptr::null::())).data as *const _ as usize }, - 4usize, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(denominator) + stringify!(data) ) ); } +extern "C" { + pub fn ACameraMetadata_getConstEntry( + metadata: *const ACameraMetadata, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_getAllTags( + metadata: *const ACameraMetadata, + numEntries: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; +} +extern "C" { + pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); +} +extern "C" { + pub fn ACameraMetadata_isLogicalMultiCamera( + staticMetadata: *const ACameraMetadata, + numPhysicalCameras: *mut size_t, + physicalCameraIds: *mut *const *const ::std::os::raw::c_char, + ) -> bool; +} +extern "C" { + pub fn ACameraMetadata_fromCameraMetadata( + env: *mut JNIEnv, + cameraMetadata: jobject, + ) -> *mut ACameraMetadata; +} +pub type ACameraWindowType = ANativeWindow; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_entry__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTargets { + _unused: [u8; 0], } #[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_entry__bindgen_ty_1 { - pub u8_: *mut u8, - pub i32_: *mut i32, - pub f: *mut f32, - pub i64_: *mut i64, - pub d: *mut f64, - pub r: *mut ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTarget { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACaptureRequest { + _unused: [u8; 0], +} +extern "C" { + pub fn ACameraOutputTarget_create( + window: *mut ACameraWindowType, + output: *mut *mut ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); +} +extern "C" { + pub fn ACaptureRequest_addTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_removeTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry( + request: *const ACaptureRequest, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getAllTags( + request: *const ACaptureRequest, + numTags: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_u8( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i32( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_float( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i64( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_double( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_rational( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_free(request: *mut ACaptureRequest); +} +extern "C" { + pub fn ACaptureRequest_setUserContext( + request: *mut ACaptureRequest, + context: *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getUserContext( + request: *const ACaptureRequest, + context: *mut *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry_physicalCamera( + request: *const ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_u8( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i32( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_float( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i64( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_double( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_rational( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession { + _unused: [u8; 0], +} +pub type ACameraCaptureSession_stateCallback = ::std::option::Option< + unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_stateCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onClosed: ACameraCaptureSession_stateCallback, + pub onReady: ACameraCaptureSession_stateCallback, + pub onActive: ACameraCaptureSession_stateCallback, } #[test] -fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { - assert_eq!( - ::std::mem::size_of::(), - 4usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) - ); +fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { assert_eq!( - ::std::mem::align_of::(), - 4usize, + ::std::mem::size_of::(), + 16usize, concat!( - "Alignment of ", - stringify!(ACameraMetadata_entry__bindgen_ty_1) + "Size of: ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 4usize, concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(u8_) + "Alignment of ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(i32_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).f as *const _ as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ + &(*(::std::ptr::null::())).onClosed as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(i64_) + stringify!(onClosed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ as usize + &(*(::std::ptr::null::())).onReady as *const _ + as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(d) + stringify!(onReady) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ as usize + &(*(::std::ptr::null::())).onActive as *const _ + as usize }, - 0usize, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(r) + stringify!(onActive) ) ); } +pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; +pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; +pub type _bindgen_ty_64 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureFailure { + pub frameNumber: i64, + pub reason: ::std::os::raw::c_int, + pub sequenceId: ::std::os::raw::c_int, + pub wasImageCaptured: bool, +} #[test] -fn bindgen_test_layout_ACameraMetadata_entry() { +fn bindgen_test_layout_ACameraCaptureFailure() { assert_eq!( - ::std::mem::size_of::(), - 16usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry)) + ::std::mem::size_of::(), + 20usize, + concat!("Size of: ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + concat!("Alignment of ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).frameNumber as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(tag) + stringify!(frameNumber) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, - 4usize, + unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(type_) + stringify!(reason) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())).sequenceId as *const _ as usize + }, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(count) + stringify!(sequenceId) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, - 12usize, + unsafe { + &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + }, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(data) + stringify!(wasImageCaptured) ) ); } +pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *const ACaptureRequest, + timestamp: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + ), +>; +pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ACameraCaptureFailure, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + frameNumber: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + ), +>; +pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + window: *mut ACameraWindowType, + frameNumber: i64, + ), +>; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_const_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_const_entry__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_const_entry__bindgen_ty_1 { - pub u8_: *const u8, - pub i32_: *const i32, - pub f: *const f32, - pub i64_: *const i64, - pub d: *const f64, - pub r: *const ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_captureCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, + pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { assert_eq!( - ::std::mem::size_of::(), - 4usize, + ::std::mem::size_of::(), + 32usize, concat!( "Size of: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(u8_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(i32_) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).f as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureStarted + as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(i64_) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureProgressed + as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(d) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureCompleted + as *const _ as usize }, - 0usize, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(r) + stringify!(onCaptureCompleted) ) ); -} -#[test] -fn bindgen_test_layout_ACameraMetadata_const_entry() { assert_eq!( - ::std::mem::size_of::(), + unsafe { + &(*(::std::ptr::null::())).onCaptureFailed + as *const _ as usize + }, 16usize, - concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) - ); - assert_eq!( - ::std::mem::align_of::(), - 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) - ); - assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, - 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(tag) + stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).type_ as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize }, - 4usize, + 20usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(type_) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).count as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 8usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(count) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ as usize + &(*(::std::ptr::null::())).onCaptureBufferLost + as *const _ as usize }, - 12usize, + 28usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(data) + stringify!(onCaptureBufferLost) ) ); } +pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; +pub type _bindgen_ty_65 = ::std::os::raw::c_int; extern "C" { - pub fn ACameraMetadata_getConstEntry( - metadata: *const ACameraMetadata, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_getAllTags( - metadata: *const ACameraMetadata, - numEntries: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; -} -extern "C" { - pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); -} -extern "C" { - pub fn ACameraMetadata_isLogicalMultiCamera( - staticMetadata: *const ACameraMetadata, - numPhysicalCameras: *mut size_t, - physicalCameraIds: *mut *const *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn ACameraMetadata_fromCameraMetadata( - env: *mut JNIEnv, - cameraMetadata: jobject, - ) -> *mut ACameraMetadata; -} -pub type ACameraWindowType = ANativeWindow; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTargets { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTarget { - _unused: [u8; 0], + pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACaptureRequest { +pub struct ACameraDevice { _unused: [u8; 0], } extern "C" { - pub fn ACameraOutputTarget_create( - window: *mut ACameraWindowType, - output: *mut *mut ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); -} -extern "C" { - pub fn ACaptureRequest_addTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_removeTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry( - request: *const ACaptureRequest, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getAllTags( - request: *const ACaptureRequest, - numTags: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_u8( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i32( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_float( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i64( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_double( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_rational( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_free(request: *mut ACaptureRequest); -} -extern "C" { - pub fn ACaptureRequest_setUserContext( - request: *mut ACaptureRequest, - context: *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getUserContext( - request: *const ACaptureRequest, - context: *mut *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry_physicalCamera( - request: *const ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_u8( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i32( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i32, + pub fn ACameraCaptureSession_getDevice( + session: *mut ACameraCaptureSession, + device: *mut *mut ACameraDevice, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_float( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f32, + pub fn ACameraCaptureSession_capture( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i64( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i64, + pub fn ACameraCaptureSession_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_double( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f64, + pub fn ACameraCaptureSession_stopRepeating( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_rational( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, + pub fn ACameraCaptureSession_abortCaptures( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession { +pub struct ACaptureSessionOutput { _unused: [u8; 0], } -pub type ACameraCaptureSession_stateCallback = ::std::option::Option< - unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +extern "C" { + pub fn ACameraCaptureSession_updateSharedOutput( + session: *mut ACameraCaptureSession, + output: *mut ACaptureSessionOutput, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + physicalResultCount: size_t, + physicalCameraIds: *mut *const ::std::os::raw::c_char, + physicalResults: *mut *const ACameraMetadata, + ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_stateCallbacks { +pub struct ALogicalCameraCaptureFailure { + pub captureFailure: ACameraCaptureFailure, + pub physicalCameraId: *const ::std::os::raw::c_char, +} +#[test] +fn bindgen_test_layout_ALogicalCameraCaptureFailure() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).captureFailure as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(captureFailure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).physicalCameraId as *const _ + as usize + }, + 20usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(physicalCameraId) + ) + ); +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ALogicalCameraCaptureFailure, + ), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { pub context: *mut ::std::os::raw::c_void, - pub onClosed: ACameraCaptureSession_stateCallback, - pub onReady: ACameraCaptureSession_stateCallback, - pub onActive: ACameraCaptureSession_stateCallback, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, + pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { assert_eq!( - ::std::mem::size_of::(), - 16usize, + ::std::mem::size_of::(), + 32usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ - as usize + &(*(::std::ptr::null::())).context + as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onClosed as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureStarted as *const _ as usize }, 4usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onClosed) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onReady as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureProgressed as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onReady) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onActive as *const _ - as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureCompleted as *const _ as usize }, 12usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onActive) + stringify!(onLogicalCameraCaptureCompleted) ) ); -} -pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; -pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_62 = ::std::os::raw::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureFailure { - pub frameNumber: i64, - pub reason: ::std::os::raw::c_int, - pub sequenceId: ::std::os::raw::c_int, - pub wasImageCaptured: bool, -} -#[test] -fn bindgen_test_layout_ACameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 20usize, - concat!("Size of: ", stringify!(ACameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 4usize, - concat!("Alignment of ", stringify!(ACameraCaptureFailure)) - ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).frameNumber as *const _ as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureFailed as *const _ as usize }, - 0usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(frameNumber) + stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize + }, + 20usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(reason) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).sequenceId as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 12usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(sequenceId) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureBufferLost as *const _ as usize }, - 16usize, + 28usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(wasImageCaptured) + stringify!(onCaptureBufferLost) ) - ); -} -pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *const ACaptureRequest, - timestamp: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - ), ->; -pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ACameraCaptureFailure, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - frameNumber: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, + ); +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_capture( session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - ), ->; -pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_captureCallback_startV2 = ::std::option::Option< unsafe extern "C" fn( context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - window: *mut ACameraWindowType, + request: *const ACaptureRequest, + timestamp: i64, frameNumber: i64, ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_captureCallbacks { +pub struct ACameraCaptureSession_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, @@ -20349,252 +22315,133 @@ pub struct ACameraCaptureSession_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 32usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureStarted + &(*(::std::ptr::null::())).onCaptureStarted as *const _ as usize }, 4usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureProgressed + &(*(::std::ptr::null::())).onCaptureProgressed as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureCompleted + &(*(::std::ptr::null::())).onCaptureCompleted as *const _ as usize }, 12usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureFailed + &(*(::std::ptr::null::())).onCaptureFailed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 20usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureBufferLost + &(*(::std::ptr::null::())).onCaptureBufferLost as *const _ as usize }, 28usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } -pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_63 = ::std::os::raw::c_int; -extern "C" { - pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraDevice { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_getDevice( - session: *mut ACameraCaptureSession, - device: *mut *mut ACameraDevice, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_capture( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_setRepeatingRequest( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_stopRepeating( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_abortCaptures( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACaptureSessionOutput { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_updateSharedOutput( - session: *mut ACameraCaptureSession, - output: *mut ACaptureSessionOutput, - ) -> camera_status_t; -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - physicalResultCount: size_t, - physicalCameraIds: *mut *const ::std::os::raw::c_char, - physicalResults: *mut *const ACameraMetadata, - ), ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ALogicalCameraCaptureFailure { - pub captureFailure: ACameraCaptureFailure, - pub physicalCameraId: *const ::std::os::raw::c_char, -} -#[test] -fn bindgen_test_layout_ALogicalCameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 4usize, - concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).captureFailure as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(captureFailure) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).physicalCameraId as *const _ - as usize - }, - 20usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(physicalCameraId) - ) - ); -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ALogicalCameraCaptureFailure, - ), ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { +pub struct ACameraCaptureSession_logicalCamera_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, @@ -20603,141 +22450,159 @@ pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 32usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context - as *const _ as usize + &(*(::std::ptr::null::())) + .context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureStarted as *const _ as usize }, 4usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureProgressed as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureCompleted as *const _ as usize }, 12usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureFailed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 20usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureBufferLost as *const _ as usize }, 28usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_capture( + pub fn ACameraCaptureSession_captureV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + pub fn ACameraCaptureSession_setRepeatingRequestV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_captureV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, @@ -20787,7 +22652,7 @@ pub const ERROR_MAX_CAMERAS_IN_USE: ::std::os::raw::c_uint = 2; pub const ERROR_CAMERA_DISABLED: ::std::os::raw::c_uint = 3; pub const ERROR_CAMERA_DEVICE: ::std::os::raw::c_uint = 4; pub const ERROR_CAMERA_SERVICE: ::std::os::raw::c_uint = 5; -pub type _bindgen_ty_64 = ::std::os::raw::c_uint; +pub type _bindgen_ty_66 = ::std::os::raw::c_uint; pub type ACameraDevice_StateCallback = ::std::option::Option< unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, device: *mut ACameraDevice), >; @@ -22137,6 +24002,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_PICTURE_TYPE: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE: *const ::std::os::raw::c_char; +} extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_B_MAX: *const ::std::os::raw::c_char; } @@ -22161,6 +24035,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_P_MIN: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT: *const ::std::os::raw::c_char; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaCodec { @@ -22242,7 +24125,7 @@ pub const AMEDIACODEC_CONFIGURE_FLAG_ENCODE: ::std::os::raw::c_int = 1; pub const AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED: ::std::os::raw::c_int = -3; pub const AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED: ::std::os::raw::c_int = -2; pub const AMEDIACODEC_INFO_TRY_AGAIN_LATER: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_65 = ::std::os::raw::c_int; +pub type _bindgen_ty_67 = ::std::os::raw::c_int; pub type AMediaCodecOnAsyncInputAvailable = ::std::option::Option< unsafe extern "C" fn( codec: *mut AMediaCodec, @@ -22350,6 +24233,14 @@ fn bindgen_test_layout_AMediaCodecOnAsyncNotifyCallback() { ) ); } +pub type AMediaCodecOnFrameRendered = ::std::option::Option< + unsafe extern "C" fn( + codec: *mut AMediaCodec, + userdata: *mut ::std::os::raw::c_void, + mediaTimeUs: i64, + systemNano: i64, + ), +>; extern "C" { pub fn AMediaCodec_createCodecByName(name: *const ::std::os::raw::c_char) -> *mut AMediaCodec; } @@ -22511,6 +24402,13 @@ extern "C" { userdata: *mut ::std::os::raw::c_void, ) -> media_status_t; } +extern "C" { + pub fn AMediaCodec_setOnFrameRenderedCallback( + arg1: *mut AMediaCodec, + callback: AMediaCodecOnFrameRendered, + userdata: *mut ::std::os::raw::c_void, + ) -> media_status_t; +} extern "C" { pub fn AMediaCodec_releaseCrypto(arg1: *mut AMediaCodec) -> media_status_t; } @@ -22785,6 +24683,24 @@ impl AMediaDrmKeyType { #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AMediaDrmKeyType(pub ::std::os::raw::c_uint); +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_INITIAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(0); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RENEWAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(1); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RELEASE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(2); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_NONE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(3); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_UPDATE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(4); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMediaDrmKeyRequestType(pub i32); #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaDrmKeyValuePair { @@ -22965,6 +24881,22 @@ extern "C" { keyRequestSize: *mut size_t, ) -> media_status_t; } +extern "C" { + pub fn AMediaDrm_getKeyRequestWithDefaultUrlAndType( + arg1: *mut AMediaDrm, + scope: *const AMediaDrmScope, + init: *const u8, + initSize: size_t, + mimeType: *const ::std::os::raw::c_char, + keyType: AMediaDrmKeyType, + optionalParameters: *const AMediaDrmKeyValue, + numOptionalParameters: size_t, + keyRequest: *mut *const u8, + keyRequestSize: *mut size_t, + defaultUrl: *mut *const ::std::os::raw::c_char, + keyRequestType: *mut AMediaDrmKeyRequestType, + ) -> media_status_t; +} extern "C" { pub fn AMediaDrm_provideKeyResponse( arg1: *mut AMediaDrm, @@ -23285,7 +25217,7 @@ extern "C" { } pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC: ::std::os::raw::c_uint = 1; pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_66 = ::std::os::raw::c_uint; +pub type _bindgen_ty_68 = ::std::os::raw::c_uint; extern "C" { pub fn AMediaExtractor_getFileFormat(arg1: *mut AMediaExtractor) -> *mut AMediaFormat; } diff --git a/ndk-sys/src/ffi_x86_64.rs b/ndk-sys/src/ffi_x86_64.rs index 5e912439..6271be29 100644 --- a/ndk-sys/src/ffi_x86_64.rs +++ b/ndk-sys/src/ffi_x86_64.rs @@ -34,10 +34,10 @@ pub const __BIONIC__: u32 = 1; pub const __WORDSIZE: u32 = 64; pub const __bos_level: u32 = 0; pub const __ANDROID_NDK__: u32 = 1; -pub const __NDK_MAJOR__: u32 = 23; -pub const __NDK_MINOR__: u32 = 1; +pub const __NDK_MAJOR__: u32 = 25; +pub const __NDK_MINOR__: u32 = 0; pub const __NDK_BETA__: u32 = 0; -pub const __NDK_BUILD__: u32 = 7779620; +pub const __NDK_BUILD__: u32 = 8775105; pub const __NDK_CANARY__: u32 = 0; pub const __ANDROID_API_FUTURE__: u32 = 10000; pub const __ANDROID_API__: u32 = 10000; @@ -395,6 +395,8 @@ pub const SO_DETACH_REUSEPORT_BPF: u32 = 68; pub const SO_PREFER_BUSY_POLL: u32 = 69; pub const SO_BUSY_POLL_BUDGET: u32 = 70; pub const SO_NETNS_COOKIE: u32 = 71; +pub const SO_BUF_LOCK: u32 = 72; +pub const SO_RESERVE_MEM: u32 = 73; pub const SO_TIMESTAMP: u32 = 29; pub const SO_TIMESTAMPNS: u32 = 35; pub const SO_TIMESTAMPING: u32 = 37; @@ -1883,6 +1885,9 @@ impl AndroidBitmapFormat { impl AndroidBitmapFormat { pub const ANDROID_BITMAP_FORMAT_RGBA_F16: AndroidBitmapFormat = AndroidBitmapFormat(9); } +impl AndroidBitmapFormat { + pub const ANDROID_BITMAP_FORMAT_RGBA_1010102: AndroidBitmapFormat = AndroidBitmapFormat(10); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AndroidBitmapFormat(pub ::std::os::raw::c_uint); @@ -2040,12 +2045,24 @@ extern "C" { pub struct AChoreographer { _unused: [u8; 0], } +pub type AVsyncId = i64; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct AChoreographerFrameCallbackData { + _unused: [u8; 0], +} pub type AChoreographer_frameCallback = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: ::std::os::raw::c_long, data: *mut ::std::os::raw::c_void), >; pub type AChoreographer_frameCallback64 = ::std::option::Option< unsafe extern "C" fn(frameTimeNanos: i64, data: *mut ::std::os::raw::c_void), >; +pub type AChoreographer_vsyncCallback = ::std::option::Option< + unsafe extern "C" fn( + callbackData: *const AChoreographerFrameCallbackData, + data: *mut ::std::os::raw::c_void, + ), +>; pub type AChoreographer_refreshRateCallback = ::std::option::Option< unsafe extern "C" fn(vsyncPeriodNanos: i64, data: *mut ::std::os::raw::c_void), >; @@ -2082,6 +2099,13 @@ extern "C" { delayMillis: u32, ); } +extern "C" { + pub fn AChoreographer_postVsyncCallback( + choreographer: *mut AChoreographer, + callback: AChoreographer_vsyncCallback, + data: *mut ::std::os::raw::c_void, + ); +} extern "C" { pub fn AChoreographer_registerRefreshRateCallback( choreographer: *mut AChoreographer, @@ -2096,6 +2120,39 @@ extern "C" { data: *mut ::std::os::raw::c_void, ); } +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimeNanos( + data: *const AChoreographerFrameCallbackData, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelinesLength( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getPreferredFrameTimelineIndex( + data: *const AChoreographerFrameCallbackData, + ) -> size_t; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineVsyncId( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> AVsyncId; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} +extern "C" { + pub fn AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos( + data: *const AChoreographerFrameCallbackData, + index: size_t, + ) -> i64; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AConfiguration { @@ -2427,6 +2484,90 @@ extern "C" { impl ADataSpace { pub const ADATASPACE_UNKNOWN: ADataSpace = ADataSpace(0); } +impl ADataSpace { + pub const STANDARD_MASK: ADataSpace = ADataSpace(4128768); +} +impl ADataSpace { + pub const STANDARD_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const STANDARD_BT709: ADataSpace = ADataSpace(65536); +} +impl ADataSpace { + pub const STANDARD_BT601_625: ADataSpace = ADataSpace(131072); +} +impl ADataSpace { + pub const STANDARD_BT601_625_UNADJUSTED: ADataSpace = ADataSpace(196608); +} +impl ADataSpace { + pub const STANDARD_BT601_525: ADataSpace = ADataSpace(262144); +} +impl ADataSpace { + pub const STANDARD_BT601_525_UNADJUSTED: ADataSpace = ADataSpace(327680); +} +impl ADataSpace { + pub const STANDARD_BT2020: ADataSpace = ADataSpace(393216); +} +impl ADataSpace { + pub const STANDARD_BT2020_CONSTANT_LUMINANCE: ADataSpace = ADataSpace(458752); +} +impl ADataSpace { + pub const STANDARD_BT470M: ADataSpace = ADataSpace(524288); +} +impl ADataSpace { + pub const STANDARD_FILM: ADataSpace = ADataSpace(589824); +} +impl ADataSpace { + pub const STANDARD_DCI_P3: ADataSpace = ADataSpace(655360); +} +impl ADataSpace { + pub const STANDARD_ADOBE_RGB: ADataSpace = ADataSpace(720896); +} +impl ADataSpace { + pub const TRANSFER_MASK: ADataSpace = ADataSpace(130023424); +} +impl ADataSpace { + pub const TRANSFER_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const TRANSFER_LINEAR: ADataSpace = ADataSpace(4194304); +} +impl ADataSpace { + pub const TRANSFER_SRGB: ADataSpace = ADataSpace(8388608); +} +impl ADataSpace { + pub const TRANSFER_SMPTE_170M: ADataSpace = ADataSpace(12582912); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_2: ADataSpace = ADataSpace(16777216); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_6: ADataSpace = ADataSpace(20971520); +} +impl ADataSpace { + pub const TRANSFER_GAMMA2_8: ADataSpace = ADataSpace(25165824); +} +impl ADataSpace { + pub const TRANSFER_ST2084: ADataSpace = ADataSpace(29360128); +} +impl ADataSpace { + pub const TRANSFER_HLG: ADataSpace = ADataSpace(33554432); +} +impl ADataSpace { + pub const RANGE_MASK: ADataSpace = ADataSpace(939524096); +} +impl ADataSpace { + pub const RANGE_UNSPECIFIED: ADataSpace = ADataSpace(0); +} +impl ADataSpace { + pub const RANGE_FULL: ADataSpace = ADataSpace(134217728); +} +impl ADataSpace { + pub const RANGE_LIMITED: ADataSpace = ADataSpace(268435456); +} +impl ADataSpace { + pub const RANGE_EXTENDED: ADataSpace = ADataSpace(402653184); +} impl ADataSpace { pub const ADATASPACE_SCRGB_LINEAR: ADataSpace = ADataSpace(406913024); } @@ -2442,9 +2583,21 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_BT2020_PQ: ADataSpace = ADataSpace(163971072); } +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_PQ: ADataSpace = ADataSpace(298188800); +} impl ADataSpace { pub const ADATASPACE_ADOBE_RGB: ADataSpace = ADataSpace(151715840); } +impl ADataSpace { + pub const ADATASPACE_JFIF: ADataSpace = ADataSpace(146931712); +} +impl ADataSpace { + pub const ADATASPACE_BT601_625: ADataSpace = ADataSpace(281149440); +} +impl ADataSpace { + pub const ADATASPACE_BT601_525: ADataSpace = ADataSpace(281280512); +} impl ADataSpace { pub const ADATASPACE_BT2020: ADataSpace = ADataSpace(147193856); } @@ -2457,6 +2610,18 @@ impl ADataSpace { impl ADataSpace { pub const ADATASPACE_SRGB_LINEAR: ADataSpace = ADataSpace(138477568); } +impl ADataSpace { + pub const ADATASPACE_BT2020_HLG: ADataSpace = ADataSpace(168165376); +} +impl ADataSpace { + pub const ADATASPACE_BT2020_ITU_HLG: ADataSpace = ADataSpace(302383104); +} +impl ADataSpace { + pub const DEPTH: ADataSpace = ADataSpace(4096); +} +impl ADataSpace { + pub const DYNAMIC_DEPTH: ADataSpace = ADataSpace(4098); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct ADataSpace(pub ::std::os::raw::c_uint); @@ -2823,6 +2988,13 @@ impl AHardwareBuffer_Format { pub const AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: AHardwareBuffer_Format = AHardwareBuffer_Format(35); } +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_YCbCr_P010: AHardwareBuffer_Format = + AHardwareBuffer_Format(54); +} +impl AHardwareBuffer_Format { + pub const AHARDWAREBUFFER_FORMAT_R8_UNORM: AHardwareBuffer_Format = AHardwareBuffer_Format(56); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AHardwareBuffer_Format(pub ::std::os::raw::c_uint); @@ -4042,6 +4214,7 @@ pub const AINPUT_EVENT_TYPE_MOTION: ::std::os::raw::c_uint = 2; pub const AINPUT_EVENT_TYPE_FOCUS: ::std::os::raw::c_uint = 3; pub const AINPUT_EVENT_TYPE_CAPTURE: ::std::os::raw::c_uint = 4; pub const AINPUT_EVENT_TYPE_DRAG: ::std::os::raw::c_uint = 5; +pub const AINPUT_EVENT_TYPE_TOUCH_MODE: ::std::os::raw::c_uint = 6; pub type _bindgen_ty_17 = ::std::os::raw::c_uint; pub const AKEY_EVENT_ACTION_DOWN: ::std::os::raw::c_uint = 0; pub const AKEY_EVENT_ACTION_UP: ::std::os::raw::c_uint = 1; @@ -4144,6 +4317,20 @@ pub const AMOTION_EVENT_TOOL_TYPE_MOUSE: ::std::os::raw::c_uint = 3; pub const AMOTION_EVENT_TOOL_TYPE_ERASER: ::std::os::raw::c_uint = 4; pub const AMOTION_EVENT_TOOL_TYPE_PALM: ::std::os::raw::c_uint = 5; pub type _bindgen_ty_25 = ::std::os::raw::c_uint; +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_NONE: AMotionClassification = AMotionClassification(0); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE: AMotionClassification = + AMotionClassification(1); +} +impl AMotionClassification { + pub const AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS: AMotionClassification = + AMotionClassification(2); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMotionClassification(pub u32); pub const AINPUT_SOURCE_CLASS_MASK: ::std::os::raw::c_uint = 255; pub const AINPUT_SOURCE_CLASS_NONE: ::std::os::raw::c_uint = 0; pub const AINPUT_SOURCE_CLASS_BUTTON: ::std::os::raw::c_uint = 1; @@ -4419,6 +4606,12 @@ extern "C" { history_index: size_t, ) -> f32; } +extern "C" { + pub fn AMotionEvent_getActionButton(motion_event: *const AInputEvent) -> i32; +} +extern "C" { + pub fn AMotionEvent_getClassification(motion_event: *const AInputEvent) -> i32; +} extern "C" { pub fn AMotionEvent_fromJava(env: *mut JNIEnv, motionEvent: jobject) -> *const AInputEvent; } @@ -4455,6 +4648,9 @@ extern "C" { handled: ::std::os::raw::c_int, ); } +extern "C" { + pub fn AInputQueue_fromJava(env: *mut JNIEnv, inputQueue: jobject) -> *mut AInputQueue; +} impl android_LogPriority { pub const ANDROID_LOG_UNKNOWN: android_LogPriority = android_LogPriority(0); } @@ -6579,6 +6775,133 @@ fn bindgen_test_layout_mallinfo() { extern "C" { pub fn mallinfo() -> mallinfo; } +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct mallinfo2 { + pub arena: size_t, + pub ordblks: size_t, + pub smblks: size_t, + pub hblks: size_t, + pub hblkhd: size_t, + pub usmblks: size_t, + pub fsmblks: size_t, + pub uordblks: size_t, + pub fordblks: size_t, + pub keepcost: size_t, +} +#[test] +fn bindgen_test_layout_mallinfo2() { + assert_eq!( + ::std::mem::size_of::(), + 80usize, + concat!("Size of: ", stringify!(mallinfo2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(mallinfo2)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).arena as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(arena) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ordblks as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(ordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).smblks as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(smblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblks as *const _ as usize }, + 24usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).hblkhd as *const _ as usize }, + 32usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(hblkhd) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).usmblks as *const _ as usize }, + 40usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(usmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fsmblks as *const _ as usize }, + 48usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fsmblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).uordblks as *const _ as usize }, + 56usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(uordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).fordblks as *const _ as usize }, + 64usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(fordblks) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).keepcost as *const _ as usize }, + 72usize, + concat!( + "Offset of field: ", + stringify!(mallinfo2), + "::", + stringify!(keepcost) + ) + ); +} extern "C" { pub fn malloc_info( __must_be_zero: ::std::os::raw::c_int, @@ -7230,6 +7553,19 @@ extern "C" { extern "C" { pub fn android_res_cancel(nsend_fd: ::std::os::raw::c_int); } +extern "C" { + pub fn android_tag_socket_with_uid( + sockfd: ::std::os::raw::c_int, + tag: u32, + uid: uid_t, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_tag_socket(sockfd: ::std::os::raw::c_int, tag: u32) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn android_untag_socket(sockfd: ::std::os::raw::c_int) -> ::std::os::raw::c_int; +} impl ANativeWindow_LegacyFormat { pub const WINDOW_FORMAT_RGBA_8888: ANativeWindow_LegacyFormat = ANativeWindow_LegacyFormat(1); } @@ -8224,6 +8560,18 @@ impl OperationCode { impl OperationCode { pub const ANEURALNETWORKS_RANK: OperationCode = OperationCode(101); } +impl OperationCode { + pub const ANEURALNETWORKS_BATCH_MATMUL: OperationCode = OperationCode(102); +} +impl OperationCode { + pub const ANEURALNETWORKS_PACK: OperationCode = OperationCode(103); +} +impl OperationCode { + pub const ANEURALNETWORKS_MIRROR_PAD: OperationCode = OperationCode(104); +} +impl OperationCode { + pub const ANEURALNETWORKS_REVERSE: OperationCode = OperationCode(105); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct OperationCode(pub ::std::os::raw::c_uint); @@ -8296,6 +8644,15 @@ impl FeatureLevelCode { impl FeatureLevelCode { pub const ANEURALNETWORKS_FEATURE_LEVEL_5: FeatureLevelCode = FeatureLevelCode(31); } +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_6: FeatureLevelCode = FeatureLevelCode(1000006); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_7: FeatureLevelCode = FeatureLevelCode(1000007); +} +impl FeatureLevelCode { + pub const ANEURALNETWORKS_FEATURE_LEVEL_8: FeatureLevelCode = FeatureLevelCode(1000008); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct FeatureLevelCode(pub ::std::os::raw::c_uint); @@ -9586,10 +9943,17 @@ pub const ASENSOR_TYPE_POSE_6DOF: ::std::os::raw::c_int = 28; pub const ASENSOR_TYPE_STATIONARY_DETECT: ::std::os::raw::c_int = 29; pub const ASENSOR_TYPE_MOTION_DETECT: ::std::os::raw::c_int = 30; pub const ASENSOR_TYPE_HEART_BEAT: ::std::os::raw::c_int = 31; +pub const ASENSOR_TYPE_DYNAMIC_SENSOR_META: ::std::os::raw::c_int = 32; pub const ASENSOR_TYPE_ADDITIONAL_INFO: ::std::os::raw::c_int = 33; pub const ASENSOR_TYPE_LOW_LATENCY_OFFBODY_DETECT: ::std::os::raw::c_int = 34; pub const ASENSOR_TYPE_ACCELEROMETER_UNCALIBRATED: ::std::os::raw::c_int = 35; pub const ASENSOR_TYPE_HINGE_ANGLE: ::std::os::raw::c_int = 36; +pub const ASENSOR_TYPE_HEAD_TRACKER: ::std::os::raw::c_int = 37; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES: ::std::os::raw::c_int = 38; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES: ::std::os::raw::c_int = 39; +pub const ASENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 40; +pub const ASENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED: ::std::os::raw::c_int = 41; +pub const ASENSOR_TYPE_HEADING: ::std::os::raw::c_int = 42; pub type _bindgen_ty_38 = ::std::os::raw::c_int; pub const ASENSOR_STATUS_NO_CONTACT: ::std::os::raw::c_int = -1; pub const ASENSOR_STATUS_UNRELIABLE: ::std::os::raw::c_int = 0; @@ -10243,480 +10607,1228 @@ fn bindgen_test_layout_AAdditionalInfoEvent() { ); } #[repr(C)] -#[derive(Copy, Clone)] -pub struct ASensorEvent { - pub version: i32, - pub sensor: i32, - pub type_: i32, - pub reserved0: i32, - pub timestamp: i64, - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, - pub flags: u32, - pub reserved1: [i32; 3usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1 { - pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, - pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { - pub data: [f32; 16usize], - pub vector: ASensorVector, - pub acceleration: ASensorVector, - pub gyro: ASensorVector, - pub magnetic: ASensorVector, - pub temperature: f32, - pub distance: f32, - pub light: f32, - pub pressure: f32, - pub relative_humidity: f32, - pub uncalibrated_acceleration: AUncalibratedEvent, - pub uncalibrated_gyro: AUncalibratedEvent, - pub uncalibrated_magnetic: AUncalibratedEvent, - pub meta_data: AMetaDataEvent, - pub heart_rate: AHeartRateEvent, - pub dynamic_sensor_meta: ADynamicSensorEvent, - pub additional_info: AAdditionalInfoEvent, +#[derive(Debug, Copy, Clone)] +pub struct AHeadTrackerEvent { + pub rx: f32, + pub ry: f32, + pub rz: f32, + pub vx: f32, + pub vy: f32, + pub vz: f32, + pub discontinuity_count: i32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { +fn bindgen_test_layout_AHeadTrackerEvent() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!( - "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + ::std::mem::size_of::(), + 28usize, + concat!("Size of: ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 4usize, - concat!( - "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) - ) + concat!("Alignment of ", stringify!(AHeadTrackerEvent)) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize - }, + unsafe { &(*(::std::ptr::null::())).rx as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(data) + stringify!(rx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).vector as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).ry as *const _ as usize }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(vector) + stringify!(ry) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).acceleration - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).rz as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(acceleration) + stringify!(rz) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).gyro as *const _ - as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vx as *const _ as usize }, + 12usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(gyro) + stringify!(vx) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).magnetic - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vy as *const _ as usize }, + 16usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(magnetic) + stringify!(vy) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).temperature - as *const _ as usize - }, - 0usize, + unsafe { &(*(::std::ptr::null::())).vz as *const _ as usize }, + 20usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(temperature) + stringify!(vz) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).distance - as *const _ as usize + &(*(::std::ptr::null::())).discontinuity_count as *const _ as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(AHeadTrackerEvent), "::", - stringify!(distance) + stringify!(discontinuity_count) ) ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ALimitedAxesImuEvent { + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuEvent__bindgen_ty_2, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_1 { + pub calib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1 { + pub x: f32, + pub y: f32, + pub z: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - unsafe { - &(*(::std::ptr::null::())).light as *const _ - as usize - }, - 0usize, + ::std::mem::size_of::(), + 12usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(light) + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).pressure - as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 4usize, concat!( - "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), - "::", - stringify!(pressure) + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).relative_humidity + &(*(::std::ptr::null::())).x as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(relative_humidity) + stringify!(x) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_acceleration as *const _ as usize + &(*(::std::ptr::null::())).y + as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_acceleration) + stringify!(y) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).uncalibrated_gyro + &(*(::std::ptr::null::())).z as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(uncalibrated_gyro) + stringify!(z) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) - .uncalibrated_magnetic as *const _ as usize + &(*(::std::ptr::null::())).calib as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_1), "::", - stringify!(uncalibrated_magnetic) + stringify!(calib) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuEvent__bindgen_ty_2 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).meta_data + &(*(::std::ptr::null::())).x_supported as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(meta_data) + stringify!(x_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).heart_rate + &(*(::std::ptr::null::())).y_supported as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(heart_rate) + stringify!(y_supported) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).dynamic_sensor_meta + &(*(::std::ptr::null::())).z_supported as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(dynamic_sensor_meta) + stringify!(z_supported) + ) + ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent__bindgen_ty_2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuEvent__bindgen_ty_2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).additional_info - as *const _ as usize + &(*(::std::ptr::null::())).supported as *const _ + as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + stringify!(ALimitedAxesImuEvent__bindgen_ty_2), "::", - stringify!(additional_info) + stringify!(supported) ) ); } +#[test] +fn bindgen_test_layout_ALimitedAxesImuEvent() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ALimitedAxesImuEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ALimitedAxesImuEvent)) + ); +} #[repr(C)] #[derive(Copy, Clone)] -pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { - pub data: [u64; 8usize], - pub step_counter: u64, +pub struct ALimitedAxesImuUncalibratedEvent { + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1, + pub __bindgen_anon_2: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2, + pub __bindgen_anon_3: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_1 { + pub uncalib: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1 { + pub x_uncalib: f32, + pub y_uncalib: f32, + pub z_uncalib: f32, } #[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, + ::std::mem::size_of::(), + 12usize, concat!( "Size of: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( - ::std::mem::align_of::(), - 8usize, + ::std::mem::align_of::(), + 4usize, concat!( "Alignment of ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ - as usize + &(*(::std::ptr::null::())) + .x_uncalib as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(data) + stringify!(x_uncalib) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).step_counter - as *const _ as usize + &(*(::std::ptr::null::())) + .y_uncalib as *const _ as usize }, - 0usize, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), "::", - stringify!(step_counter) + stringify!(y_uncalib) ) ); -} -#[test] -fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 64usize, - concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + unsafe { + &(*(::std::ptr::null::())) + .z_uncalib as *const _ as usize + }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(z_uncalib) + ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_1() { assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalib + as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent__bindgen_ty_1), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_1), "::", - stringify!(u64_) + stringify!(uncalib) ) ); } +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_2 { + pub bias: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1 { + pub x_bias: f32, + pub y_bias: f32, + pub z_bias: f32, +} #[test] -fn bindgen_test_layout_ASensorEvent() { +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), - 104usize, - concat!("Size of: ", stringify!(ASensorEvent)) + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ASensorEvent)) + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1) + ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .x_bias as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(version) + stringify!(x_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .y_bias as *const _ as usize + }, 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(sensor) + stringify!(y_bias) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())) + .z_bias as *const _ as usize + }, 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2__bindgen_ty_1), "::", - stringify!(type_) + stringify!(z_bias) ) ); +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_2() { assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + ::std::mem::size_of::(), 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).bias + as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_2), "::", - stringify!(reserved0) + stringify!(bias) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ALimitedAxesImuUncalibratedEvent__bindgen_ty_3 { + pub supported: [f32; 3usize], + pub __bindgen_anon_1: ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1 { + pub x_supported: f32, + pub y_supported: f32, + pub z_supported: f32, +} +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, - 16usize, + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .x_supported as *const _ as usize + }, + 0usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(timestamp) + stringify!(x_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, - 88usize, + unsafe { + &(*(::std::ptr::null::())) + .y_supported as *const _ as usize + }, + 4usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(flags) + stringify!(y_supported) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, - 92usize, + unsafe { + &(*(::std::ptr::null::())) + .z_supported as *const _ as usize + }, + 8usize, concat!( "Offset of field: ", - stringify!(ASensorEvent), + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3__bindgen_ty_1), "::", - stringify!(reserved1) + stringify!(z_supported) ) ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorManager { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent__bindgen_ty_3() { + assert_eq!( + ::std::mem::size_of::(), + 12usize, + concat!( + "Size of: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).supported + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALimitedAxesImuUncalibratedEvent__bindgen_ty_3), + "::", + stringify!(supported) + ) + ); } -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ASensorEventQueue { - _unused: [u8; 0], +#[test] +fn bindgen_test_layout_ALimitedAxesImuUncalibratedEvent() { + assert_eq!( + ::std::mem::size_of::(), + 36usize, + concat!("Size of: ", stringify!(ALimitedAxesImuUncalibratedEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ALimitedAxesImuUncalibratedEvent) + ) + ); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ASensor { - _unused: [u8; 0], +pub struct AHeadingEvent { + pub heading: f32, + pub accuracy: f32, } -pub type ASensorRef = *const ASensor; -pub type ASensorList = *const ASensorRef; -extern "C" { - pub fn ASensorManager_getInstance() -> *mut ASensorManager; +#[test] +fn bindgen_test_layout_AHeadingEvent() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(AHeadingEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(AHeadingEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).heading as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(heading) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).accuracy as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(AHeadingEvent), + "::", + stringify!(accuracy) + ) + ); } -extern "C" { - pub fn ASensorManager_getInstanceForPackage( - packageName: *const ::std::os::raw::c_char, - ) -> *mut ASensorManager; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ASensorEvent { + pub version: i32, + pub sensor: i32, + pub type_: i32, + pub reserved0: i32, + pub timestamp: i64, + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1, + pub flags: u32, + pub reserved1: [i32; 3usize], } -extern "C" { - pub fn ASensorManager_getSensorList( - manager: *mut ASensorManager, - list: *mut ASensorList, - ) -> ::std::os::raw::c_int; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1 { + pub __bindgen_anon_1: ASensorEvent__bindgen_ty_1__bindgen_ty_1, + pub u64_: ASensorEvent__bindgen_ty_1__bindgen_ty_2, } -extern "C" { - pub fn ASensorManager_getDefaultSensor( - manager: *mut ASensorManager, - type_: ::std::os::raw::c_int, - ) -> *const ASensor; +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_1 { + pub data: [f32; 16usize], + pub vector: ASensorVector, + pub acceleration: ASensorVector, + pub gyro: ASensorVector, + pub magnetic: ASensorVector, + pub temperature: f32, + pub distance: f32, + pub light: f32, + pub pressure: f32, + pub relative_humidity: f32, + pub uncalibrated_acceleration: AUncalibratedEvent, + pub uncalibrated_gyro: AUncalibratedEvent, + pub uncalibrated_magnetic: AUncalibratedEvent, + pub meta_data: AMetaDataEvent, + pub heart_rate: AHeartRateEvent, + pub dynamic_sensor_meta: ADynamicSensorEvent, + pub additional_info: AAdditionalInfoEvent, + pub head_tracker: AHeadTrackerEvent, + pub limited_axes_imu: ALimitedAxesImuEvent, + pub limited_axes_imu_uncalibrated: ALimitedAxesImuUncalibratedEvent, + pub heading: AHeadingEvent, } -extern "C" { - pub fn ASensorManager_getDefaultSensorEx( +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).vector as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(vector) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).acceleration + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).gyro as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).magnetic + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).temperature + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(temperature) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).distance + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(distance) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).light as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(light) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).pressure + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(pressure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).relative_humidity + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(relative_humidity) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_acceleration as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_acceleration) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uncalibrated_gyro + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_gyro) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .uncalibrated_magnetic as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(uncalibrated_magnetic) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).meta_data + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(meta_data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heart_rate + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heart_rate) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).dynamic_sensor_meta + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(dynamic_sensor_meta) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).additional_info + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(additional_info) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).head_tracker + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(head_tracker) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).limited_axes_imu + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())) + .limited_axes_imu_uncalibrated as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(limited_axes_imu_uncalibrated) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).heading as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_1), + "::", + stringify!(heading) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ASensorEvent__bindgen_ty_1__bindgen_ty_2 { + pub data: [u64; 8usize], + pub step_counter: u64, +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!( + "Size of: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(data) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).step_counter + as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1__bindgen_ty_2), + "::", + stringify!(step_counter) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, + concat!("Size of: ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ASensorEvent__bindgen_ty_1)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).u64_ as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent__bindgen_ty_1), + "::", + stringify!(u64_) + ) + ); +} +#[test] +fn bindgen_test_layout_ASensorEvent() { + assert_eq!( + ::std::mem::size_of::(), + 104usize, + concat!("Size of: ", stringify!(ASensorEvent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ASensorEvent)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(version) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).sensor as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(sensor) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved0 as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved0) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).timestamp as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(timestamp) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).flags as *const _ as usize }, + 88usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(flags) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).reserved1 as *const _ as usize }, + 92usize, + concat!( + "Offset of field: ", + stringify!(ASensorEvent), + "::", + stringify!(reserved1) + ) + ); +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorManager { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensorEventQueue { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ASensor { + _unused: [u8; 0], +} +pub type ASensorRef = *const ASensor; +pub type ASensorList = *const ASensorRef; +extern "C" { + pub fn ASensorManager_getInstance() -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getInstanceForPackage( + packageName: *const ::std::os::raw::c_char, + ) -> *mut ASensorManager; +} +extern "C" { + pub fn ASensorManager_getSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn ASensorManager_getDynamicSensorList( + manager: *mut ASensorManager, + list: *mut ASensorList, + ) -> ssize_t; +} +extern "C" { + pub fn ASensorManager_getDefaultSensor( + manager: *mut ASensorManager, + type_: ::std::os::raw::c_int, + ) -> *const ASensor; +} +extern "C" { + pub fn ASensorManager_getDefaultSensorEx( manager: *mut ASensorManager, type_: ::std::os::raw::c_int, wakeUp: bool, @@ -16494,23 +17606,81 @@ pub const AAUDIO_CONTENT_TYPE_MOVIE: ::std::os::raw::c_uint = 3; pub const AAUDIO_CONTENT_TYPE_SONIFICATION: ::std::os::raw::c_uint = 4; pub type _bindgen_ty_54 = ::std::os::raw::c_uint; pub type aaudio_content_type_t = i32; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_AUTO: ::std::os::raw::c_uint = 1; +pub const AAUDIO_SPATIALIZATION_BEHAVIOR_NEVER: ::std::os::raw::c_uint = 2; +pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type aaudio_spatialization_behavior_t = i32; pub const AAUDIO_INPUT_PRESET_GENERIC: ::std::os::raw::c_uint = 1; pub const AAUDIO_INPUT_PRESET_CAMCORDER: ::std::os::raw::c_uint = 5; pub const AAUDIO_INPUT_PRESET_VOICE_RECOGNITION: ::std::os::raw::c_uint = 6; pub const AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION: ::std::os::raw::c_uint = 7; pub const AAUDIO_INPUT_PRESET_UNPROCESSED: ::std::os::raw::c_uint = 9; pub const AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE: ::std::os::raw::c_uint = 10; -pub type _bindgen_ty_55 = ::std::os::raw::c_uint; +pub type _bindgen_ty_56 = ::std::os::raw::c_uint; pub type aaudio_input_preset_t = i32; pub const AAUDIO_ALLOW_CAPTURE_BY_ALL: ::std::os::raw::c_uint = 1; pub const AAUDIO_ALLOW_CAPTURE_BY_SYSTEM: ::std::os::raw::c_uint = 2; pub const AAUDIO_ALLOW_CAPTURE_BY_NONE: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_56 = ::std::os::raw::c_uint; +pub type _bindgen_ty_57 = ::std::os::raw::c_uint; pub type aaudio_allowed_capture_policy_t = i32; pub const AAUDIO_SESSION_ID_NONE: ::std::os::raw::c_int = -1; pub const AAUDIO_SESSION_ID_ALLOCATE: ::std::os::raw::c_int = 0; -pub type _bindgen_ty_57 = ::std::os::raw::c_int; +pub type _bindgen_ty_58 = ::std::os::raw::c_int; pub type aaudio_session_id_t = i32; +pub const AAUDIO_CHANNEL_INVALID: ::std::os::raw::c_int = -1; +pub const AAUDIO_CHANNEL_FRONT_LEFT: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_FRONT_RIGHT: ::std::os::raw::c_int = 2; +pub const AAUDIO_CHANNEL_FRONT_CENTER: ::std::os::raw::c_int = 4; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY: ::std::os::raw::c_int = 8; +pub const AAUDIO_CHANNEL_BACK_LEFT: ::std::os::raw::c_int = 16; +pub const AAUDIO_CHANNEL_BACK_RIGHT: ::std::os::raw::c_int = 32; +pub const AAUDIO_CHANNEL_FRONT_LEFT_OF_CENTER: ::std::os::raw::c_int = 64; +pub const AAUDIO_CHANNEL_FRONT_RIGHT_OF_CENTER: ::std::os::raw::c_int = 128; +pub const AAUDIO_CHANNEL_BACK_CENTER: ::std::os::raw::c_int = 256; +pub const AAUDIO_CHANNEL_SIDE_LEFT: ::std::os::raw::c_int = 512; +pub const AAUDIO_CHANNEL_SIDE_RIGHT: ::std::os::raw::c_int = 1024; +pub const AAUDIO_CHANNEL_TOP_CENTER: ::std::os::raw::c_int = 2048; +pub const AAUDIO_CHANNEL_TOP_FRONT_LEFT: ::std::os::raw::c_int = 4096; +pub const AAUDIO_CHANNEL_TOP_FRONT_CENTER: ::std::os::raw::c_int = 8192; +pub const AAUDIO_CHANNEL_TOP_FRONT_RIGHT: ::std::os::raw::c_int = 16384; +pub const AAUDIO_CHANNEL_TOP_BACK_LEFT: ::std::os::raw::c_int = 32768; +pub const AAUDIO_CHANNEL_TOP_BACK_CENTER: ::std::os::raw::c_int = 65536; +pub const AAUDIO_CHANNEL_TOP_BACK_RIGHT: ::std::os::raw::c_int = 131072; +pub const AAUDIO_CHANNEL_TOP_SIDE_LEFT: ::std::os::raw::c_int = 262144; +pub const AAUDIO_CHANNEL_TOP_SIDE_RIGHT: ::std::os::raw::c_int = 524288; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_LEFT: ::std::os::raw::c_int = 1048576; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_CENTER: ::std::os::raw::c_int = 2097152; +pub const AAUDIO_CHANNEL_BOTTOM_FRONT_RIGHT: ::std::os::raw::c_int = 4194304; +pub const AAUDIO_CHANNEL_LOW_FREQUENCY_2: ::std::os::raw::c_int = 8388608; +pub const AAUDIO_CHANNEL_FRONT_WIDE_LEFT: ::std::os::raw::c_int = 16777216; +pub const AAUDIO_CHANNEL_FRONT_WIDE_RIGHT: ::std::os::raw::c_int = 33554432; +pub const AAUDIO_CHANNEL_MONO: ::std::os::raw::c_int = 1; +pub const AAUDIO_CHANNEL_STEREO: ::std::os::raw::c_int = 3; +pub const AAUDIO_CHANNEL_2POINT1: ::std::os::raw::c_int = 11; +pub const AAUDIO_CHANNEL_TRI: ::std::os::raw::c_int = 7; +pub const AAUDIO_CHANNEL_TRI_BACK: ::std::os::raw::c_int = 259; +pub const AAUDIO_CHANNEL_3POINT1: ::std::os::raw::c_int = 15; +pub const AAUDIO_CHANNEL_2POINT0POINT2: ::std::os::raw::c_int = 786435; +pub const AAUDIO_CHANNEL_2POINT1POINT2: ::std::os::raw::c_int = 786443; +pub const AAUDIO_CHANNEL_3POINT0POINT2: ::std::os::raw::c_int = 786439; +pub const AAUDIO_CHANNEL_3POINT1POINT2: ::std::os::raw::c_int = 786447; +pub const AAUDIO_CHANNEL_QUAD: ::std::os::raw::c_int = 51; +pub const AAUDIO_CHANNEL_QUAD_SIDE: ::std::os::raw::c_int = 1539; +pub const AAUDIO_CHANNEL_SURROUND: ::std::os::raw::c_int = 263; +pub const AAUDIO_CHANNEL_PENTA: ::std::os::raw::c_int = 55; +pub const AAUDIO_CHANNEL_5POINT1: ::std::os::raw::c_int = 63; +pub const AAUDIO_CHANNEL_5POINT1_SIDE: ::std::os::raw::c_int = 1551; +pub const AAUDIO_CHANNEL_6POINT1: ::std::os::raw::c_int = 319; +pub const AAUDIO_CHANNEL_7POINT1: ::std::os::raw::c_int = 1599; +pub const AAUDIO_CHANNEL_5POINT1POINT2: ::std::os::raw::c_int = 786495; +pub const AAUDIO_CHANNEL_5POINT1POINT4: ::std::os::raw::c_int = 184383; +pub const AAUDIO_CHANNEL_7POINT1POINT2: ::std::os::raw::c_int = 788031; +pub const AAUDIO_CHANNEL_7POINT1POINT4: ::std::os::raw::c_int = 185919; +pub const AAUDIO_CHANNEL_9POINT1POINT4: ::std::os::raw::c_int = 50517567; +pub const AAUDIO_CHANNEL_9POINT1POINT6: ::std::os::raw::c_int = 51303999; +pub const AAUDIO_CHANNEL_FRONT_BACK: ::std::os::raw::c_int = 260; +pub type _bindgen_ty_59 = ::std::os::raw::c_int; +pub type aaudio_channel_mask_t = u32; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AAudioStreamStruct { @@ -16604,6 +17774,18 @@ extern "C" { contentType: aaudio_content_type_t, ); } +extern "C" { + pub fn AAudioStreamBuilder_setSpatializationBehavior( + builder: *mut AAudioStreamBuilder, + spatializationBehavior: aaudio_spatialization_behavior_t, + ); +} +extern "C" { + pub fn AAudioStreamBuilder_setIsContentSpatialized( + builder: *mut AAudioStreamBuilder, + isSpatialized: bool, + ); +} extern "C" { pub fn AAudioStreamBuilder_setInputPreset( builder: *mut AAudioStreamBuilder, @@ -16630,7 +17812,7 @@ extern "C" { } pub const AAUDIO_CALLBACK_RESULT_CONTINUE: ::std::os::raw::c_uint = 0; pub const AAUDIO_CALLBACK_RESULT_STOP: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_58 = ::std::os::raw::c_uint; +pub type _bindgen_ty_60 = ::std::os::raw::c_uint; pub type aaudio_data_callback_result_t = i32; pub type AAudioStream_dataCallback = ::std::option::Option< unsafe extern "C" fn( @@ -16676,6 +17858,12 @@ extern "C" { extern "C" { pub fn AAudioStreamBuilder_delete(builder: *mut AAudioStreamBuilder) -> aaudio_result_t; } +extern "C" { + pub fn AAudioStreamBuilder_setChannelMask( + builder: *mut AAudioStreamBuilder, + channelMask: aaudio_channel_mask_t, + ); +} extern "C" { pub fn AAudioStream_release(stream: *mut AAudioStream) -> aaudio_result_t; } @@ -16789,6 +17977,14 @@ extern "C" { extern "C" { pub fn AAudioStream_getContentType(stream: *mut AAudioStream) -> aaudio_content_type_t; } +extern "C" { + pub fn AAudioStream_getSpatializationBehavior( + stream: *mut AAudioStream, + ) -> aaudio_spatialization_behavior_t; +} +extern "C" { + pub fn AAudioStream_isContentSpatialized(stream: *mut AAudioStream) -> bool; +} extern "C" { pub fn AAudioStream_getInputPreset(stream: *mut AAudioStream) -> aaudio_input_preset_t; } @@ -16800,6 +17996,9 @@ extern "C" { extern "C" { pub fn AAudioStream_isPrivacySensitive(stream: *mut AAudioStream) -> bool; } +extern "C" { + pub fn AAudioStream_getChannelMask(stream: *mut AAudioStream) -> aaudio_channel_mask_t; +} impl media_status_t { pub const AMEDIA_OK: media_status_t = media_status_t(0); } @@ -16907,11 +18106,43 @@ pub struct AMidiOutputPort { } pub const AMIDI_OPCODE_DATA: ::std::os::raw::c_uint = 1; pub const AMIDI_OPCODE_FLUSH: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_59 = ::std::os::raw::c_uint; +pub type _bindgen_ty_61 = ::std::os::raw::c_uint; pub const AMIDI_DEVICE_TYPE_USB: ::std::os::raw::c_uint = 1; pub const AMIDI_DEVICE_TYPE_VIRTUAL: ::std::os::raw::c_uint = 2; pub const AMIDI_DEVICE_TYPE_BLUETOOTH: ::std::os::raw::c_uint = 3; -pub type _bindgen_ty_60 = ::std::os::raw::c_uint; +pub type _bindgen_ty_62 = ::std::os::raw::c_uint; +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_USE_MIDI_CI: AMidiDevice_Protocol = AMidiDevice_Protocol(0); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(1); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_64_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(2); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS: AMidiDevice_Protocol = + AMidiDevice_Protocol(3); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_1_0_UP_TO_128_BITS_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(4); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0: AMidiDevice_Protocol = AMidiDevice_Protocol(17); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UMP_MIDI_2_0_AND_JRTS: AMidiDevice_Protocol = + AMidiDevice_Protocol(18); +} +impl AMidiDevice_Protocol { + pub const AMIDI_DEVICE_PROTOCOL_UNKNOWN: AMidiDevice_Protocol = AMidiDevice_Protocol(-1); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMidiDevice_Protocol(pub i32); extern "C" { pub fn AMidiDevice_fromJava( env: *mut JNIEnv, @@ -16931,6 +18162,9 @@ extern "C" { extern "C" { pub fn AMidiDevice_getNumOutputPorts(device: *const AMidiDevice) -> ssize_t; } +extern "C" { + pub fn AMidiDevice_getDefaultProtocol(device: *const AMidiDevice) -> AMidiDevice_Protocol; +} extern "C" { pub fn AMidiOutputPort_open( device: *const AMidiDevice, @@ -17125,7 +18359,13 @@ impl acamera_metadata_section { pub const ACAMERA_HEIC_INFO: acamera_metadata_section = acamera_metadata_section(29); } impl acamera_metadata_section { - pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(30); + pub const ACAMERA_AUTOMOTIVE: acamera_metadata_section = acamera_metadata_section(30); +} +impl acamera_metadata_section { + pub const ACAMERA_AUTOMOTIVE_LENS: acamera_metadata_section = acamera_metadata_section(31); +} +impl acamera_metadata_section { + pub const ACAMERA_SECTION_COUNT: acamera_metadata_section = acamera_metadata_section(32); } impl acamera_metadata_section { pub const ACAMERA_VENDOR: acamera_metadata_section = acamera_metadata_section(32768); @@ -17254,6 +18494,14 @@ impl acamera_metadata_section_start { pub const ACAMERA_HEIC_INFO_START: acamera_metadata_section_start = acamera_metadata_section_start(1900544); } +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_START: acamera_metadata_section_start = + acamera_metadata_section_start(1966080); +} +impl acamera_metadata_section_start { + pub const ACAMERA_AUTOMOTIVE_LENS_START: acamera_metadata_section_start = + acamera_metadata_section_start(2031616); +} impl acamera_metadata_section_start { pub const ACAMERA_VENDOR_START: acamera_metadata_section_start = acamera_metadata_section_start(-2147483648); @@ -17460,7 +18708,15 @@ impl acamera_metadata_tag { pub const ACAMERA_FLASH_INFO_AVAILABLE: acamera_metadata_tag = acamera_metadata_tag(327680); } impl acamera_metadata_tag { - pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327681); + pub const ACAMERA_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327682); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_STRENGTH_DEFAULT_LEVEL: acamera_metadata_tag = + acamera_metadata_tag(327683); +} +impl acamera_metadata_tag { + pub const ACAMERA_FLASH_INFO_END: acamera_metadata_tag = acamera_metadata_tag(327684); } impl acamera_metadata_tag { pub const ACAMERA_HOT_PIXEL_MODE: acamera_metadata_tag = acamera_metadata_tag(393216); @@ -17641,7 +18897,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(786449); } impl acamera_metadata_tag { - pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786450); + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP: acamera_metadata_tag = + acamera_metadata_tag(786451); +} +impl acamera_metadata_tag { + pub const ACAMERA_REQUEST_END: acamera_metadata_tag = acamera_metadata_tag(786452); } impl acamera_metadata_tag { pub const ACAMERA_SCALER_CROP_REGION: acamera_metadata_tag = acamera_metadata_tag(851968); @@ -17705,7 +18965,11 @@ impl acamera_metadata_tag { acamera_metadata_tag(851992); } impl acamera_metadata_tag { - pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851993); + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES: acamera_metadata_tag = + acamera_metadata_tag(851993); +} +impl acamera_metadata_tag { + pub const ACAMERA_SCALER_END: acamera_metadata_tag = acamera_metadata_tag(851994); } impl acamera_metadata_tag { pub const ACAMERA_SENSOR_EXPOSURE_TIME: acamera_metadata_tag = acamera_metadata_tag(917504); @@ -17990,7 +19254,11 @@ impl acamera_metadata_tag { pub const ACAMERA_INFO_VERSION: acamera_metadata_tag = acamera_metadata_tag(1376257); } impl acamera_metadata_tag { - pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376258); + pub const ACAMERA_INFO_DEVICE_STATE_ORIENTATIONS: acamera_metadata_tag = + acamera_metadata_tag(1376259); +} +impl acamera_metadata_tag { + pub const ACAMERA_INFO_END: acamera_metadata_tag = acamera_metadata_tag(1376260); } impl acamera_metadata_tag { pub const ACAMERA_BLACK_LEVEL_LOCK: acamera_metadata_tag = acamera_metadata_tag(1441792); @@ -18121,6 +19389,18 @@ impl acamera_metadata_tag { impl acamera_metadata_tag { pub const ACAMERA_HEIC_END: acamera_metadata_tag = acamera_metadata_tag(1835014); } +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LOCATION: acamera_metadata_tag = acamera_metadata_tag(1966080); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_END: acamera_metadata_tag = acamera_metadata_tag(1966081); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING: acamera_metadata_tag = acamera_metadata_tag(2031616); +} +impl acamera_metadata_tag { + pub const ACAMERA_AUTOMOTIVE_LENS_END: acamera_metadata_tag = acamera_metadata_tag(2031617); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_tag(pub ::std::os::raw::c_uint); @@ -18559,6 +19839,11 @@ impl acamera_metadata_enum_acamera_control_video_stabilization_mode { acamera_metadata_enum_acamera_control_video_stabilization_mode = acamera_metadata_enum_acamera_control_video_stabilization_mode(1); } +impl acamera_metadata_enum_acamera_control_video_stabilization_mode { + pub const ACAMERA_CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION: + acamera_metadata_enum_acamera_control_video_stabilization_mode = + acamera_metadata_enum_acamera_control_video_stabilization_mode(2); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_control_video_stabilization_mode( @@ -18873,6 +20158,11 @@ impl acamera_metadata_enum_acamera_lens_pose_reference { acamera_metadata_enum_acamera_lens_pose_reference = acamera_metadata_enum_acamera_lens_pose_reference(2); } +impl acamera_metadata_enum_acamera_lens_pose_reference { + pub const ACAMERA_LENS_POSE_REFERENCE_AUTOMOTIVE: + acamera_metadata_enum_acamera_lens_pose_reference = + acamera_metadata_enum_acamera_lens_pose_reference(3); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_lens_pose_reference(pub ::std::os::raw::c_uint); @@ -18991,10 +20281,86 @@ impl acamera_metadata_enum_acamera_request_available_capabilities { acamera_metadata_enum_acamera_request_available_capabilities = acamera_metadata_enum_acamera_request_available_capabilities(16); } +impl acamera_metadata_enum_acamera_request_available_capabilities { + pub const ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE: + acamera_metadata_enum_acamera_request_available_capabilities = + acamera_metadata_enum_acamera_request_available_capabilities(19); +} #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct acamera_metadata_enum_acamera_request_available_capabilities(pub ::std::os::raw::c_uint); pub use self::acamera_metadata_enum_acamera_request_available_capabilities as acamera_metadata_enum_android_request_available_capabilities_t; +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HLG10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HDR10_PLUS: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(8); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(16); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(32); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(64); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_10B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(128); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(256); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_REF_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(512); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(1024); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_DOLBY_VISION_8B_HDR_OEM_PO: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(2048); +} +impl acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map { + pub const ACAMERA_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_MAX: + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map = + acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map(4096); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_request_available_dynamic_range_profiles_map as acamera_metadata_enum_android_request_available_dynamic_range_profiles_map_t; impl acamera_metadata_enum_acamera_scaler_available_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT: acamera_metadata_enum_acamera_scaler_available_stream_configurations = @@ -19065,6 +20431,16 @@ impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configura acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(7); } +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_10BIT_OUTPUT: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(8); +} +impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { + pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PUBLIC_END_3_8: + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = + acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations(9); +} impl acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations { pub const ACAMERA_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VENDOR_START: acamera_metadata_enum_acamera_scaler_available_recommended_stream_configurations = @@ -19157,6 +20533,42 @@ pub struct acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supporte pub ::std::os::raw::c_uint, ); pub use self::acamera_metadata_enum_acamera_scaler_multi_resolution_stream_supported as acamera_metadata_enum_android_scaler_multi_resolution_stream_supported_t; +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(0); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(1); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(2); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(3); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(4); +} +impl acamera_metadata_enum_acamera_scaler_available_stream_use_cases { + pub const ACAMERA_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL: + acamera_metadata_enum_acamera_scaler_available_stream_use_cases = + acamera_metadata_enum_acamera_scaler_available_stream_use_cases(5); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_scaler_available_stream_use_cases( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_scaler_available_stream_use_cases as acamera_metadata_enum_android_scaler_available_stream_use_cases_t; impl acamera_metadata_enum_acamera_sensor_reference_illuminant1 { pub const ACAMERA_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT: acamera_metadata_enum_acamera_sensor_reference_illuminant1 = @@ -19723,832 +21135,1386 @@ impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_max 0, ); } -impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { - pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = - acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - 1, - ); +impl acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution { + pub const ACAMERA_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION_INPUT: + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution = + acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + 1, + ); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( + pub ::std::os::raw::c_uint, +); +pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_INTERIOR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(0); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(1); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(2); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(3); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(4); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(5); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_OTHER: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(6); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_FRONT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(7); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_REAR: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(8); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_LEFT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(9); +} +impl acamera_metadata_enum_acamera_automotive_location { + pub const ACAMERA_AUTOMOTIVE_LOCATION_EXTRA_RIGHT: + acamera_metadata_enum_acamera_automotive_location = + acamera_metadata_enum_acamera_automotive_location(10); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_location(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_location as acamera_metadata_enum_android_automotive_location_t; +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(0); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_FRONT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(1); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_REAR: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(2); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(3); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_EXTERIOR_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(4); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_OTHER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(5); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(6); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(7); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_1_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(8); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(9); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(10); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_2_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(11); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_LEFT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(12); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_CENTER: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(13); +} +impl acamera_metadata_enum_acamera_automotive_lens_facing { + pub const ACAMERA_AUTOMOTIVE_LENS_FACING_INTERIOR_SEAT_ROW_3_RIGHT: + acamera_metadata_enum_acamera_automotive_lens_facing = + acamera_metadata_enum_acamera_automotive_lens_facing(14); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct acamera_metadata_enum_acamera_automotive_lens_facing(pub ::std::os::raw::c_uint); +pub use self::acamera_metadata_enum_acamera_automotive_lens_facing as acamera_metadata_enum_android_automotive_lens_facing_t; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata { + _unused: [u8; 0], +} +pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; +pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; +pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; +pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; +pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; +pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; +pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; +pub type _bindgen_ty_63 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraMetadata_rational { + pub numerator: i32, + pub denominator: i32, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_rational() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).numerator as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(numerator) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).denominator as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_rational), + "::", + stringify!(denominator) + ) + ); +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct ACameraMetadata_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_entry__bindgen_ty_1, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union ACameraMetadata_entry__bindgen_ty_1 { + pub u8_: *mut u8, + pub i32_: *mut i32, + pub f: *mut f32, + pub i64_: *mut i64, + pub d: *mut f64, + pub r: *mut ACameraMetadata_rational, +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ACameraMetadata_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_entry() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(count) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_entry), + "::", + stringify!(data) + ) + ); } -#[repr(transparent)] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution( - pub ::std::os::raw::c_uint, -); -pub use self::acamera_metadata_enum_acamera_heic_available_heic_stream_configurations_maximum_resolution as acamera_metadata_enum_android_heic_available_heic_stream_configurations_maximum_resolution_t; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata { - _unused: [u8; 0], +#[derive(Copy, Clone)] +pub struct ACameraMetadata_const_entry { + pub tag: u32, + pub type_: u8, + pub count: u32, + pub data: ACameraMetadata_const_entry__bindgen_ty_1, } -pub const ACAMERA_TYPE_BYTE: ::std::os::raw::c_uint = 0; -pub const ACAMERA_TYPE_INT32: ::std::os::raw::c_uint = 1; -pub const ACAMERA_TYPE_FLOAT: ::std::os::raw::c_uint = 2; -pub const ACAMERA_TYPE_INT64: ::std::os::raw::c_uint = 3; -pub const ACAMERA_TYPE_DOUBLE: ::std::os::raw::c_uint = 4; -pub const ACAMERA_TYPE_RATIONAL: ::std::os::raw::c_uint = 5; -pub const ACAMERA_NUM_TYPES: ::std::os::raw::c_uint = 6; -pub type _bindgen_ty_61 = ::std::os::raw::c_uint; #[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraMetadata_rational { - pub numerator: i32, - pub denominator: i32, +#[derive(Copy, Clone)] +pub union ACameraMetadata_const_entry__bindgen_ty_1 { + pub u8_: *const u8, + pub i32_: *const i32, + pub f: *const f32, + pub i64_: *const i64, + pub d: *const f64, + pub r: *const ACameraMetadata_rational, } #[test] -fn bindgen_test_layout_ACameraMetadata_rational() { +fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 8usize, - concat!("Size of: ", stringify!(ACameraMetadata_rational)) + concat!( + "Size of: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).u8_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(u8_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i32_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i32_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).f as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(f) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).i64_ as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(i64_) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).d as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(d) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).r as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + "::", + stringify!(r) + ) + ); +} +#[test] +fn bindgen_test_layout_ACameraMetadata_const_entry() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(tag) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).type_ as *const _ as usize + }, 4usize, - concat!("Alignment of ", stringify!(ACameraMetadata_rational)) + concat!( + "Offset of field: ", + stringify!(ACameraMetadata_const_entry), + "::", + stringify!(type_) + ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).numerator as *const _ as usize + &(*(::std::ptr::null::())).count as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(numerator) + stringify!(count) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).denominator as *const _ as usize + &(*(::std::ptr::null::())).data as *const _ as usize }, - 4usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_rational), + stringify!(ACameraMetadata_const_entry), "::", - stringify!(denominator) + stringify!(data) ) ); } +extern "C" { + pub fn ACameraMetadata_getConstEntry( + metadata: *const ACameraMetadata, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_getAllTags( + metadata: *const ACameraMetadata, + numEntries: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; +} +extern "C" { + pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); +} +extern "C" { + pub fn ACameraMetadata_isLogicalMultiCamera( + staticMetadata: *const ACameraMetadata, + numPhysicalCameras: *mut size_t, + physicalCameraIds: *mut *const *const ::std::os::raw::c_char, + ) -> bool; +} +extern "C" { + pub fn ACameraMetadata_fromCameraMetadata( + env: *mut JNIEnv, + cameraMetadata: jobject, + ) -> *mut ACameraMetadata; +} +pub type ACameraWindowType = ANativeWindow; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_entry__bindgen_ty_1, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTargets { + _unused: [u8; 0], } #[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_entry__bindgen_ty_1 { - pub u8_: *mut u8, - pub i32_: *mut i32, - pub f: *mut f32, - pub i64_: *mut i64, - pub d: *mut f64, - pub r: *mut ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraOutputTarget { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACaptureRequest { + _unused: [u8; 0], +} +extern "C" { + pub fn ACameraOutputTarget_create( + window: *mut ACameraWindowType, + output: *mut *mut ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); +} +extern "C" { + pub fn ACaptureRequest_addTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_removeTarget( + request: *mut ACaptureRequest, + output: *const ACameraOutputTarget, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry( + request: *const ACaptureRequest, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getAllTags( + request: *const ACaptureRequest, + numTags: *mut i32, + tags: *mut *const u32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_u8( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i32( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_float( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_i64( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_double( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_rational( + request: *mut ACaptureRequest, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_free(request: *mut ACaptureRequest); +} +extern "C" { + pub fn ACaptureRequest_setUserContext( + request: *mut ACaptureRequest, + context: *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_getUserContext( + request: *const ACaptureRequest, + context: *mut *mut ::std::os::raw::c_void, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; +} +extern "C" { + pub fn ACaptureRequest_getConstEntry_physicalCamera( + request: *const ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + entry: *mut ACameraMetadata_const_entry, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_u8( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const u8, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i32( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_float( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f32, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_i64( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const i64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_double( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const f64, + ) -> camera_status_t; +} +extern "C" { + pub fn ACaptureRequest_setEntry_physicalCamera_rational( + request: *mut ACaptureRequest, + physicalId: *const ::std::os::raw::c_char, + tag: u32, + count: u32, + data: *const ACameraMetadata_rational, + ) -> camera_status_t; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession { + _unused: [u8; 0], +} +pub type ACameraCaptureSession_stateCallback = ::std::option::Option< + unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_stateCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onClosed: ACameraCaptureSession_stateCallback, + pub onReady: ACameraCaptureSession_stateCallback, + pub onActive: ACameraCaptureSession_stateCallback, } #[test] -fn bindgen_test_layout_ACameraMetadata_entry__bindgen_ty_1() { - assert_eq!( - ::std::mem::size_of::(), - 8usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry__bindgen_ty_1)) - ); +fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { assert_eq!( - ::std::mem::align_of::(), - 8usize, + ::std::mem::size_of::(), + 32usize, concat!( - "Alignment of ", - stringify!(ACameraMetadata_entry__bindgen_ty_1) + "Size of: ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ as usize - }, - 0usize, + ::std::mem::align_of::(), + 8usize, concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(u8_) + "Alignment of ", + stringify!(ACameraCaptureSession_stateCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), - "::", - stringify!(i32_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).f as *const _ as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ + &(*(::std::ptr::null::())).onClosed as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(i64_) + stringify!(onClosed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ as usize + &(*(::std::ptr::null::())).onReady as *const _ + as usize }, - 0usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(d) + stringify!(onReady) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ as usize + &(*(::std::ptr::null::())).onActive as *const _ + as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_stateCallbacks), "::", - stringify!(r) + stringify!(onActive) ) ); } +pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; +pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; +pub type _bindgen_ty_64 = ::std::os::raw::c_uint; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureFailure { + pub frameNumber: i64, + pub reason: ::std::os::raw::c_int, + pub sequenceId: ::std::os::raw::c_int, + pub wasImageCaptured: bool, +} #[test] -fn bindgen_test_layout_ACameraMetadata_entry() { +fn bindgen_test_layout_ACameraCaptureFailure() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 24usize, - concat!("Size of: ", stringify!(ACameraMetadata_entry)) + concat!("Size of: ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, - concat!("Alignment of ", stringify!(ACameraMetadata_entry)) + concat!("Alignment of ", stringify!(ACameraCaptureFailure)) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).frameNumber as *const _ as usize + }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(tag) + stringify!(frameNumber) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, - 4usize, + unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(type_) + stringify!(reason) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).count as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())).sequenceId as *const _ as usize + }, + 12usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(count) + stringify!(sequenceId) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).data as *const _ as usize }, + unsafe { + &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_entry), + stringify!(ACameraCaptureFailure), "::", - stringify!(data) + stringify!(wasImageCaptured) ) ); } +pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *const ACaptureRequest, + timestamp: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + ), +>; +pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ACameraCaptureFailure, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + frameNumber: i64, + ), +>; +pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + sequenceId: ::std::os::raw::c_int, + ), +>; +pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + window: *mut ACameraWindowType, + frameNumber: i64, + ), +>; #[repr(C)] -#[derive(Copy, Clone)] -pub struct ACameraMetadata_const_entry { - pub tag: u32, - pub type_: u8, - pub count: u32, - pub data: ACameraMetadata_const_entry__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ACameraMetadata_const_entry__bindgen_ty_1 { - pub u8_: *const u8, - pub i32_: *const i32, - pub f: *const f32, - pub i64_: *const i64, - pub d: *const f64, - pub r: *const ACameraMetadata_rational, +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_captureCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, + pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraMetadata_const_entry__bindgen_ty_1() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { assert_eq!( - ::std::mem::size_of::(), - 8usize, + ::std::mem::size_of::(), + 64usize, concat!( "Size of: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).u8_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(u8_) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).i32_ as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), - "::", - stringify!(i32_) + stringify!(ACameraCaptureSession_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).f as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(f) + stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).i64_ as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureStarted + as *const _ as usize }, - 0usize, + 8usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(i64_) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).d as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureProgressed + as *const _ as usize }, - 0usize, + 16usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(d) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).r as *const _ - as usize + &(*(::std::ptr::null::())).onCaptureCompleted + as *const _ as usize }, - 0usize, + 24usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry__bindgen_ty_1), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(r) + stringify!(onCaptureCompleted) ) ); -} -#[test] -fn bindgen_test_layout_ACameraMetadata_const_entry() { - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(ACameraMetadata_const_entry)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ACameraMetadata_const_entry)) - ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).tag as *const _ as usize }, - 0usize, + unsafe { + &(*(::std::ptr::null::())).onCaptureFailed + as *const _ as usize + }, + 32usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(tag) + stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).type_ as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize }, - 4usize, + 40usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(type_) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).count as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 8usize, + 48usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(count) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).data as *const _ as usize + &(*(::std::ptr::null::())).onCaptureBufferLost + as *const _ as usize }, - 16usize, + 56usize, concat!( "Offset of field: ", - stringify!(ACameraMetadata_const_entry), + stringify!(ACameraCaptureSession_captureCallbacks), "::", - stringify!(data) + stringify!(onCaptureBufferLost) ) ); } +pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; +pub type _bindgen_ty_65 = ::std::os::raw::c_int; extern "C" { - pub fn ACameraMetadata_getConstEntry( - metadata: *const ACameraMetadata, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_getAllTags( - metadata: *const ACameraMetadata, - numEntries: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraMetadata_copy(src: *const ACameraMetadata) -> *mut ACameraMetadata; -} -extern "C" { - pub fn ACameraMetadata_free(metadata: *mut ACameraMetadata); -} -extern "C" { - pub fn ACameraMetadata_isLogicalMultiCamera( - staticMetadata: *const ACameraMetadata, - numPhysicalCameras: *mut size_t, - physicalCameraIds: *mut *const *const ::std::os::raw::c_char, - ) -> bool; -} -extern "C" { - pub fn ACameraMetadata_fromCameraMetadata( - env: *mut JNIEnv, - cameraMetadata: jobject, - ) -> *mut ACameraMetadata; -} -pub type ACameraWindowType = ANativeWindow; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTargets { - _unused: [u8; 0], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraOutputTarget { - _unused: [u8; 0], + pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACaptureRequest { +pub struct ACameraDevice { _unused: [u8; 0], } extern "C" { - pub fn ACameraOutputTarget_create( - window: *mut ACameraWindowType, - output: *mut *mut ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraOutputTarget_free(output: *mut ACameraOutputTarget); -} -extern "C" { - pub fn ACaptureRequest_addTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_removeTarget( - request: *mut ACaptureRequest, - output: *const ACameraOutputTarget, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry( - request: *const ACaptureRequest, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getAllTags( - request: *const ACaptureRequest, - numTags: *mut i32, - tags: *mut *const u32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_u8( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i32( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_float( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f32, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_i64( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const i64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_double( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const f64, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_rational( - request: *mut ACaptureRequest, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_free(request: *mut ACaptureRequest); -} -extern "C" { - pub fn ACaptureRequest_setUserContext( - request: *mut ACaptureRequest, - context: *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_getUserContext( - request: *const ACaptureRequest, - context: *mut *mut ::std::os::raw::c_void, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_copy(src: *const ACaptureRequest) -> *mut ACaptureRequest; -} -extern "C" { - pub fn ACaptureRequest_getConstEntry_physicalCamera( - request: *const ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - entry: *mut ACameraMetadata_const_entry, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_u8( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const u8, - ) -> camera_status_t; -} -extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i32( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i32, + pub fn ACameraCaptureSession_getDevice( + session: *mut ACameraCaptureSession, + device: *mut *mut ACameraDevice, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_float( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f32, + pub fn ACameraCaptureSession_capture( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_i64( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const i64, + pub fn ACameraCaptureSession_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_double( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const f64, + pub fn ACameraCaptureSession_stopRepeating( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } extern "C" { - pub fn ACaptureRequest_setEntry_physicalCamera_rational( - request: *mut ACaptureRequest, - physicalId: *const ::std::os::raw::c_char, - tag: u32, - count: u32, - data: *const ACameraMetadata_rational, + pub fn ACameraCaptureSession_abortCaptures( + session: *mut ACameraCaptureSession, ) -> camera_status_t; } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession { +pub struct ACaptureSessionOutput { _unused: [u8; 0], } -pub type ACameraCaptureSession_stateCallback = ::std::option::Option< - unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession), +extern "C" { + pub fn ACameraCaptureSession_updateSharedOutput( + session: *mut ACameraCaptureSession, + output: *mut ACaptureSessionOutput, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + result: *const ACameraMetadata, + physicalResultCount: size_t, + physicalCameraIds: *mut *const ::std::os::raw::c_char, + physicalResults: *mut *const ACameraMetadata, + ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_stateCallbacks { - pub context: *mut ::std::os::raw::c_void, - pub onClosed: ACameraCaptureSession_stateCallback, - pub onReady: ACameraCaptureSession_stateCallback, - pub onActive: ACameraCaptureSession_stateCallback, +pub struct ALogicalCameraCaptureFailure { + pub captureFailure: ACameraCaptureFailure, + pub physicalCameraId: *const ::std::os::raw::c_char, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_stateCallbacks() { +fn bindgen_test_layout_ALogicalCameraCaptureFailure() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 32usize, + concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).captureFailure as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(captureFailure) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).physicalCameraId as *const _ + as usize + }, + 24usize, + concat!( + "Offset of field: ", + stringify!(ALogicalCameraCaptureFailure), + "::", + stringify!(physicalCameraId) + ) + ); +} +pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< + unsafe extern "C" fn( + context: *mut ::std::os::raw::c_void, + session: *mut ACameraCaptureSession, + request: *mut ACaptureRequest, + failure: *mut ALogicalCameraCaptureFailure, + ), +>; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { + pub context: *mut ::std::os::raw::c_void, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, + pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, + pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, + pub onCaptureSequenceCompleted: ACameraCaptureSession_captureCallback_sequenceEnd, + pub onCaptureSequenceAborted: ACameraCaptureSession_captureCallback_sequenceAbort, + pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, +} +#[test] +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { + assert_eq!( + ::std::mem::size_of::(), + 64usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_stateCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ - as usize + &(*(::std::ptr::null::())).context + as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onClosed as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureStarted as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onClosed) + stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onReady as *const _ - as usize + &(*(::std::ptr::null::())) + .onCaptureProgressed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onReady) + stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onActive as *const _ - as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureCompleted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_stateCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(onActive) + stringify!(onLogicalCameraCaptureCompleted) ) ); -} -pub const CAPTURE_FAILURE_REASON_FLUSHED: ::std::os::raw::c_uint = 0; -pub const CAPTURE_FAILURE_REASON_ERROR: ::std::os::raw::c_uint = 1; -pub type _bindgen_ty_62 = ::std::os::raw::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureFailure { - pub frameNumber: i64, - pub reason: ::std::os::raw::c_int, - pub sequenceId: ::std::os::raw::c_int, - pub wasImageCaptured: bool, -} -#[test] -fn bindgen_test_layout_ACameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 24usize, - concat!("Size of: ", stringify!(ACameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ACameraCaptureFailure)) - ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).frameNumber as *const _ as usize + &(*(::std::ptr::null::())) + .onLogicalCameraCaptureFailed as *const _ as usize }, - 0usize, + 32usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(frameNumber) + stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( - unsafe { &(*(::std::ptr::null::())).reason as *const _ as usize }, - 8usize, + unsafe { + &(*(::std::ptr::null::())) + .onCaptureSequenceCompleted as *const _ as usize + }, + 40usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(reason) + stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).sequenceId as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureSequenceAborted as *const _ as usize }, - 12usize, + 48usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(sequenceId) + stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).wasImageCaptured as *const _ as usize + &(*(::std::ptr::null::())) + .onCaptureBufferLost as *const _ as usize }, - 16usize, + 56usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureFailure), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), "::", - stringify!(wasImageCaptured) + stringify!(onCaptureBufferLost) ) - ); -} -pub type ACameraCaptureSession_captureCallback_start = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *const ACaptureRequest, - timestamp: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - ), ->; -pub type ACameraCaptureSession_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ACameraCaptureFailure, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceEnd = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - frameNumber: i64, - ), ->; -pub type ACameraCaptureSession_captureCallback_sequenceAbort = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, + ); +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_capture( session: *mut ACameraCaptureSession, - sequenceId: ::std::os::raw::c_int, - ), ->; -pub type ACameraCaptureSession_captureCallback_bufferLost = ::std::option::Option< + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +pub type ACameraCaptureSession_captureCallback_startV2 = ::std::option::Option< unsafe extern "C" fn( context: *mut ::std::os::raw::c_void, session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - window: *mut ACameraWindowType, + request: *const ACaptureRequest, + timestamp: i64, frameNumber: i64, ), >; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_captureCallbacks { +pub struct ACameraCaptureSession_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onCaptureCompleted: ACameraCaptureSession_captureCallback_result, pub onCaptureFailed: ACameraCaptureSession_captureCallback_failed, @@ -20557,252 +22523,133 @@ pub struct ACameraCaptureSession_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 64usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_captureCallbacks) + stringify!(ACameraCaptureSession_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context as *const _ + &(*(::std::ptr::null::())).context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureStarted + &(*(::std::ptr::null::())).onCaptureStarted as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureProgressed + &(*(::std::ptr::null::())).onCaptureProgressed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureCompleted + &(*(::std::ptr::null::())).onCaptureCompleted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureFailed + &(*(::std::ptr::null::())).onCaptureFailed as *const _ as usize }, 32usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 40usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 48usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).onCaptureBufferLost + &(*(::std::ptr::null::())).onCaptureBufferLost as *const _ as usize }, 56usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_captureCallbacks), + stringify!(ACameraCaptureSession_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } -pub const CAPTURE_SEQUENCE_ID_NONE: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_63 = ::std::os::raw::c_int; -extern "C" { - pub fn ACameraCaptureSession_close(session: *mut ACameraCaptureSession); -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACameraDevice { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_getDevice( - session: *mut ACameraCaptureSession, - device: *mut *mut ACameraDevice, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_capture( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_setRepeatingRequest( - session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_captureCallbacks, - numRequests: ::std::os::raw::c_int, - requests: *mut *mut ACaptureRequest, - captureSequenceId: *mut ::std::os::raw::c_int, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_stopRepeating( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -extern "C" { - pub fn ACameraCaptureSession_abortCaptures( - session: *mut ACameraCaptureSession, - ) -> camera_status_t; -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ACaptureSessionOutput { - _unused: [u8; 0], -} -extern "C" { - pub fn ACameraCaptureSession_updateSharedOutput( - session: *mut ACameraCaptureSession, - output: *mut ACaptureSessionOutput, - ) -> camera_status_t; -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_result = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - result: *const ACameraMetadata, - physicalResultCount: size_t, - physicalCameraIds: *mut *const ::std::os::raw::c_char, - physicalResults: *mut *const ACameraMetadata, - ), ->; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ALogicalCameraCaptureFailure { - pub captureFailure: ACameraCaptureFailure, - pub physicalCameraId: *const ::std::os::raw::c_char, -} -#[test] -fn bindgen_test_layout_ALogicalCameraCaptureFailure() { - assert_eq!( - ::std::mem::size_of::(), - 32usize, - concat!("Size of: ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - ::std::mem::align_of::(), - 8usize, - concat!("Alignment of ", stringify!(ALogicalCameraCaptureFailure)) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).captureFailure as *const _ - as usize - }, - 0usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(captureFailure) - ) - ); - assert_eq!( - unsafe { - &(*(::std::ptr::null::())).physicalCameraId as *const _ - as usize - }, - 24usize, - concat!( - "Offset of field: ", - stringify!(ALogicalCameraCaptureFailure), - "::", - stringify!(physicalCameraId) - ) - ); -} -pub type ACameraCaptureSession_logicalCamera_captureCallback_failed = ::std::option::Option< - unsafe extern "C" fn( - context: *mut ::std::os::raw::c_void, - session: *mut ACameraCaptureSession, - request: *mut ACaptureRequest, - failure: *mut ALogicalCameraCaptureFailure, - ), ->; #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { +pub struct ACameraCaptureSession_logicalCamera_captureCallbacksV2 { pub context: *mut ::std::os::raw::c_void, - pub onCaptureStarted: ACameraCaptureSession_captureCallback_start, + pub onCaptureStarted: ACameraCaptureSession_captureCallback_startV2, pub onCaptureProgressed: ACameraCaptureSession_captureCallback_result, pub onLogicalCameraCaptureCompleted: ACameraCaptureSession_logicalCamera_captureCallback_result, pub onLogicalCameraCaptureFailed: ACameraCaptureSession_logicalCamera_captureCallback_failed, @@ -20811,141 +22658,159 @@ pub struct ACameraCaptureSession_logicalCamera_captureCallbacks { pub onCaptureBufferLost: ACameraCaptureSession_captureCallback_bufferLost, } #[test] -fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacks() { +fn bindgen_test_layout_ACameraCaptureSession_logicalCamera_captureCallbacksV2() { assert_eq!( - ::std::mem::size_of::(), + ::std::mem::size_of::(), 64usize, concat!( "Size of: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( - ::std::mem::align_of::(), + ::std::mem::align_of::(), 8usize, concat!( "Alignment of ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks) + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())).context - as *const _ as usize + &(*(::std::ptr::null::())) + .context as *const _ as usize }, 0usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(context) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureStarted as *const _ as usize }, 8usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureStarted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureProgressed as *const _ as usize }, 16usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureProgressed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureCompleted as *const _ as usize }, 24usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onLogicalCameraCaptureFailed as *const _ as usize }, 32usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onLogicalCameraCaptureFailed) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceCompleted as *const _ as usize }, 40usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceCompleted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureSequenceAborted as *const _ as usize }, 48usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureSequenceAborted) ) ); assert_eq!( unsafe { - &(*(::std::ptr::null::())) + &(*(::std::ptr::null::())) .onCaptureBufferLost as *const _ as usize }, 56usize, concat!( "Offset of field: ", - stringify!(ACameraCaptureSession_logicalCamera_captureCallbacks), + stringify!(ACameraCaptureSession_logicalCamera_captureCallbacksV2), "::", stringify!(onCaptureBufferLost) ) ); } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_capture( + pub fn ACameraCaptureSession_captureV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, ) -> camera_status_t; } extern "C" { - pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequest( + pub fn ACameraCaptureSession_setRepeatingRequestV2( session: *mut ACameraCaptureSession, - callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacks, + callbacks: *mut ACameraCaptureSession_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_captureV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, + numRequests: ::std::os::raw::c_int, + requests: *mut *mut ACaptureRequest, + captureSequenceId: *mut ::std::os::raw::c_int, + ) -> camera_status_t; +} +extern "C" { + pub fn ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( + session: *mut ACameraCaptureSession, + callbacks: *mut ACameraCaptureSession_logicalCamera_captureCallbacksV2, numRequests: ::std::os::raw::c_int, requests: *mut *mut ACaptureRequest, captureSequenceId: *mut ::std::os::raw::c_int, @@ -20995,7 +22860,7 @@ pub const ERROR_MAX_CAMERAS_IN_USE: ::std::os::raw::c_uint = 2; pub const ERROR_CAMERA_DISABLED: ::std::os::raw::c_uint = 3; pub const ERROR_CAMERA_DEVICE: ::std::os::raw::c_uint = 4; pub const ERROR_CAMERA_SERVICE: ::std::os::raw::c_uint = 5; -pub type _bindgen_ty_64 = ::std::os::raw::c_uint; +pub type _bindgen_ty_66 = ::std::os::raw::c_uint; pub type ACameraDevice_StateCallback = ::std::option::Option< unsafe extern "C" fn(context: *mut ::std::os::raw::c_void, device: *mut ACameraDevice), >; @@ -22345,6 +24210,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_PICTURE_TYPE: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE: *const ::std::os::raw::c_char; +} extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_B_MAX: *const ::std::os::raw::c_char; } @@ -22369,6 +24243,15 @@ extern "C" { extern "C" { pub static mut AMEDIAFORMAT_VIDEO_QP_P_MIN: *const ::std::os::raw::c_char; } +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION: *const ::std::os::raw::c_char; +} +extern "C" { + pub static mut AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT: *const ::std::os::raw::c_char; +} #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaCodec { @@ -22450,7 +24333,7 @@ pub const AMEDIACODEC_CONFIGURE_FLAG_ENCODE: ::std::os::raw::c_int = 1; pub const AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED: ::std::os::raw::c_int = -3; pub const AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED: ::std::os::raw::c_int = -2; pub const AMEDIACODEC_INFO_TRY_AGAIN_LATER: ::std::os::raw::c_int = -1; -pub type _bindgen_ty_65 = ::std::os::raw::c_int; +pub type _bindgen_ty_67 = ::std::os::raw::c_int; pub type AMediaCodecOnAsyncInputAvailable = ::std::option::Option< unsafe extern "C" fn( codec: *mut AMediaCodec, @@ -22558,6 +24441,14 @@ fn bindgen_test_layout_AMediaCodecOnAsyncNotifyCallback() { ) ); } +pub type AMediaCodecOnFrameRendered = ::std::option::Option< + unsafe extern "C" fn( + codec: *mut AMediaCodec, + userdata: *mut ::std::os::raw::c_void, + mediaTimeUs: i64, + systemNano: i64, + ), +>; extern "C" { pub fn AMediaCodec_createCodecByName(name: *const ::std::os::raw::c_char) -> *mut AMediaCodec; } @@ -22719,6 +24610,13 @@ extern "C" { userdata: *mut ::std::os::raw::c_void, ) -> media_status_t; } +extern "C" { + pub fn AMediaCodec_setOnFrameRenderedCallback( + arg1: *mut AMediaCodec, + callback: AMediaCodecOnFrameRendered, + userdata: *mut ::std::os::raw::c_void, + ) -> media_status_t; +} extern "C" { pub fn AMediaCodec_releaseCrypto(arg1: *mut AMediaCodec) -> media_status_t; } @@ -22993,6 +24891,24 @@ impl AMediaDrmKeyType { #[repr(transparent)] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub struct AMediaDrmKeyType(pub ::std::os::raw::c_uint); +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_INITIAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(0); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RENEWAL: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(1); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_RELEASE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(2); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_NONE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(3); +} +impl AMediaDrmKeyRequestType { + pub const KEY_REQUEST_TYPE_UPDATE: AMediaDrmKeyRequestType = AMediaDrmKeyRequestType(4); +} +#[repr(transparent)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct AMediaDrmKeyRequestType(pub i32); #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct AMediaDrmKeyValuePair { @@ -23173,6 +25089,22 @@ extern "C" { keyRequestSize: *mut size_t, ) -> media_status_t; } +extern "C" { + pub fn AMediaDrm_getKeyRequestWithDefaultUrlAndType( + arg1: *mut AMediaDrm, + scope: *const AMediaDrmScope, + init: *const u8, + initSize: size_t, + mimeType: *const ::std::os::raw::c_char, + keyType: AMediaDrmKeyType, + optionalParameters: *const AMediaDrmKeyValue, + numOptionalParameters: size_t, + keyRequest: *mut *const u8, + keyRequestSize: *mut size_t, + defaultUrl: *mut *const ::std::os::raw::c_char, + keyRequestType: *mut AMediaDrmKeyRequestType, + ) -> media_status_t; +} extern "C" { pub fn AMediaDrm_provideKeyResponse( arg1: *mut AMediaDrm, @@ -23493,7 +25425,7 @@ extern "C" { } pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC: ::std::os::raw::c_uint = 1; pub const AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED: ::std::os::raw::c_uint = 2; -pub type _bindgen_ty_66 = ::std::os::raw::c_uint; +pub type _bindgen_ty_68 = ::std::os::raw::c_uint; extern "C" { pub fn AMediaExtractor_getFileFormat(arg1: *mut AMediaExtractor) -> *mut AMediaFormat; } diff --git a/ndk/src/bitmap.rs b/ndk/src/bitmap.rs index b8c52b3d..410d6a06 100644 --- a/ndk/src/bitmap.rs +++ b/ndk/src/bitmap.rs @@ -42,27 +42,19 @@ fn construct(with_ptr: impl FnOnce(*mut T) -> i32) -> BitmapResult { BitmapError::from_status(status).map(|()| unsafe { result.assume_init() }) } -// IntoPrimitive, TryFromPrimitive use the deprecated `RGBA_4444` member below, -// resulting in deprecation warnings in generated code beyond the `enum`. These -// can only be disabled at the module level, and such warnings seem to be gone on -// at least the Rust 1.56 nightlies. -#[allow(deprecated)] -mod temp_allow_deprecated { - use super::*; - #[repr(u32)] - #[derive(Copy, Clone, Debug, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)] - #[allow(non_camel_case_types)] - pub enum BitmapFormat { - NONE = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_NONE.0, - RGBA_8888 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_8888.0, - RGB_565 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGB_565.0, - #[deprecated = "Deprecated in API level 13. Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead."] - RGBA_4444 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_4444.0, - A_8 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_A_8.0, - RGBA_F16 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_F16.0, - } +#[repr(u32)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)] +#[allow(non_camel_case_types)] +pub enum BitmapFormat { + NONE = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_NONE.0, + RGBA_8888 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_8888.0, + RGB_565 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGB_565.0, + #[deprecated = "Deprecated in API level 13. Because of the poor quality of this configuration, it is advised to use ARGB_8888 instead."] + RGBA_4444 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_4444.0, + A_8 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_A_8.0, + RGBA_F16 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_F16.0, + RGBA_1010102 = ffi::AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_1010102.0, } -pub use temp_allow_deprecated::*; /// An immediate wrapper over [`android.graphics.Bitmap`] /// From b67f2f199cf6af1ffa234cc26bc691ab1ca2d6ba Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Mon, 21 Nov 2022 22:46:05 +0100 Subject: [PATCH 27/33] ndk/input: Allow any non-zero return in `pre_dispatch()` again (#325) Despite the [Android source] never returning anything other than `0` or `1` there appear to be platforms out in the wild that take [the documentation] quite literally and return vague non-zero codes apart `1` with a possible secondary meaning. [Android source]: https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/jni/android_view_InputQueue.cpp;drc=b6d7f3b484e4c32c144c66bee342c29e7a8d34cc;l=115 [the documentation]: https://developer.android.com/ndk/reference/group/input#ainputqueue_predispatchevent --- ndk/CHANGELOG.md | 1 + ndk/src/input_queue.rs | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ndk/CHANGELOG.md b/ndk/CHANGELOG.md index 7297184f..8f4d8081 100644 --- a/ndk/CHANGELOG.md +++ b/ndk/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - event: Add `tool_type` getter for `Pointer`. (#323) +- input_queue: Allow any non-zero return code from `pre_dispatch()` again, as per documentation. (#325) # 0.7.0 (2022-07-24) diff --git a/ndk/src/input_queue.rs b/ndk/src/input_queue.rs index ecd8c006..1ca5a0eb 100644 --- a/ndk/src/input_queue.rs +++ b/ndk/src/input_queue.rs @@ -78,8 +78,7 @@ impl InputQueue { match unsafe { ffi::AInputQueue_preDispatchEvent(self.ptr.as_ptr(), event.ptr().as_ptr()) } { 0 => Some(event), - 1 => None, - r => unreachable!("AInputQueue_preDispatchEvent returned non-boolean {}", r), + _ => None, } } From 90e85ca68a344faa0cd00a7c4f0d794a354e11d8 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 23 Nov 2022 10:45:03 +0100 Subject: [PATCH 28/33] ndk-sys: Sync changelog with ndk-sys-0.4.1 release --- ndk-sys/CHANGELOG.md | 10 ++++++++-- ndk/CHANGELOG.md | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ndk-sys/CHANGELOG.md b/ndk-sys/CHANGELOG.md index 23f10767..fb21f98a 100644 --- a/ndk-sys/CHANGELOG.md +++ b/ndk-sys/CHANGELOG.md @@ -1,14 +1,20 @@ # Unreleased +- Regenerate against NDK 25.0.8775105 with `rust-bindgen 0.59.2`. (#324) + +# 0.4.1 (2022-11-23) + +- Re-release of `0.4.0` to combat a faulty `0.4.0+25.0.8775105` publish. Now also includes `+23.1.7779620` version metadata. + # 0.4.0 (2022-07-24) -- **Breaking:** Turn `enum` type aliases into newtype wrappers. (#245, #315) +- **Breaking:** Turn `enum` type aliases into newtype wrappers (and regenerate with `rust-bindgen 0.59.2`). (#245, #315) # 0.3.0 (2022-01-05) - **Breaking:** Use `jni-sys` for low-level JNI types instead of those autogenerated by `bindgen` based on the header. These JNI types are _not_ publicly (re)exported anymore. (#209) -- Regenerate against NDK 23.1.7779620, now including all Android-related headers. (#201) +- Regenerate against NDK 23.1.7779620 with `rust-bindgen 0.59.1`, now including all Android-related headers. (#201) # 0.2.2 (2021-11-22) diff --git a/ndk/CHANGELOG.md b/ndk/CHANGELOG.md index 8f4d8081..56450082 100644 --- a/ndk/CHANGELOG.md +++ b/ndk/CHANGELOG.md @@ -8,7 +8,7 @@ - hardware_buffer: Make `HardwareBuffer::as_ptr()` public for interop with Vulkan. (#213) - **Breaking:** `Configuration::country()` now returns `None` when the country is unset (akin to `Configuration::language()`). (#220) - Add `MediaCodec` and `MediaFormat` bindings. (#216) -- **Breaking:** Upgrade to [`ndk-sys 0.4.0`](../ndk-sys/CHANGELOG.md#040-2022-07-XXXX) and use new `enum` newtype wrappers. (#245) +- **Breaking:** Upgrade to [`ndk-sys 0.4.0`](../ndk-sys/CHANGELOG.md#040-2022-07-24) and use new `enum` newtype wrappers. (#245) - native_window: Use `release`/`acquire` for `Drop` and `Clone` respectively. (#207) - **Breaking:** audio: Rename from `aaudio` to `audio` and drop `A` prefix. (#273) - Implement `HasRawWindowHandle` directly on `NativeWindow`. (#274, #319) From f14109958581016fb252f950ca4d66b7ffef6f65 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 23 Nov 2022 10:38:44 +0100 Subject: [PATCH 29/33] ndk-sys: Fail bindings generation when sysroot is not found Mistyping the env var path resulted in obscure "header not found" errors rather than `libclang` complaining that the path passed to `--sysroot` wasn't valid in the first place. --- ndk-sys/generate_bindings.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ndk-sys/generate_bindings.sh b/ndk-sys/generate_bindings.sh index 85e02154..9f81e760 100755 --- a/ndk-sys/generate_bindings.sh +++ b/ndk-sys/generate_bindings.sh @@ -1,5 +1,8 @@ #!/bin/sh +sysroot="${ANDROID_NDK_ROOT}"/toolchains/llvm/prebuilt/linux-x86_64/sysroot/ +[ ! -d "$sysroot" ] && echo "Android sysroot $sysroot does not exist!" && exit 1 + while read ARCH && read TARGET ; do bindgen wrapper.h -o src/ffi_$ARCH.rs \ --blocklist-item 'JNI\w+' \ @@ -47,9 +50,7 @@ while read ARCH && read TARGET ; do --newtype-enum 'cryptoinfo_mode_t' \ --newtype-enum 'log_id' \ -- \ - --sysroot="${ANDROID_NDK_ROOT}"/toolchains/llvm/prebuilt/linux-x86_64/sysroot/ --target=$TARGET - - # --newtype-enum '_bindgen_ty_63' \ + --sysroot="$sysroot" --target=$TARGET done << EOF arm arm-linux-androideabi From 419df14a104cd38162d902a3216da37ef2fe16d0 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 23 Nov 2022 13:45:46 +0100 Subject: [PATCH 30/33] cargo-apk: Reimplement "default" (`--`) subcommand trailing args for `cargo` (#363) * cargo-apk: Reimplement "default" subcommand trailing args for `cargo` with `--` separator `clap` [does not currently support] parsing unknown arguments into a side `Vec`, which is exactly what `cargo apk --` needs to parse a few known `cargo` arguments (such as `--target` and `-p`) but forward the rest verbatim to the underlying `cargo` subcommand. `allow_hyphen_values = true` could partially help us out with this, but it parses all remaining arguments into that `Vec` upon encountering the first unknown flag/arg, resulting in all known flags after that to also be treated as "unknown" instead of filling up our `args: Args` struct. Since [a workaround for this isn't currently functioning], introduce pure trailing args with an additional `--` separator to make it clear which arguments go to `cargo-apk` (and are almost all, except `--device`, forwarded to `cargo`) and which are only passed to `cargo `. [does not currently support]: https://github.com/clap-rs/clap/issues/1404 [a workaround for this isn't currently functioning]: https://github.com/clap-rs/clap/issues/1404#issuecomment-1309254274 * cargo-apk: Separate unrecognized `cargo` arguments from cargo-apk `Args` With some custom logic, and assuming (validated with an `assert!`) our `Args` struct doesn't have any positionals, we can implement argument separation ourselves: this allows the user to mix and match `cargo ` arguments with arguments recognized by `cargo-apk`, and expect `cargo-apk` to set up the environment as expected (as it did previously) by taking these arguments into account while disregarding _only_ unknown arguments. * Add `args: Args` back to `Ndk` subcommand to see them in `-h` Mixed `cargo-apk` and `cargo` args will still be split out from `cargo_args`, and they'll be appended to existing values for `args`. --- cargo-apk/src/apk.rs | 6 +- cargo-apk/src/main.rs | 223 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 223 insertions(+), 6 deletions(-) diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index 3a625d6d..ceb7cb65 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -306,7 +306,7 @@ impl<'a> ApkBuilder<'a> { Ok(()) } - pub fn default(&self, cargo_cmd: &str) -> Result<(), Error> { + pub fn default(&self, cargo_cmd: &str, cargo_args: &[String]) -> Result<(), Error> { for target in &self.build_targets { let mut cargo = cargo_ndk( &self.ndk, @@ -322,6 +322,10 @@ impl<'a> ApkBuilder<'a> { cargo.arg("--target").arg(triple); } + for additional_arg in cargo_args { + cargo.arg(additional_arg); + } + if !cargo.status()?.success() { return Err(NdkError::CmdFailed(cargo).into()); } diff --git a/cargo-apk/src/main.rs b/cargo-apk/src/main.rs index 8ad81b19..fab80d0d 100644 --- a/cargo-apk/src/main.rs +++ b/cargo-apk/src/main.rs @@ -1,6 +1,8 @@ +use std::collections::HashMap; + use cargo_apk::{ApkBuilder, Error}; use cargo_subcommand::Subcommand; -use clap::Parser; +use clap::{CommandFactory, FromArgMatches, Parser}; #[derive(Parser)] struct Cmd { @@ -17,7 +19,8 @@ enum ApkCmd { }, } -#[derive(Parser)] +#[derive(Clone, Debug, Eq, PartialEq, Parser)] +#[group(skip)] struct Args { #[clap(flatten)] subcommand_args: cargo_subcommand::Args, @@ -27,7 +30,6 @@ struct Args { } #[derive(clap::Subcommand)] -#[clap(trailing_var_arg = true)] enum ApkSubCmd { /// Analyze the current package and report errors, but don't build object files nor an apk #[clap(visible_alias = "c")] @@ -44,9 +46,18 @@ enum ApkSubCmd { /// Invoke `cargo` under the detected NDK environment #[clap(name = "--")] Ndk { + /// `cargo` subcommand to run cargo_cmd: String, + + // This struct will be filled up later by arguments that are intermixed + // with unknown args and ended up in `cargo_args` below. #[clap(flatten)] args: Args, + + /// Arguments passed to cargo. Some arguments will be used to configure + /// the environment similar to other `cargo apk` commands + #[clap(trailing_var_arg = true, allow_hyphen_values = true)] + cargo_args: Vec, }, /// Run a binary or example apk of the local package #[clap(visible_alias = "r")] @@ -66,6 +77,61 @@ enum ApkSubCmd { Version, } +fn split_apk_and_cargo_args(mut args: Args, input: Vec) -> (Args, Vec) { + // Clap doesn't support parsing unknown args properly: + // https://github.com/clap-rs/clap/issues/1404 + // https://github.com/clap-rs/clap/issues/4498 + // Introspect the `Args` struct and extract every known arg, and whether it takes a value. Use + // this information to separate out known args from unknown args, and re-parse all the known + // args into an existing `args: Args` struct instance. + + let known_args_taking_value = Args::command() + .get_arguments() + .flat_map(|arg| { + assert!(!arg.is_positional()); + arg.get_short_and_visible_aliases() + .iter() + .flat_map(|shorts| shorts.iter().map(|short| format!("-{}", short))) + .chain( + arg.get_long_and_visible_aliases() + .iter() + .flat_map(|longs| longs.iter().map(|short| format!("--{}", short))), + ) + .map(|arg_str| (arg_str, arg.get_action().takes_values())) + // Collect to prevent lifetime issues on temporaries created above + .collect::>() + }) + .collect::>(); + + #[derive(Debug, Default)] + struct SplitArgs { + apk_args: Vec, + cargo_args: Vec, + next_takes_value: bool, + } + + let split_args = input + .into_iter() + .fold(SplitArgs::default(), |mut split_args, elem| { + let known_arg = known_args_taking_value.get(&elem); + if known_arg.is_some() || split_args.next_takes_value { + // Recognized arg or value for previously recognized arg + split_args.apk_args.push(elem) + } else { + split_args.cargo_args.push(elem) + } + + split_args.next_takes_value = known_arg.copied().unwrap_or(false); + split_args + }); + + let m = Args::command() + .no_binary_name(true) + .get_matches_from(&split_args.apk_args); + args.update_from_arg_matches(&m).unwrap(); + (args, split_args.cargo_args) +} + fn main() -> anyhow::Result<()> { env_logger::init(); let Cmd { @@ -84,10 +150,16 @@ fn main() -> anyhow::Result<()> { builder.build(artifact)?; } } - ApkSubCmd::Ndk { cargo_cmd, args } => { + ApkSubCmd::Ndk { + cargo_cmd, + args, + cargo_args, + } => { + let (args, cargo_args) = split_apk_and_cargo_args(args, cargo_args); + let cmd = Subcommand::new(args.subcommand_args)?; let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; - builder.default(&cargo_cmd)?; + builder.default(&cargo_cmd, &cargo_args)?; } ApkSubCmd::Run { args, no_logcat } => { let cmd = Subcommand::new(args.subcommand_args)?; @@ -107,3 +179,144 @@ fn main() -> anyhow::Result<()> { } Ok(()) } + +#[test] +fn test_split_apk_and_cargo_args() { + // Set up a default because cargo-subcommand doesn't derive/implement Default + let args_default = Args::parse_from(std::iter::empty::<&str>()); + + assert_eq!( + split_apk_and_cargo_args(args_default.clone(), vec!["--quiet".to_string()]), + ( + Args { + subcommand_args: cargo_subcommand::Args { + quiet: true, + ..args_default.subcommand_args.clone() + }, + ..args_default.clone() + }, + vec![] + ) + ); + + assert_eq!( + split_apk_and_cargo_args( + args_default.clone(), + vec!["unrecognized".to_string(), "--quiet".to_string()] + ), + ( + Args { + subcommand_args: cargo_subcommand::Args { + quiet: true, + ..args_default.subcommand_args.clone() + }, + ..args_default.clone() + }, + vec!["unrecognized".to_string()] + ) + ); + + assert_eq!( + split_apk_and_cargo_args( + args_default.clone(), + vec!["--unrecognized".to_string(), "--quiet".to_string()] + ), + ( + Args { + subcommand_args: cargo_subcommand::Args { + quiet: true, + ..args_default.subcommand_args.clone() + }, + ..args_default.clone() + }, + vec!["--unrecognized".to_string()] + ) + ); + + assert_eq!( + split_apk_and_cargo_args( + args_default.clone(), + vec!["-p".to_string(), "foo".to_string()] + ), + ( + Args { + subcommand_args: cargo_subcommand::Args { + package: vec!["foo".to_string()], + ..args_default.subcommand_args.clone() + }, + ..args_default.clone() + }, + vec![] + ) + ); + + assert_eq!( + split_apk_and_cargo_args( + args_default.clone(), + vec![ + "-p".to_string(), + "foo".to_string(), + "--unrecognized".to_string(), + "--quiet".to_string() + ] + ), + ( + Args { + subcommand_args: cargo_subcommand::Args { + quiet: true, + package: vec!["foo".to_string()], + ..args_default.subcommand_args.clone() + }, + ..args_default.clone() + }, + vec!["--unrecognized".to_string()] + ) + ); + + assert_eq!( + split_apk_and_cargo_args( + args_default.clone(), + vec![ + "--no-deps".to_string(), + "-p".to_string(), + "foo".to_string(), + "--unrecognized".to_string(), + "--quiet".to_string() + ] + ), + ( + Args { + subcommand_args: cargo_subcommand::Args { + quiet: true, + package: vec!["foo".to_string()], + ..args_default.subcommand_args.clone() + }, + ..args_default.clone() + }, + vec!["--no-deps".to_string(), "--unrecognized".to_string()] + ) + ); + + assert_eq!( + split_apk_and_cargo_args( + args_default.clone(), + vec![ + "--no-deps".to_string(), + "--device".to_string(), + "adb:test".to_string(), + "--unrecognized".to_string(), + "--quiet".to_string() + ] + ), + ( + Args { + subcommand_args: cargo_subcommand::Args { + quiet: true, + ..args_default.subcommand_args + }, + device: Some("adb:test".to_string()), + }, + vec!["--no-deps".to_string(), "--unrecognized".to_string()] + ) + ); +} From 9b4dbface4e336706a4556221e1ee4adbb2e1fa2 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 23 Nov 2022 14:36:58 +0100 Subject: [PATCH 31/33] cargo-apk: Inherit package configuration (`version`) from workspace root (#360) Starting with [Rust 1.64] common `[package]` parameters (and dependencies) can now be specified in the workspace root manifest by setting `.workspace=true` in a `[package]` and specifying its value in the workspace root manifest under [`[workspace.package]`]. Since `cargo-apk` reads the `version` field from `[package]` it has to support this new format and pull the value from the root manifest instead, in order to support projects utilizing this new format. This is currently implemented ad-hoc for the version field, but could be done in a cleaner way if/when more fields are needed. [Rust 1.64]: https://blog.rust-lang.org/2022/09/22/Rust-1.64.0.html#cargo-improvements-workspace-inheritance-and-multi-target-builds [`[workspace.package]`]: https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacepackage-table --- cargo-apk/CHANGELOG.md | 1 + cargo-apk/Cargo.toml | 2 +- cargo-apk/src/apk.rs | 40 +++++++++++++++++++++++++++--- cargo-apk/src/error.rs | 6 +++++ cargo-apk/src/manifest.rs | 52 ++++++++++++++++++++++++++++++--------- 5 files changed, 86 insertions(+), 15 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 8be438c6..8ec4cd1d 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -2,6 +2,7 @@ - Profile signing information can now be specified via the `CARGO_APK__KEYSTORE` and `CARGO_APK__KEYSTORE_PASSWORD` environment variables. The environment variables take precedence over signing information in the cargo manifest. Both environment variables are required except in the case of the `dev` profile, which will fall back to the default password if `CARGO_APK_DEV_KEYSTORE_PASSWORD` is not set. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) - Add `strip` option to `android` metadata, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. ([#356](https://github.com/rust-windowing/android-ndk-rs/pull/356)) +- Support [`[workspace.package]` inheritance](https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacepackage-table) from a workspace root manifest for the `version` field under `[package]`. ([#360](https://github.com/rust-windowing/android-ndk-rs/pull/360)) (0.9.5, released on 2022-10-14, was yanked due to unintentionally bumping MSRV through the `quick-xml` crate, and breaking `cargo apk --` parsing after switching to `clap`.) diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index 90689cde..737800f1 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -13,7 +13,7 @@ rust-version = "1.60" [dependencies] anyhow = "1.0.57" -cargo-subcommand = "0.9" +cargo-subcommand = "0.10" clap = { version = "4", features = ["derive"] } dunce = "1" env_logger = "0.9" diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index ceb7cb65..a807135f 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::manifest::Manifest; +use crate::manifest::{Inheritable, Manifest, Root}; use cargo_subcommand::{Artifact, CrateType, Profile, Subcommand}; use ndk_build::apk::{Apk, ApkConfig}; use ndk_build::cargo::{cargo_ndk, VersionCode}; @@ -24,8 +24,17 @@ impl<'a> ApkBuilder<'a> { cmd: &'a Subcommand, device_serial: Option, ) -> Result { + println!( + "Using package `{}` in `{}`", + cmd.package(), + cmd.manifest().display() + ); let ndk = Ndk::from_env()?; let mut manifest = Manifest::parse_from_toml(cmd.manifest())?; + let workspace_manifest: Option = cmd + .workspace_manifest() + .map(Root::parse_from_toml) + .transpose()?; let build_targets = if let Some(target) = cmd.target() { vec![Target::from_rust_triple(target)?] } else if !manifest.build_targets.is_empty() { @@ -39,11 +48,36 @@ impl<'a> ApkBuilder<'a> { .join(cmd.profile()) .join("apk"); + let package_version = match &manifest.version { + Inheritable::Value(v) => v.clone(), + Inheritable::Inherited { workspace: true } => { + let workspace = workspace_manifest + .ok_or(Error::InheritanceMissingWorkspace)? + .workspace + .unwrap_or_else(|| { + // Unlikely to fail as cargo-subcommand should give us + // a `Cargo.toml` containing a `[workspace]` table + panic!( + "Manifest `{:?}` must contain a `[workspace]` table", + cmd.workspace_manifest().unwrap() + ) + }); + + workspace + .package + .ok_or(Error::WorkspaceMissingInheritedField("package"))? + .version + .ok_or(Error::WorkspaceMissingInheritedField("package.version"))? + } + Inheritable::Inherited { workspace: false } => return Err(Error::InheritedFalse), + }; + let version_code = VersionCode::from_semver(&package_version)?.to_code(1); + // Set default Android manifest values if manifest .android_manifest .version_name - .replace(manifest.version.clone()) + .replace(package_version) .is_some() { panic!("version_name should not be set in TOML"); @@ -52,7 +86,7 @@ impl<'a> ApkBuilder<'a> { if manifest .android_manifest .version_code - .replace(VersionCode::from_semver(&manifest.version)?.to_code(1)) + .replace(version_code) .is_some() { panic!("version_code should not be set in TOML"); diff --git a/cargo-apk/src/error.rs b/cargo-apk/src/error.rs index 8dc864f9..95228655 100644 --- a/cargo-apk/src/error.rs +++ b/cargo-apk/src/error.rs @@ -16,6 +16,12 @@ pub enum Error { Io(#[from] IoError), #[error("Configure a release keystore via `[package.metadata.android.signing.{0}]`")] MissingReleaseKey(String), + #[error("`workspace=false` is unsupported")] + InheritedFalse, + #[error("`workspace=true` requires a workspace")] + InheritanceMissingWorkspace, + #[error("Failed to inherit field: `workspace.{0}` was not defined in workspace root manifest")] + WorkspaceMissingInheritedField(&'static str), } impl Error { diff --git a/cargo-apk/src/manifest.rs b/cargo-apk/src/manifest.rs index 4e561a78..de4460a5 100644 --- a/cargo-apk/src/manifest.rs +++ b/cargo-apk/src/manifest.rs @@ -8,8 +8,15 @@ use std::{ path::{Path, PathBuf}, }; +#[derive(Debug, Clone, Deserialize)] +#[serde(untagged)] +pub enum Inheritable { + Value(T), + Inherited { workspace: bool }, +} + pub(crate) struct Manifest { - pub(crate) version: String, + pub(crate) version: Inheritable, pub(crate) apk_name: Option, pub(crate) android_manifest: AndroidManifest, pub(crate) build_targets: Vec, @@ -24,16 +31,19 @@ pub(crate) struct Manifest { impl Manifest { pub(crate) fn parse_from_toml(path: &Path) -> Result { - let contents = std::fs::read_to_string(path)?; - let toml: Root = toml::from_str(&contents)?; - let metadata = toml + let toml = Root::parse_from_toml(path)?; + // Unlikely to fail as cargo-subcommand should give us a `Cargo.toml` containing + // a `[package]` table (with a matching `name` when requested by the user) + let package = toml .package + .unwrap_or_else(|| panic!("Manifest `{:?}` must contain a `[package]`", path)); + let metadata = package .metadata .unwrap_or_default() .android .unwrap_or_default(); Ok(Self { - version: toml.package.version, + version: package.version, apk_name: metadata.apk_name, android_manifest: metadata.android_manifest, build_targets: metadata.build_targets, @@ -48,18 +58,38 @@ impl Manifest { } #[derive(Debug, Clone, Deserialize)] -struct Root { - package: Package, +pub(crate) struct Root { + pub(crate) package: Option, + pub(crate) workspace: Option, +} + +impl Root { + pub(crate) fn parse_from_toml(path: &Path) -> Result { + let contents = std::fs::read_to_string(path)?; + toml::from_str(&contents).map_err(|e| e.into()) + } } #[derive(Debug, Clone, Deserialize)] -struct Package { - version: String, - metadata: Option, +pub(crate) struct Package { + pub(crate) version: Inheritable, + pub(crate) metadata: Option, +} + +#[derive(Clone, Debug, Deserialize)] +pub(crate) struct Workspace { + pub(crate) package: Option, +} + +/// Almost the same as [`Package`], except that this must provide +/// root values instead of possibly inheritable values +#[derive(Clone, Debug, Deserialize)] +pub(crate) struct WorkspacePackage { + pub(crate) version: Option, } #[derive(Clone, Debug, Default, Deserialize)] -struct PackageMetadata { +pub(crate) struct PackageMetadata { android: Option, } From c47e6c3fb7f11610afed876a0e9aa2cdc859587b Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Wed, 23 Nov 2022 10:13:14 +0100 Subject: [PATCH 32/33] Release ndk-build-0.9.0, cargo-apk-0.9.6 --- cargo-apk/CHANGELOG.md | 3 +++ cargo-apk/Cargo.toml | 4 ++-- ndk-build/CHANGELOG.md | 2 ++ ndk-build/Cargo.toml | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md index 8ec4cd1d..ee3e6447 100644 --- a/cargo-apk/CHANGELOG.md +++ b/cargo-apk/CHANGELOG.md @@ -1,11 +1,14 @@ # Unreleased +# 0.9.6 (2022-11-23) + - Profile signing information can now be specified via the `CARGO_APK__KEYSTORE` and `CARGO_APK__KEYSTORE_PASSWORD` environment variables. The environment variables take precedence over signing information in the cargo manifest. Both environment variables are required except in the case of the `dev` profile, which will fall back to the default password if `CARGO_APK_DEV_KEYSTORE_PASSWORD` is not set. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) - Add `strip` option to `android` metadata, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. ([#356](https://github.com/rust-windowing/android-ndk-rs/pull/356)) - Support [`[workspace.package]` inheritance](https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacepackage-table) from a workspace root manifest for the `version` field under `[package]`. ([#360](https://github.com/rust-windowing/android-ndk-rs/pull/360)) (0.9.5, released on 2022-10-14, was yanked due to unintentionally bumping MSRV through the `quick-xml` crate, and breaking `cargo apk --` parsing after switching to `clap`.) +- Update to `cargo-subcommand 0.8.0` with `clap` argument parser. ([#238](https://github.com/rust-windowing/android-ndk-rs/pull/238)) - Automate `adb reverse` port forwarding through `Cargo.toml` metadata ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) # 0.9.4 (2022-09-12) diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml index 737800f1..f37fe5ac 100644 --- a/cargo-apk/Cargo.toml +++ b/cargo-apk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-apk" -version = "0.9.4" +version = "0.9.6" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Helps cargo build APKs" @@ -18,7 +18,7 @@ clap = { version = "4", features = ["derive"] } dunce = "1" env_logger = "0.9" log = "0.4" -ndk-build = { path = "../ndk-build", version = "0.8.0" } +ndk-build = { path = "../ndk-build", version = "0.9.0" } serde = "1" thiserror = "1" toml = "0.5" diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md index f1b66505..17986c5f 100644 --- a/ndk-build/CHANGELOG.md +++ b/ndk-build/CHANGELOG.md @@ -1,5 +1,7 @@ # Unreleased +# 0.9.0 (2022-11-23) + - Add `ndk::DEFAULT_DEV_KEYSTORE_PASSWORD` and make `apk::ApkConfig::apk` public. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) - `RUSTFLAGS` is now considered if `CARGO_ENCODED_RUSTFLAGS` is not present allowing `cargo apk build` to not break users' builds if they depend on `RUSTFLAGS` being set prior to the build, as `CARGO_ENCODED_RUSTFLAGS` set by `ndk-build` before invoking `cargo` will take precedence over [all other sources of build flags](https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags). ([#357](https://github.com/rust-windowing/android-ndk-rs/pull/357)) diff --git a/ndk-build/Cargo.toml b/ndk-build/Cargo.toml index c6738944..586d8b37 100644 --- a/ndk-build/Cargo.toml +++ b/ndk-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ndk-build" -version = "0.8.0" +version = "0.9.0" authors = ["The Rust Windowing contributors"] edition = "2018" description = "Utilities for building Android binaries" From ce1e65239997440010fecb6186a0f012517555c4 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Wed, 21 Dec 2022 20:43:48 +0000 Subject: [PATCH 33/33] Remove split subdirectories as part of #372 modularization (#374) * ndk-examples: port to use android-activity * Removes ndk-glue + ndk-macro as part of #372 modularization The ndk-glue and ndk-macro subdirectores have been split into a stand-alone repository at: https://github.com/rust-mobile/ndk-glue This is being done as part of the modularization effort described in issue #372 The stand-alone repository was filtered like this: ``` git clone https://github.com/newren/git-filter-repo git clone https://github.com/rust-windowing/android-ndk-rs.git ndk-glue cd ndk-glue py ../git-filter-repo/git-filter-repo \ --path ndk-glue --path ndk-macro \ --path ndk-examples --path-rename ndk-examples:examples \ --path LICENSE-APACHE --path LICENSE-MIT \ --path Cargo.toml --path rustfmt.toml \ --path .github --path .gitignore ``` The last commit in this repo that is included within the stand-alone repository is 107f03e3858bdced3a7a898e43b339b73d7fc1af Although ndk-glue is also being deprecated at the same time as splitting it out this commit doesn't make any README changes for this repo yet which will be addressed separately. * Removes ndk-context as part of #372 modularization The ndk-context subdirectory has been split into a stand-alone repository at: https://github.com/rust-mobile/ndk-context This is being done as part of the modularization effort described in issue #372 The stand-alone repository was filtered like this: ``` git clone https://github.com/newren/git-filter-repo git clone https://github.com/rust-windowing/android-ndk-rs.git ndk-glue cd ndk-glue py ../git-filter-repo/git-filter-repo \ --path ndk-context \ --path ndk-examples --path-rename ndk-examples:examples \ --path LICENSE-APACHE --path LICENSE-MIT \ --path Cargo.toml --path rustfmt.toml \ --path .github --path .gitignore ``` The last commit in this repo that is included within the stand-alone repository is 107f03e3858bdced3a7a898e43b339b73d7fc1af * Removes cargo-apk, ndk-build + ndk-examples as part of #372 modularization The cargo-apk, ndk-build + ndk-examples subdirectores have been split into a stand-alone repository at: https://github.com/rust-mobile/cargo-apk This is being done as part of the modularization effort described in issue #372 The stand-alone repository was filtered like this: ``` git clone https://github.com/newren/git-filter-repo git clone https://github.com/rust-windowing/android-ndk-rs.git ndk-glue cd ndk-glue py ../git-filter-repo/git-filter-repo \ --path cargo-apk --path ndk-build \ --path ndk-examples --path-rename ndk-examples:examples \ --path LICENSE-APACHE --path LICENSE-MIT \ --path Cargo.toml --path rustfmt.toml \ --path .github --path .gitignore ``` The last commit in this repo that is included within the stand-alone repository is 9b4dbface4e336706a4556221e1ee4adbb2e1fa2 The CI for this repo is considerably simpler now that the examples have been moved to the `cargo-apk` repository since it now just checks that the `ndk` and `ndk-sys` crates successfully cross compile without running a hello_world example under an emulator. Runtime tests could be re-added in the future, but especially while there is no significant test coverage from the examples it's more valuable to keep those for testing `cargo-apk` packaging and simplify testing in this repo. --- .github/workflows/android_test.sh | 38 -- .github/workflows/publish.yml | 5 - .github/workflows/rust.yml | 141 +------- Cargo.toml | 6 - cargo-apk/CHANGELOG.md | 105 ------ cargo-apk/Cargo.toml | 24 -- cargo-apk/README.md | 232 ------------ cargo-apk/src/apk.rs | 383 -------------------- cargo-apk/src/error.rs | 31 -- cargo-apk/src/lib.rs | 6 - cargo-apk/src/main.rs | 322 ----------------- cargo-apk/src/manifest.rs | 120 ------- ndk-build/CHANGELOG.md | 97 ------ ndk-build/Cargo.toml | 20 -- ndk-build/src/apk.rs | 328 ----------------- ndk-build/src/cargo.rs | 165 --------- ndk-build/src/dylibs.rs | 43 --- ndk-build/src/error.rs | 53 --- ndk-build/src/lib.rs | 38 -- ndk-build/src/manifest.rs | 329 ----------------- ndk-build/src/ndk.rs | 504 --------------------------- ndk-build/src/readelf.rs | 121 ------- ndk-build/src/target.rs | 79 ----- ndk-context/CHANGELOG.md | 9 - ndk-context/Cargo.toml | 12 - ndk-context/README.md | 6 - ndk-context/src/lib.rs | 100 ------ ndk-examples/Cargo.toml | 30 -- ndk-examples/README.md | 26 -- ndk-examples/examples/hello_world.rs | 14 - ndk-examples/examples/jni_audio.rs | 75 ---- ndk-examples/examples/looper.rs | 158 --------- ndk-glue/CHANGELOG.md | 76 ---- ndk-glue/Cargo.toml | 38 -- ndk-glue/README.md | 6 - ndk-glue/src/lib.rs | 431 ----------------------- ndk-macro/CHANGELOG.md | 15 - ndk-macro/Cargo.toml | 30 -- ndk-macro/README.md | 22 -- ndk-macro/src/expand.rs | 503 -------------------------- ndk-macro/src/helper.rs | 66 ---- ndk-macro/src/lib.rs | 24 -- ndk-macro/src/parse.rs | 197 ----------- 43 files changed, 19 insertions(+), 5009 deletions(-) delete mode 100755 .github/workflows/android_test.sh delete mode 100644 cargo-apk/CHANGELOG.md delete mode 100644 cargo-apk/Cargo.toml delete mode 100644 cargo-apk/README.md delete mode 100644 cargo-apk/src/apk.rs delete mode 100644 cargo-apk/src/error.rs delete mode 100644 cargo-apk/src/lib.rs delete mode 100644 cargo-apk/src/main.rs delete mode 100644 cargo-apk/src/manifest.rs delete mode 100644 ndk-build/CHANGELOG.md delete mode 100644 ndk-build/Cargo.toml delete mode 100644 ndk-build/src/apk.rs delete mode 100644 ndk-build/src/cargo.rs delete mode 100644 ndk-build/src/dylibs.rs delete mode 100644 ndk-build/src/error.rs delete mode 100644 ndk-build/src/lib.rs delete mode 100644 ndk-build/src/manifest.rs delete mode 100644 ndk-build/src/ndk.rs delete mode 100644 ndk-build/src/readelf.rs delete mode 100644 ndk-build/src/target.rs delete mode 100644 ndk-context/CHANGELOG.md delete mode 100644 ndk-context/Cargo.toml delete mode 100644 ndk-context/README.md delete mode 100644 ndk-context/src/lib.rs delete mode 100644 ndk-examples/Cargo.toml delete mode 100644 ndk-examples/README.md delete mode 100644 ndk-examples/examples/hello_world.rs delete mode 100644 ndk-examples/examples/jni_audio.rs delete mode 100644 ndk-examples/examples/looper.rs delete mode 100644 ndk-glue/CHANGELOG.md delete mode 100644 ndk-glue/Cargo.toml delete mode 100644 ndk-glue/README.md delete mode 100644 ndk-glue/src/lib.rs delete mode 100644 ndk-macro/CHANGELOG.md delete mode 100644 ndk-macro/Cargo.toml delete mode 100644 ndk-macro/README.md delete mode 100644 ndk-macro/src/expand.rs delete mode 100644 ndk-macro/src/helper.rs delete mode 100644 ndk-macro/src/lib.rs delete mode 100644 ndk-macro/src/parse.rs diff --git a/.github/workflows/android_test.sh b/.github/workflows/android_test.sh deleted file mode 100755 index 6368cabc..00000000 --- a/.github/workflows/android_test.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -set -ex - -# Make sure the package is removed since it may end up in the AVD cache. This causes -# INSTALL_FAILED_UPDATE_INCOMPATIBLE errors when the debug keystore is regenerated, -# as it is not stored/cached on the CI: -# https://github.com/rust-windowing/android-ndk-rs/blob/240389f1e281f582b84a8049e2afaa8677d901c2/ndk-build/src/ndk.rs#L308-L332 -adb uninstall rust.example.hello_world || true - -if [ -z "$1" ]; -then - cargo apk run -p ndk-examples --target x86_64-linux-android --example hello_world --no-logcat -else - adb install -r "$1/hello_world.apk" - adb shell am start -a android.intent.action.MAIN -n "rust.example.hello_world/android.app.NativeActivity" -fi - -sleep 30s - -adb logcat *:E hello-world:V -d | tee ~/logcat.log - -if grep 'hello world' ~/logcat.log; -then - echo "App running" -else - echo "::error::App not running" - exit 1 -fi - -ERROR_MSG=$(grep -e 'thread.*panicked at' "$HOME"/logcat.log | true) -if [ -z "${ERROR_MSG}" ]; -then - exit 0 -else - echo "::error::${ERROR_MSG}" - exit 1 -fi diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 22b83e91..092895bf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,11 +16,6 @@ jobs: crate: - { name: "ndk-sys", target: "armv7-linux-androideabi" } - { name: "ndk", target: "armv7-linux-androideabi" } - - { name: "ndk-macro", target: "x86_64-unknown-linux-gnu" } - - { name: "ndk-context", target: "armv7-linux-androideabi" } - - { name: "ndk-glue", target: "armv7-linux-androideabi" } - - { name: "ndk-build", target: "x86_64-unknown-linux-gnu" } - - { name: "cargo-apk", target: "x86_64-unknown-linux-gnu" } steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index a6e2b01c..6506c6e6 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -30,10 +30,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: clippy - # Use one of our supported targets to lint all crates including - # the target-specific `ndk` in one go. - # This assumes our host-tools (cargo-apk and dependencies) - # also compile cleanly under this target. + # Use a cross-compilation target (that's typical for Android) to lint everything args: --all --all-targets --all-features --target aarch64-linux-android -- -Dwarnings check_msrv: @@ -47,7 +44,7 @@ jobs: - uses: actions-rs/cargo@v1 with: command: check - # See comment above about using one of our supported targets. + # Use a cross-compilation target (that's typical for Android) to lint everything args: --workspace --all-targets --all-features --target aarch64-linux-android build: @@ -57,123 +54,39 @@ jobs: os: [ubuntu-latest] rust-channel: ['stable', 'nightly'] rust-target: - - 'armv7-linux-androideabi' - - 'aarch64-linux-android' - - 'i686-linux-android' - - 'x86_64-linux-android' + - { triple: 'armv7-linux-androideabi', abi: armeabi-v7a } + - { triple: 'aarch64-linux-android', abi: arm64-v8a } + - { triple: 'i686-linux-android', abi: x86 } + - { triple: 'x86_64-linux-android', abi: x86_64 } include: - os: windows-latest rust-channel: 'stable' - rust-target: 'aarch64-linux-android' + rust-target: { triple: 'aarch64-linux-android', abi: arm64-v8a } - os: windows-latest rust-channel: 'stable' - rust-target: 'x86_64-linux-android' + rust-target: { triple: 'x86_64-linux-android', abi: x86_64 } runs-on: ${{ matrix.os }} - name: Build apk + name: Cross-compile steps: - uses: actions/checkout@v2 - - name: Installing Rust ${{ matrix.rust-channel }} w/ ${{ matrix.rust-target }} + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + + - name: Install cargo-ndk + run: cargo install cargo-ndk + + - name: Installing Rust ${{ matrix.rust-channel }} w/ ${{ matrix.rust-target.triple }} uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust-channel }} - target: ${{ matrix.rust-target }} + target: ${{ matrix.rust-target.triple }} override: true - - name: Install cargo-apk - run: - cargo install --path cargo-apk - - - name: Cargo check for target ${{ matrix.rust-target }} - run: cargo check -p ndk --target ${{ matrix.rust-target }} --all-features - - - name: Cargo apk build for target ${{ matrix.rust-target }} - run: cargo apk build -p ndk-examples --target ${{ matrix.rust-target }} --examples - - - uses: actions/upload-artifact@v2 - # Only need this for CI, unless users are interested in downloading - # a ready-made app that does nothing but printing "hello world". - if: ${{ matrix.rust-target == 'x86_64-linux-android' }} - name: Upload hello_world apk - with: - name: hello_world_${{ matrix.os }}_${{ matrix.rust-target }} - path: ./target/debug/apk/examples/hello_world.apk - - android_emulator: - name: hello_world example on emulator - needs: build - runs-on: macos-latest - strategy: - matrix: - source_os: [ubuntu-latest, windows-latest, local] - env: - api-level: 29 - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - arch: x86_64 - # the `googleapis` emulator target is considerably slower on CI. - target: default - profile: Nexus 6 - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - uses: actions/download-artifact@v2 - name: Download hello_world APK - if: ${{ matrix.source_os != 'local' }} - id: download - with: - name: hello_world_${{ matrix.source_os }}_x86_64-linux-android - - - name: Install `cargo-apk` and add `x86_64-linux-android` target - if: ${{ matrix.source_os == 'local' }} - run: | - cargo install --path cargo-apk - rustup target add x86_64-linux-android - - - name: AVD cache - uses: actions/cache@v2 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - # Bump the trailing number when making changes to the emulator setup below - key: avd-${{ env.api-level }}-1 - - - name: create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.api-level }} - arch: ${{ env.arch }} - target: ${{ env.target }} - profile: ${{ env.profile }} - emulator-options: ${{ env.emulator-options }} - disable-animations: true - force-avd-creation: false - script: echo "Generated AVD snapshot for caching." - - - name: Start hello_world example - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.api-level }} - arch: ${{ env.arch }} - target: ${{ env.target }} - profile: ${{ env.profile }} - emulator-options: -no-snapshot-save ${{ env.emulator-options }} - disable-animations: true - force-avd-creation: false - script: ./.github/workflows/android_test.sh "${{ steps.download.outputs.download-path }}" - - - name: Upload emulator logs - uses: actions/upload-artifact@v2 - if: ${{ always() }} - with: - name: log - path: ~/logcat.log + - name: Compile for ${{ matrix.rust-target.triple }} + run: cargo ndk -t ${{ matrix.rust-target.abi }} build build-host: strategy: @@ -202,22 +115,6 @@ jobs: run: cargo test -p ndk --all-features - - name: Test ndk-build - run: - cargo test -p ndk-build --all-features - - - name: Test ndk-glue - run: - cargo test -p ndk-glue --all-features - - - name: Test ndk-macro - run: - cargo test -p ndk-macro --all-features - - - name: Test cargo-apk - run: - cargo test -p cargo-apk --all-features - docs: strategy: fail-fast: false diff --git a/Cargo.toml b/Cargo.toml index b189f3e0..44881983 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,5 @@ [workspace] members = [ "ndk", - "ndk-context", - "ndk-macro", - "ndk-build", - "ndk-examples", - "ndk-glue", "ndk-sys", - "cargo-apk", ] diff --git a/cargo-apk/CHANGELOG.md b/cargo-apk/CHANGELOG.md deleted file mode 100644 index ee3e6447..00000000 --- a/cargo-apk/CHANGELOG.md +++ /dev/null @@ -1,105 +0,0 @@ -# Unreleased - -# 0.9.6 (2022-11-23) - -- Profile signing information can now be specified via the `CARGO_APK__KEYSTORE` and `CARGO_APK__KEYSTORE_PASSWORD` environment variables. The environment variables take precedence over signing information in the cargo manifest. Both environment variables are required except in the case of the `dev` profile, which will fall back to the default password if `CARGO_APK_DEV_KEYSTORE_PASSWORD` is not set. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) -- Add `strip` option to `android` metadata, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. ([#356](https://github.com/rust-windowing/android-ndk-rs/pull/356)) -- Support [`[workspace.package]` inheritance](https://doc.rust-lang.org/cargo/reference/workspaces.html#the-workspacepackage-table) from a workspace root manifest for the `version` field under `[package]`. ([#360](https://github.com/rust-windowing/android-ndk-rs/pull/360)) - -(0.9.5, released on 2022-10-14, was yanked due to unintentionally bumping MSRV through the `quick-xml` crate, and breaking `cargo apk --` parsing after switching to `clap`.) - -- Update to `cargo-subcommand 0.8.0` with `clap` argument parser. ([#238](https://github.com/rust-windowing/android-ndk-rs/pull/238)) -- Automate `adb reverse` port forwarding through `Cargo.toml` metadata ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) - -# 0.9.4 (2022-09-12) - -- Upgrade to latest `ndk-build` to deduplicate libraries before packaging them into the APK. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) -- Support `android:resizeableActivity`. ([#338](https://github.com/rust-windowing/android-ndk-rs/pull/338)) -- Add `--device` argument to select `adb` device by serial (see `adb devices` for connected devices and their serial). ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) -- Print and follow `adb logcat` output after starting app. ([#332](https://github.com/rust-windowing/android-ndk-rs/pull/332)) - -# 0.9.3 (2022-07-05) - -- Allow configuration of alternate debug keystore location; require keystore location for release builds. ([#299](https://github.com/rust-windowing/android-ndk-rs/pull/299)) -- **Breaking:** Rename `Activity::intent_filters` back to `Activity::intent_filter`. ([#305](https://github.com/rust-windowing/android-ndk-rs/pull/305)) - -# 0.9.2 (2022-06-11) - -- Move NDK r23 `-lgcc` workaround to `ndk_build::cargo::cargo_ndk()`, to also apply to our `cargo apk --` invocations. ([#286](https://github.com/rust-windowing/android-ndk-rs/pull/286)) -- Disable `aapt` compression for the [(default) `dev` profile](https://doc.rust-lang.org/cargo/reference/profiles.html). ([#283](https://github.com/rust-windowing/android-ndk-rs/pull/283)) -- Append `--target` to blanket `cargo apk --` calls when not provided by the user. ([#287](https://github.com/rust-windowing/android-ndk-rs/pull/287)) - -# 0.9.1 (2022-05-12) - -- Reimplement NDK r23 `-lgcc` workaround using `RUSTFLAGS`, to apply to transitive `cdylib` compilations. (#270) - -# 0.9.0 (2022-05-07) - -- **Breaking:** Use `min_sdk_version` to select compiler target instead of `target_sdk_version`. ([#197](https://github.com/rust-windowing/android-ndk-rs/pull/197)) - See for more details. -- **Breaking:** Default `target_sdk_version` to `30` or lower (instead of the highest supported SDK version by the detected NDK toolchain) - for more consistent interaction with Android backwards compatibility handling and its increasingly strict usage rules: - - ([#203](https://github.com/rust-windowing/android-ndk-rs/pull/203)) -- Allow manifest `package` property to be provided in `Cargo.toml`. ([#236](https://github.com/rust-windowing/android-ndk-rs/pull/236)) -- Add `MAIN` intent filter in `from_subcommand` instead of relying on a custom serialization function in `ndk-build`. ([#241](https://github.com/rust-windowing/android-ndk-rs/pull/241)) -- Export the sole `NativeActivity` (through `android:exported="true"`) to allow it to be started by default if targeting Android S or higher. ([#242](https://github.com/rust-windowing/android-ndk-rs/pull/242)) -- `cargo-apk` version can now be queried through `cargo apk version`. ([#218](https://github.com/rust-windowing/android-ndk-rs/pull/218)) -- Environment variables from `.cargo/config.toml`'s `[env]` section are now propagated to the process environment. ([#249](https://github.com/rust-windowing/android-ndk-rs/pull/249)) - -# 0.8.2 (2021-11-22) - -- Fixed the library name in case of multiple build artifacts in the Android manifest. -- Work around missing `libgcc` on NDK r23 beta 3 and above, by providing linker script that "redirects" to `libunwind`. - See and for more details. - -# 0.8.1 (2021-08-06) - -- Updated to use [ndk-build 0.4.2](../ndk-build/CHANGELOG.md#042-2021-08-06) - -# 0.8.0 (2021-07-06) - -- Added `runtime_libs` path to android metadata for packaging extra dynamic libraries into the apk. - -# 0.7.0 (2021-05-10) - -- Added `cargo apk check`. Useful for compile-testing crates that contain C/C++ dependencies or - target-specific conditional compilation, but do not provide a cdylib target. -- Added `apk_name` field to android metadata for APK file naming (defaults to Rust library name if unspecified). - The application label is now no longer used for this purpose, and can contain a string resource ID from now on. - -# 0.6.0 (2021-04-20) - -- **Breaking:** uses `ndk-build`'s new (de)serialized `Manifest` struct to properly serialize a toml's `[package.metadata.android]` to an `AndroidManifest.xml`. The `[package.metadata.android]` now closely resembles the structure of [an android manifest file](https://developer.android.com/guide/topics/manifest/manifest-element). See [README](README.md) for an example of the new `[package.metadata.android]` structure and all manifest attributes that are currently supported. - -# 0.5.6 (2020-11-25) - -- Use `dunce::simplified` when extracting the manifest's assets and resource folder -- Updated to use [ndk-build 0.1.4](../ndk-build/CHANGELOG.md#014-2020-11-25) - -# 0.5.5 (2020-11-21) - -- Updated to use [ndk-build 0.1.3](../ndk-build/CHANGELOG.md#013-2020-11-21) - -# 0.5.4 (2020-11-01) - -- Added support for activity metadata entries. -- Fix glob member resolution in workspaces. - -# 0.5.3 (2020-10-15) - -- Fix `res` folder resolve. - -# 0.5.2 (2020-09-15) - -- Updated to use [ndk-build 0.1.2](../ndk-build/CHANGELOG.md#012-2020-09-15) - -# 0.5.1 (2020-07-15) - -- Updated to use [ndk-build 0.1.1](../ndk-build/CHANGELOG.md#011-2020-07-15) - -# 0.5.0 (2020-04-22) - -- Updated to use [ndk-build 0.1.0](../ndk-build/CHANGELOG.md#010-2020-04-22) -- First release in almost 3 years! 🎉 -- **Breaking:** A ton of things changed! diff --git a/cargo-apk/Cargo.toml b/cargo-apk/Cargo.toml deleted file mode 100644 index f37fe5ac..00000000 --- a/cargo-apk/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "cargo-apk" -version = "0.9.6" -authors = ["The Rust Windowing contributors"] -edition = "2018" -description = "Helps cargo build APKs" -license = "MIT OR Apache-2.0" -keywords = ["android", "ndk", "apk"] -documentation = "https://docs.rs/cargo-apk" -homepage = "https://github.com/rust-windowing/android-ndk-rs" -repository = "https://github.com/rust-windowing/android-ndk-rs" -rust-version = "1.60" - -[dependencies] -anyhow = "1.0.57" -cargo-subcommand = "0.10" -clap = { version = "4", features = ["derive"] } -dunce = "1" -env_logger = "0.9" -log = "0.4" -ndk-build = { path = "../ndk-build", version = "0.9.0" } -serde = "1" -thiserror = "1" -toml = "0.5" diff --git a/cargo-apk/README.md b/cargo-apk/README.md deleted file mode 100644 index edae6e11..00000000 --- a/cargo-apk/README.md +++ /dev/null @@ -1,232 +0,0 @@ -# cargo apk - -Tool for creating Android packages. - -## Installation - -From crates.io: -```console -$ cargo install cargo-apk -``` - -From source: -```console -$ cargo install --path . -``` - -## Commands - -- `build`: Compiles the current package -- `run`: Run a binary or example of the local package -- `gdb`: Start a gdb session attached to an adb device with symbols loaded - -## Manifest - -`cargo` supports the `metadata` table for configurations for external tools like `cargo apk`. -Following configuration options are supported by `cargo apk` under `[package.metadata.android]`: - -```toml -[package.metadata.android] -# Specifies the package property of the manifest. -package = "com.foo.bar" - -# Specifies the array of targets to build for. -build_targets = [ "armv7-linux-androideabi", "aarch64-linux-android", "i686-linux-android", "x86_64-linux-android" ] - -# Path to your application's resources folder. -# If not specified, resources will not be included in the APK. -resources = "path/to/resources_folder" - -# Path to the folder containing your application's assets. -# If not specified, assets will not be included in the APK. -assets = "path/to/assets_folder" - -# Name for final APK file. -# Defaults to package name. -apk_name = "myapp" - -# `default` (or unspecified) - Debug symbols, if they exist, are not treated -# specially. -# -# `strip` - Debug symbols are stripped from the shared -# libraries before being copied into the APK. -# -# `split` - Functions the same as `strip`, except the debug -# symbols are written to the apk output directory -# alongside the stripped shared libraries, with -# a `.dwarf` extension. -# -# Note that the `strip` and `split` options will only have an effect if -# debug symbols are present in the `.so` file(s) produced by your build, enabling -# https://doc.rust-lang.org/cargo/reference/profiles.html#strip or -# https://doc.rust-lang.org/cargo/reference/profiles.html#split-debuginfo -# in your cargo manifest can cause debug symbols to no longer be present -# in the `.so`. -strip = "default" - -# Folder containing extra shared libraries intended to be dynamically loaded at runtime. -# Files matching `libs_folder/${android_abi}/*.so` are added to the apk -# according to the specified build_targets. -runtime_libs = "path/to/libs_folder" - -# Defaults to `$HOME/.android/debug.keystore` for the `dev` profile. Will ONLY -# generate a new debug.keystore if this file does NOT exist. A keystore is never -# auto-generated for other profiles. -# -# The keystore path can be absolute, or relative to the Cargo.toml file. -# -# The environment variables `CARGO_APK__KEYSTORE` and -# `CARGO_APK__KEYSTORE_PASSWORD` can be set to a keystore path -# and keystore password respectively. The profile portion follows the same rules -# as ``, it is the uppercased profile name with `-` replaced with `_`. -# -# If present they take precedence over the signing information in the manifest. -[package.metadata.android.signing.] -path = "relative/or/absolute/path/to/my.keystore" -keystore_password = "android" - -# See https://developer.android.com/guide/topics/manifest/uses-sdk-element -# -# Defaults to a `min_sdk_version` of 23 and `target_sdk_version` of 30 (or lower if the detected NDK doesn't support this). -[package.metadata.android.sdk] -min_sdk_version = 23 -target_sdk_version = 30 -max_sdk_version = 29 - -# See https://developer.android.com/guide/topics/manifest/uses-feature-element -# -# Note: there can be multiple .uses_feature entries. -[[package.metadata.android.uses_feature]] -name = "android.hardware.vulkan.level" -required = true -version = 1 - -# See https://developer.android.com/guide/topics/manifest/uses-permission-element -# -# Note: there can be multiple .uses_permission entries. -[[package.metadata.android.uses_permission]] -name = "android.permission.WRITE_EXTERNAL_STORAGE" -max_sdk_version = 18 - -# See https://developer.android.com/guide/topics/manifest/queries-element#provider -[[package.metadata.android.queries.provider]] -authorities = "org.khronos.openxr.runtime_broker;org.khronos.openxr.system_runtime_broker" -# Note: The `name` attribute is normally not required for a queries provider, but is non-optional -# as a workaround for aapt throwing errors about missing `android:name` attribute. -# This will be made optional if/when cargo-apk migrates to aapt2. -name = "org.khronos.openxr" - -# See https://developer.android.com/guide/topics/manifest/queries-element#intent -[[package.metadata.android.queries.intent]] -actions = ["android.intent.action.SEND"] - -# See https://developer.android.com/guide/topics/manifest/queries-element#intent -# Note: there can be several .data entries. -[[package.metadata.android.queries.intent.data]] -mime_type = "image/jpeg" - -# See https://developer.android.com/guide/topics/manifest/queries-element#package -[[package.metadata.android.queries.package]] -name = "org.freedesktop.monado.openxr_runtime.in_process" - -# See https://developer.android.com/guide/topics/manifest/application-element -[package.metadata.android.application] - -# See https://developer.android.com/guide/topics/manifest/application-element#debug -# -# Defaults to false. -debuggable = false - -# See https://developer.android.com/guide/topics/manifest/application-element#theme -# -# Example shows setting the theme of an application to fullscreen. -theme = "@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen" - -# Virtual path your application's icon for any mipmap level. -# If not specified, an icon will not be included in the APK. -icon = "@mipmap/ic_launcher" - -# See https://developer.android.com/guide/topics/manifest/application-element#label -# -# Defaults to the compiled artifact's name. -label = "Application Name" - -# See https://developer.android.com/guide/topics/manifest/meta-data-element -# -# Note: there can be several .meta_data entries. -# Note: the `resource` attribute is currently not supported. -[[package.metadata.android.application.meta_data]] -name = "com.samsung.android.vr.application.mode" -value = "vr_only" - -# See https://developer.android.com/guide/topics/manifest/activity-element -[package.metadata.android.application.activity] - -# See https://developer.android.com/guide/topics/manifest/activity-element#config -# -# Defaults to "orientation|keyboardHidden|screenSize". -config_changes = "orientation" - -# See https://developer.android.com/guide/topics/manifest/activity-element#label -# -# Defaults to the application's label. -label = "Activity Name" - -# See https://developer.android.com/guide/topics/manifest/activity-element#lmode -# -# Defaults to "standard". -launch_mode = "singleTop" - -# See https://developer.android.com/guide/topics/manifest/activity-element#screen -# -# Defaults to "unspecified". -orientation = "landscape" - -# See https://developer.android.com/guide/topics/manifest/activity-element#exported -# -# Unset by default, or true when targeting Android >= 31 (S and up). -exported = true - -# See https://developer.android.com/guide/topics/manifest/activity-element#resizeableActivity -# -# Defaults to true on Android >= 24, no effect on earlier API levels -resizeable_activity = false - -# See https://developer.android.com/guide/topics/manifest/meta-data-element -# -# Note: there can be several .meta_data entries. -# Note: the `resource` attribute is currently not supported. -[[package.metadata.android.application.activity.meta_data]] -name = "com.oculus.vr.focusaware" -value = "true" - -# See https://developer.android.com/guide/topics/manifest/intent-filter-element -# -# Note: there can be several .intent_filter entries. -[[package.metadata.android.application.activity.intent_filter]] -# See https://developer.android.com/guide/topics/manifest/action-element -actions = ["android.intent.action.VIEW", "android.intent.action.WEB_SEARCH"] -# See https://developer.android.com/guide/topics/manifest/category-element -categories = ["android.intent.category.DEFAULT", "android.intent.category.BROWSABLE"] - -# See https://developer.android.com/guide/topics/manifest/data-element -# -# Note: there can be several .data entries. -# Note: not specifying an attribute excludes it from the final data specification. -[[package.metadata.android.application.activity.intent_filter.data]] -scheme = "https" -host = "github.com" -port = "8080" -path = "/rust-windowing/android-ndk-rs/tree/master/cargo-apk" -path_prefix = "/rust-windowing/" -mime_type = "image/jpeg" - -# Set up reverse port forwarding through `adb reverse`, meaning that if the -# Android device connects to `localhost` on port `1338` it will be routed to -# the host on port `1338` instead. Source and destination ports can differ, -# see the `adb` help page for possible configurations. -[package.metadata.android.reverse_port_forward] -"tcp:1338" = "tcp:1338" -``` - -If a manifest attribute is not supported by `cargo apk` feel free to create a PR that adds the missing attribute. diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs deleted file mode 100644 index a807135f..00000000 --- a/cargo-apk/src/apk.rs +++ /dev/null @@ -1,383 +0,0 @@ -use crate::error::Error; -use crate::manifest::{Inheritable, Manifest, Root}; -use cargo_subcommand::{Artifact, CrateType, Profile, Subcommand}; -use ndk_build::apk::{Apk, ApkConfig}; -use ndk_build::cargo::{cargo_ndk, VersionCode}; -use ndk_build::dylibs::get_libs_search_paths; -use ndk_build::error::NdkError; -use ndk_build::manifest::{IntentFilter, MetaData}; -use ndk_build::ndk::{Key, Ndk}; -use ndk_build::target::Target; -use std::path::PathBuf; - -pub struct ApkBuilder<'a> { - cmd: &'a Subcommand, - ndk: Ndk, - manifest: Manifest, - build_dir: PathBuf, - build_targets: Vec, - device_serial: Option, -} - -impl<'a> ApkBuilder<'a> { - pub fn from_subcommand( - cmd: &'a Subcommand, - device_serial: Option, - ) -> Result { - println!( - "Using package `{}` in `{}`", - cmd.package(), - cmd.manifest().display() - ); - let ndk = Ndk::from_env()?; - let mut manifest = Manifest::parse_from_toml(cmd.manifest())?; - let workspace_manifest: Option = cmd - .workspace_manifest() - .map(Root::parse_from_toml) - .transpose()?; - let build_targets = if let Some(target) = cmd.target() { - vec![Target::from_rust_triple(target)?] - } else if !manifest.build_targets.is_empty() { - manifest.build_targets.clone() - } else { - vec![ndk - .detect_abi(device_serial.as_deref()) - .unwrap_or(Target::Arm64V8a)] - }; - let build_dir = dunce::simplified(cmd.target_dir()) - .join(cmd.profile()) - .join("apk"); - - let package_version = match &manifest.version { - Inheritable::Value(v) => v.clone(), - Inheritable::Inherited { workspace: true } => { - let workspace = workspace_manifest - .ok_or(Error::InheritanceMissingWorkspace)? - .workspace - .unwrap_or_else(|| { - // Unlikely to fail as cargo-subcommand should give us - // a `Cargo.toml` containing a `[workspace]` table - panic!( - "Manifest `{:?}` must contain a `[workspace]` table", - cmd.workspace_manifest().unwrap() - ) - }); - - workspace - .package - .ok_or(Error::WorkspaceMissingInheritedField("package"))? - .version - .ok_or(Error::WorkspaceMissingInheritedField("package.version"))? - } - Inheritable::Inherited { workspace: false } => return Err(Error::InheritedFalse), - }; - let version_code = VersionCode::from_semver(&package_version)?.to_code(1); - - // Set default Android manifest values - if manifest - .android_manifest - .version_name - .replace(package_version) - .is_some() - { - panic!("version_name should not be set in TOML"); - } - - if manifest - .android_manifest - .version_code - .replace(version_code) - .is_some() - { - panic!("version_code should not be set in TOML"); - } - - let target_sdk_version = *manifest - .android_manifest - .sdk - .target_sdk_version - .get_or_insert_with(|| ndk.default_target_platform()); - - manifest - .android_manifest - .application - .debuggable - .get_or_insert_with(|| *cmd.profile() == Profile::Dev); - - let activity = &mut manifest.android_manifest.application.activity; - - // Add a default `MAIN` action to launch the activity, if the user didn't supply it by hand. - if activity - .intent_filter - .iter() - .all(|i| i.actions.iter().all(|f| f != "android.intent.action.MAIN")) - { - activity.intent_filter.push(IntentFilter { - actions: vec!["android.intent.action.MAIN".to_string()], - categories: vec!["android.intent.category.LAUNCHER".to_string()], - data: vec![], - }); - } - - // Export the sole Rust activity on Android S and up, if the user didn't explicitly do so. - // Without this, apps won't start on S+. - // https://developer.android.com/about/versions/12/behavior-changes-12#exported - if target_sdk_version >= 31 { - activity.exported.get_or_insert(true); - } - - Ok(Self { - cmd, - ndk, - manifest, - build_dir, - build_targets, - device_serial, - }) - } - - pub fn check(&self) -> Result<(), Error> { - for target in &self.build_targets { - let mut cargo = cargo_ndk( - &self.ndk, - *target, - self.min_sdk_version(), - self.cmd.target_dir(), - )?; - cargo.arg("check"); - if self.cmd.target().is_none() { - let triple = target.rust_triple(); - cargo.arg("--target").arg(triple); - } - self.cmd.args().apply(&mut cargo); - if !cargo.status()?.success() { - return Err(NdkError::CmdFailed(cargo).into()); - } - } - Ok(()) - } - - pub fn build(&self, artifact: &Artifact) -> Result { - // Set artifact specific manifest default values. - let mut manifest = self.manifest.android_manifest.clone(); - - if manifest.package.is_empty() { - manifest.package = match artifact { - Artifact::Root(name) => format!("rust.{}", name.replace('-', "_")), - Artifact::Example(name) => format!("rust.example.{}", name.replace('-', "_")), - }; - } - - if manifest.application.label.is_empty() { - manifest.application.label = artifact.name().to_string(); - } - - manifest.application.activity.meta_data.push(MetaData { - name: "android.app.lib_name".to_string(), - value: artifact.name().replace('-', "_"), - }); - - let crate_path = self.cmd.manifest().parent().expect("invalid manifest path"); - - let is_debug_profile = *self.cmd.profile() == Profile::Dev; - - let assets = self - .manifest - .assets - .as_ref() - .map(|assets| dunce::simplified(&crate_path.join(assets)).to_owned()); - let resources = self - .manifest - .resources - .as_ref() - .map(|res| dunce::simplified(&crate_path.join(res)).to_owned()); - let runtime_libs = self - .manifest - .runtime_libs - .as_ref() - .map(|libs| dunce::simplified(&crate_path.join(libs)).to_owned()); - let apk_name = self - .manifest - .apk_name - .clone() - .unwrap_or_else(|| artifact.name().to_string()); - - let config = ApkConfig { - ndk: self.ndk.clone(), - build_dir: self.build_dir.join(artifact), - apk_name, - assets, - resources, - manifest, - disable_aapt_compression: is_debug_profile, - strip: self.manifest.strip, - reverse_port_forward: self.manifest.reverse_port_forward.clone(), - }; - let mut apk = config.create_apk()?; - - for target in &self.build_targets { - let triple = target.rust_triple(); - let build_dir = self.cmd.build_dir(Some(triple)); - let artifact = self.cmd.artifact(artifact, Some(triple), CrateType::Cdylib); - - let mut cargo = cargo_ndk( - &self.ndk, - *target, - self.min_sdk_version(), - self.cmd.target_dir(), - )?; - cargo.arg("build"); - if self.cmd.target().is_none() { - cargo.arg("--target").arg(triple); - } - self.cmd.args().apply(&mut cargo); - - if !cargo.status()?.success() { - return Err(NdkError::CmdFailed(cargo).into()); - } - - let mut libs_search_paths = - get_libs_search_paths(self.cmd.target_dir(), triple, self.cmd.profile().as_ref())?; - libs_search_paths.push(build_dir.join("deps")); - - let libs_search_paths = libs_search_paths - .iter() - .map(|path| path.as_path()) - .collect::>(); - - apk.add_lib_recursively(&artifact, *target, libs_search_paths.as_slice())?; - - if let Some(runtime_libs) = &runtime_libs { - apk.add_runtime_libs(runtime_libs, *target, libs_search_paths.as_slice())?; - } - } - - let profile_name = match self.cmd.profile() { - Profile::Dev => "dev", - Profile::Release => "release", - Profile::Custom(c) => c.as_str(), - }; - - let keystore_env = format!( - "CARGO_APK_{}_KEYSTORE", - profile_name.to_uppercase().replace('-', "_") - ); - let password_env = format!("{}_PASSWORD", keystore_env); - - let path = std::env::var_os(&keystore_env).map(PathBuf::from); - let password = std::env::var(&password_env).ok(); - - let signing_key = match (path, password) { - (Some(path), Some(password)) => Key { path, password }, - (Some(path), None) if is_debug_profile => { - eprintln!( - "{} not specified, falling back to default password", - password_env - ); - Key { - path, - password: ndk_build::ndk::DEFAULT_DEV_KEYSTORE_PASSWORD.to_owned(), - } - } - (Some(path), None) => { - eprintln!("`{}` was specified via `{}`, but `{}` was not specified, both or neither must be present for profiles other than `dev`", path.display(), keystore_env, password_env); - return Err(Error::MissingReleaseKey(profile_name.to_owned())); - } - (None, _) => { - if let Some(msk) = self.manifest.signing.get(profile_name) { - Key { - path: crate_path.join(&msk.path), - password: msk.keystore_password.clone(), - } - } else if is_debug_profile { - self.ndk.debug_key()? - } else { - return Err(Error::MissingReleaseKey(profile_name.to_owned())); - } - } - }; - - let unsigned = apk.add_pending_libs_and_align()?; - - println!( - "Signing `{}` with keystore `{}`", - config.apk().display(), - signing_key.path.display() - ); - Ok(unsigned.sign(signing_key)?) - } - - pub fn run(&self, artifact: &Artifact, no_logcat: bool) -> Result<(), Error> { - let apk = self.build(artifact)?; - apk.reverse_port_forwarding(self.device_serial.as_deref())?; - apk.install(self.device_serial.as_deref())?; - let pid = apk.start(self.device_serial.as_deref())?; - - if !no_logcat { - self.ndk - .adb(self.device_serial.as_deref())? - .arg("logcat") - .arg("-v") - .arg("color") - .arg("--pid") - .arg(pid.to_string()) - .status()?; - } - - Ok(()) - } - - pub fn gdb(&self, artifact: &Artifact) -> Result<(), Error> { - let apk = self.build(artifact)?; - apk.install(self.device_serial.as_deref())?; - - let target_dir = self.build_dir.join(artifact); - self.ndk.ndk_gdb( - &target_dir, - "android.app.NativeActivity", - self.device_serial.as_deref(), - )?; - Ok(()) - } - - pub fn default(&self, cargo_cmd: &str, cargo_args: &[String]) -> Result<(), Error> { - for target in &self.build_targets { - let mut cargo = cargo_ndk( - &self.ndk, - *target, - self.min_sdk_version(), - self.cmd.target_dir(), - )?; - cargo.arg(cargo_cmd); - self.cmd.args().apply(&mut cargo); - - if self.cmd.target().is_none() { - let triple = target.rust_triple(); - cargo.arg("--target").arg(triple); - } - - for additional_arg in cargo_args { - cargo.arg(additional_arg); - } - - if !cargo.status()?.success() { - return Err(NdkError::CmdFailed(cargo).into()); - } - } - Ok(()) - } - - /// Returns `minSdkVersion` for use in compiler target selection: - /// - /// - /// Has a lower bound of `23` to retain backwards compatibility with - /// the previous default. - fn min_sdk_version(&self) -> u32 { - self.manifest - .android_manifest - .sdk - .min_sdk_version - .unwrap_or(23) - .max(23) - } -} diff --git a/cargo-apk/src/error.rs b/cargo-apk/src/error.rs deleted file mode 100644 index 95228655..00000000 --- a/cargo-apk/src/error.rs +++ /dev/null @@ -1,31 +0,0 @@ -use cargo_subcommand::Error as SubcommandError; -use ndk_build::error::NdkError; -use std::io::Error as IoError; -use thiserror::Error; -use toml::de::Error as TomlError; - -#[derive(Debug, Error)] -pub enum Error { - #[error(transparent)] - Subcommand(#[from] SubcommandError), - #[error("Failed to parse config.")] - Config(#[from] TomlError), - #[error(transparent)] - Ndk(#[from] NdkError), - #[error(transparent)] - Io(#[from] IoError), - #[error("Configure a release keystore via `[package.metadata.android.signing.{0}]`")] - MissingReleaseKey(String), - #[error("`workspace=false` is unsupported")] - InheritedFalse, - #[error("`workspace=true` requires a workspace")] - InheritanceMissingWorkspace, - #[error("Failed to inherit field: `workspace.{0}` was not defined in workspace root manifest")] - WorkspaceMissingInheritedField(&'static str), -} - -impl Error { - pub fn invalid_args() -> Self { - Self::Subcommand(SubcommandError::InvalidArgs) - } -} diff --git a/cargo-apk/src/lib.rs b/cargo-apk/src/lib.rs deleted file mode 100644 index 4288b6e7..00000000 --- a/cargo-apk/src/lib.rs +++ /dev/null @@ -1,6 +0,0 @@ -mod apk; -mod error; -mod manifest; - -pub use apk::ApkBuilder; -pub use error::Error; diff --git a/cargo-apk/src/main.rs b/cargo-apk/src/main.rs deleted file mode 100644 index fab80d0d..00000000 --- a/cargo-apk/src/main.rs +++ /dev/null @@ -1,322 +0,0 @@ -use std::collections::HashMap; - -use cargo_apk::{ApkBuilder, Error}; -use cargo_subcommand::Subcommand; -use clap::{CommandFactory, FromArgMatches, Parser}; - -#[derive(Parser)] -struct Cmd { - #[clap(subcommand)] - apk: ApkCmd, -} - -#[derive(clap::Subcommand)] -enum ApkCmd { - /// Helps cargo build apks for Android - Apk { - #[clap(subcommand)] - cmd: ApkSubCmd, - }, -} - -#[derive(Clone, Debug, Eq, PartialEq, Parser)] -#[group(skip)] -struct Args { - #[clap(flatten)] - subcommand_args: cargo_subcommand::Args, - /// Use device with the given serial (see `adb devices`) - #[clap(short, long)] - device: Option, -} - -#[derive(clap::Subcommand)] -enum ApkSubCmd { - /// Analyze the current package and report errors, but don't build object files nor an apk - #[clap(visible_alias = "c")] - Check { - #[clap(flatten)] - args: Args, - }, - /// Compile the current package and create an apk - #[clap(visible_alias = "b")] - Build { - #[clap(flatten)] - args: Args, - }, - /// Invoke `cargo` under the detected NDK environment - #[clap(name = "--")] - Ndk { - /// `cargo` subcommand to run - cargo_cmd: String, - - // This struct will be filled up later by arguments that are intermixed - // with unknown args and ended up in `cargo_args` below. - #[clap(flatten)] - args: Args, - - /// Arguments passed to cargo. Some arguments will be used to configure - /// the environment similar to other `cargo apk` commands - #[clap(trailing_var_arg = true, allow_hyphen_values = true)] - cargo_args: Vec, - }, - /// Run a binary or example apk of the local package - #[clap(visible_alias = "r")] - Run { - #[clap(flatten)] - args: Args, - /// Do not print or follow `logcat` after running the app - #[clap(short, long)] - no_logcat: bool, - }, - /// Start a gdb session attached to an adb device with symbols loaded - Gdb { - #[clap(flatten)] - args: Args, - }, - /// Print the version of cargo-apk - Version, -} - -fn split_apk_and_cargo_args(mut args: Args, input: Vec) -> (Args, Vec) { - // Clap doesn't support parsing unknown args properly: - // https://github.com/clap-rs/clap/issues/1404 - // https://github.com/clap-rs/clap/issues/4498 - // Introspect the `Args` struct and extract every known arg, and whether it takes a value. Use - // this information to separate out known args from unknown args, and re-parse all the known - // args into an existing `args: Args` struct instance. - - let known_args_taking_value = Args::command() - .get_arguments() - .flat_map(|arg| { - assert!(!arg.is_positional()); - arg.get_short_and_visible_aliases() - .iter() - .flat_map(|shorts| shorts.iter().map(|short| format!("-{}", short))) - .chain( - arg.get_long_and_visible_aliases() - .iter() - .flat_map(|longs| longs.iter().map(|short| format!("--{}", short))), - ) - .map(|arg_str| (arg_str, arg.get_action().takes_values())) - // Collect to prevent lifetime issues on temporaries created above - .collect::>() - }) - .collect::>(); - - #[derive(Debug, Default)] - struct SplitArgs { - apk_args: Vec, - cargo_args: Vec, - next_takes_value: bool, - } - - let split_args = input - .into_iter() - .fold(SplitArgs::default(), |mut split_args, elem| { - let known_arg = known_args_taking_value.get(&elem); - if known_arg.is_some() || split_args.next_takes_value { - // Recognized arg or value for previously recognized arg - split_args.apk_args.push(elem) - } else { - split_args.cargo_args.push(elem) - } - - split_args.next_takes_value = known_arg.copied().unwrap_or(false); - split_args - }); - - let m = Args::command() - .no_binary_name(true) - .get_matches_from(&split_args.apk_args); - args.update_from_arg_matches(&m).unwrap(); - (args, split_args.cargo_args) -} - -fn main() -> anyhow::Result<()> { - env_logger::init(); - let Cmd { - apk: ApkCmd::Apk { cmd }, - } = Cmd::parse(); - match cmd { - ApkSubCmd::Check { args } => { - let cmd = Subcommand::new(args.subcommand_args)?; - let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; - builder.check()?; - } - ApkSubCmd::Build { args } => { - let cmd = Subcommand::new(args.subcommand_args)?; - let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; - for artifact in cmd.artifacts() { - builder.build(artifact)?; - } - } - ApkSubCmd::Ndk { - cargo_cmd, - args, - cargo_args, - } => { - let (args, cargo_args) = split_apk_and_cargo_args(args, cargo_args); - - let cmd = Subcommand::new(args.subcommand_args)?; - let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; - builder.default(&cargo_cmd, &cargo_args)?; - } - ApkSubCmd::Run { args, no_logcat } => { - let cmd = Subcommand::new(args.subcommand_args)?; - let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; - anyhow::ensure!(cmd.artifacts().len() == 1, Error::invalid_args()); - builder.run(&cmd.artifacts()[0], no_logcat)?; - } - ApkSubCmd::Gdb { args } => { - let cmd = Subcommand::new(args.subcommand_args)?; - let builder = ApkBuilder::from_subcommand(&cmd, args.device)?; - anyhow::ensure!(cmd.artifacts().len() == 1, Error::invalid_args()); - builder.gdb(&cmd.artifacts()[0])?; - } - ApkSubCmd::Version => { - println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); - } - } - Ok(()) -} - -#[test] -fn test_split_apk_and_cargo_args() { - // Set up a default because cargo-subcommand doesn't derive/implement Default - let args_default = Args::parse_from(std::iter::empty::<&str>()); - - assert_eq!( - split_apk_and_cargo_args(args_default.clone(), vec!["--quiet".to_string()]), - ( - Args { - subcommand_args: cargo_subcommand::Args { - quiet: true, - ..args_default.subcommand_args.clone() - }, - ..args_default.clone() - }, - vec![] - ) - ); - - assert_eq!( - split_apk_and_cargo_args( - args_default.clone(), - vec!["unrecognized".to_string(), "--quiet".to_string()] - ), - ( - Args { - subcommand_args: cargo_subcommand::Args { - quiet: true, - ..args_default.subcommand_args.clone() - }, - ..args_default.clone() - }, - vec!["unrecognized".to_string()] - ) - ); - - assert_eq!( - split_apk_and_cargo_args( - args_default.clone(), - vec!["--unrecognized".to_string(), "--quiet".to_string()] - ), - ( - Args { - subcommand_args: cargo_subcommand::Args { - quiet: true, - ..args_default.subcommand_args.clone() - }, - ..args_default.clone() - }, - vec!["--unrecognized".to_string()] - ) - ); - - assert_eq!( - split_apk_and_cargo_args( - args_default.clone(), - vec!["-p".to_string(), "foo".to_string()] - ), - ( - Args { - subcommand_args: cargo_subcommand::Args { - package: vec!["foo".to_string()], - ..args_default.subcommand_args.clone() - }, - ..args_default.clone() - }, - vec![] - ) - ); - - assert_eq!( - split_apk_and_cargo_args( - args_default.clone(), - vec![ - "-p".to_string(), - "foo".to_string(), - "--unrecognized".to_string(), - "--quiet".to_string() - ] - ), - ( - Args { - subcommand_args: cargo_subcommand::Args { - quiet: true, - package: vec!["foo".to_string()], - ..args_default.subcommand_args.clone() - }, - ..args_default.clone() - }, - vec!["--unrecognized".to_string()] - ) - ); - - assert_eq!( - split_apk_and_cargo_args( - args_default.clone(), - vec![ - "--no-deps".to_string(), - "-p".to_string(), - "foo".to_string(), - "--unrecognized".to_string(), - "--quiet".to_string() - ] - ), - ( - Args { - subcommand_args: cargo_subcommand::Args { - quiet: true, - package: vec!["foo".to_string()], - ..args_default.subcommand_args.clone() - }, - ..args_default.clone() - }, - vec!["--no-deps".to_string(), "--unrecognized".to_string()] - ) - ); - - assert_eq!( - split_apk_and_cargo_args( - args_default.clone(), - vec![ - "--no-deps".to_string(), - "--device".to_string(), - "adb:test".to_string(), - "--unrecognized".to_string(), - "--quiet".to_string() - ] - ), - ( - Args { - subcommand_args: cargo_subcommand::Args { - quiet: true, - ..args_default.subcommand_args - }, - device: Some("adb:test".to_string()), - }, - vec!["--no-deps".to_string(), "--unrecognized".to_string()] - ) - ); -} diff --git a/cargo-apk/src/manifest.rs b/cargo-apk/src/manifest.rs deleted file mode 100644 index de4460a5..00000000 --- a/cargo-apk/src/manifest.rs +++ /dev/null @@ -1,120 +0,0 @@ -use crate::error::Error; -use ndk_build::apk::StripConfig; -use ndk_build::manifest::AndroidManifest; -use ndk_build::target::Target; -use serde::Deserialize; -use std::{ - collections::HashMap, - path::{Path, PathBuf}, -}; - -#[derive(Debug, Clone, Deserialize)] -#[serde(untagged)] -pub enum Inheritable { - Value(T), - Inherited { workspace: bool }, -} - -pub(crate) struct Manifest { - pub(crate) version: Inheritable, - pub(crate) apk_name: Option, - pub(crate) android_manifest: AndroidManifest, - pub(crate) build_targets: Vec, - pub(crate) assets: Option, - pub(crate) resources: Option, - pub(crate) runtime_libs: Option, - /// Maps profiles to keystores - pub(crate) signing: HashMap, - pub(crate) reverse_port_forward: HashMap, - pub(crate) strip: StripConfig, -} - -impl Manifest { - pub(crate) fn parse_from_toml(path: &Path) -> Result { - let toml = Root::parse_from_toml(path)?; - // Unlikely to fail as cargo-subcommand should give us a `Cargo.toml` containing - // a `[package]` table (with a matching `name` when requested by the user) - let package = toml - .package - .unwrap_or_else(|| panic!("Manifest `{:?}` must contain a `[package]`", path)); - let metadata = package - .metadata - .unwrap_or_default() - .android - .unwrap_or_default(); - Ok(Self { - version: package.version, - apk_name: metadata.apk_name, - android_manifest: metadata.android_manifest, - build_targets: metadata.build_targets, - assets: metadata.assets, - resources: metadata.resources, - runtime_libs: metadata.runtime_libs, - signing: metadata.signing, - reverse_port_forward: metadata.reverse_port_forward, - strip: metadata.strip, - }) - } -} - -#[derive(Debug, Clone, Deserialize)] -pub(crate) struct Root { - pub(crate) package: Option, - pub(crate) workspace: Option, -} - -impl Root { - pub(crate) fn parse_from_toml(path: &Path) -> Result { - let contents = std::fs::read_to_string(path)?; - toml::from_str(&contents).map_err(|e| e.into()) - } -} - -#[derive(Debug, Clone, Deserialize)] -pub(crate) struct Package { - pub(crate) version: Inheritable, - pub(crate) metadata: Option, -} - -#[derive(Clone, Debug, Deserialize)] -pub(crate) struct Workspace { - pub(crate) package: Option, -} - -/// Almost the same as [`Package`], except that this must provide -/// root values instead of possibly inheritable values -#[derive(Clone, Debug, Deserialize)] -pub(crate) struct WorkspacePackage { - pub(crate) version: Option, -} - -#[derive(Clone, Debug, Default, Deserialize)] -pub(crate) struct PackageMetadata { - android: Option, -} - -#[derive(Clone, Debug, Default, Deserialize)] -struct AndroidMetadata { - apk_name: Option, - #[serde(flatten)] - android_manifest: AndroidManifest, - #[serde(default)] - build_targets: Vec, - assets: Option, - resources: Option, - runtime_libs: Option, - /// Maps profiles to keystores - #[serde(default)] - signing: HashMap, - /// Set up reverse port forwarding before launching the application - #[serde(default)] - reverse_port_forward: HashMap, - #[serde(default)] - strip: StripConfig, -} - -#[derive(Clone, Debug, Default, Deserialize)] -pub(crate) struct Signing { - pub(crate) path: PathBuf, - pub(crate) keystore_password: String, -} diff --git a/ndk-build/CHANGELOG.md b/ndk-build/CHANGELOG.md deleted file mode 100644 index 17986c5f..00000000 --- a/ndk-build/CHANGELOG.md +++ /dev/null @@ -1,97 +0,0 @@ -# Unreleased - -# 0.9.0 (2022-11-23) - -- Add `ndk::DEFAULT_DEV_KEYSTORE_PASSWORD` and make `apk::ApkConfig::apk` public. ([#358](https://github.com/rust-windowing/android-ndk-rs/pull/358)) -- `RUSTFLAGS` is now considered if `CARGO_ENCODED_RUSTFLAGS` is not present allowing `cargo apk build` to not break users' builds if they depend on `RUSTFLAGS` being set prior to the build, - as `CARGO_ENCODED_RUSTFLAGS` set by `ndk-build` before invoking `cargo` will take precedence over [all other sources of build flags](https://doc.rust-lang.org/cargo/reference/config.html#buildrustflags). ([#357](https://github.com/rust-windowing/android-ndk-rs/pull/357)) -- Add `ApkConfig::strip`, allowing a user to specify how they want debug symbols treated after cargo has finished building, but before the shared object is copied into the APK. ([#356](https://github.com/rust-windowing/android-ndk-rs/pull/356)) - -(0.8.1, released on 2022-10-14, was yanked due to violating semver.) - -- **Breaking:** Provide `reverse_port_forwarding()` to set up `adb reverse` ([#348](https://github.com/rust-windowing/android-ndk-rs/pull/348)) - -# 0.8.0 (2022-09-12) - -- **Breaking:** Postpone APK library packaging until before zip alignment, to deduplicate possibly overlapping entries. ([#333](https://github.com/rust-windowing/android-ndk-rs/pull/333)) -- Add `adb` device serial parameter to `detect_abi()` and `Apk::{install,start}()`. ([#329](https://github.com/rust-windowing/android-ndk-rs/pull/329)) -- Fix missing `.exe` extension for `adb` on Windows inside `detect_abi()`. ([#339](https://github.com/rust-windowing/android-ndk-rs/pull/339)) -- `start()` now returns the PID of the started app process (useful for passing to `adb logcat --pid`). ([#331](https://github.com/rust-windowing/android-ndk-rs/pull/331)) -- Inherit `ndk_gdb()` function from `cargo-apk` with the appropriate script extension across platforms. ([#330](https://github.com/rust-windowing/android-ndk-rs/pull/330), [#258](https://github.com/rust-windowing/android-ndk-rs/pull/258)) -- Provide `adb` path to `ndk-gdb`, allowing it to run without `adb` in `PATH`. ([#343](https://github.com/rust-windowing/android-ndk-rs/pull/343)) -- Remove quotes from `Android.mk` to fix `ndk-gdb` on Windows. ([#344](https://github.com/rust-windowing/android-ndk-rs/pull/344)) -- Launch Android activity through `ndk-gdb` to block app start until the debugger is attached. ([#345](https://github.com/rust-windowing/android-ndk-rs/pull/345)) -- Consider `ANDROID_SDK_ROOT` as deprecated instead of `ANDROID_HOME`. ([#346](https://github.com/rust-windowing/android-ndk-rs/pull/346)) -- **Breaking:** Rename `fn android_dir()` to `fn android_user_home()` and seed with `ANDROID_SDK_HOME` or `ANDROID_USER_HOME`. ([#347](https://github.com/rust-windowing/android-ndk-rs/pull/347)) - -# 0.7.0 (2022-07-05) - -- Fix NDK r23 `-lgcc` workaround for target directories containing spaces. ([#298](https://github.com/rust-windowing/android-ndk-rs/pull/298)) -- Invoke `clang` directly instead of through the NDK's wrapper scripts. ([#306](https://github.com/rust-windowing/android-ndk-rs/pull/306)) -- **Breaking:** Rename `Activity::intent_filters` back to `Activity::intent_filter`. ([#305](https://github.com/rust-windowing/android-ndk-rs/pull/305)) - -# 0.6.0 (2022-06-11) - -- **Breaking:** Provide NDK r23 `-lgcc` workaround in `cargo_ndk()` function, now requiring `target_dir` as argument. ([#286](https://github.com/rust-windowing/android-ndk-rs/pull/286)) -- **Breaking:** Add `disable_aapt_compression` field to `ApkConfig` to disable `aapt` compression. ([#283](https://github.com/rust-windowing/android-ndk-rs/pull/283)) - -# 0.5.0 (2022-05-07) - -- **Breaking:** Default `target_sdk_version` to `30` or lower (instead of the highest supported SDK version by the detected NDK toolchain) - for more consistent interaction with Android backwards compatibility handling and its increasingly strict usage rules: - -- **Breaking:** Remove default insertion of `MAIN` intent filter through a custom serialization function, this is better filled in by - the default setup in `cargo-apk`. ([#241](https://github.com/rust-windowing/android-ndk-rs/pull/241)) -- Add `android:exported` attribute to the manifest's `Activity` element. ([#242](https://github.com/rust-windowing/android-ndk-rs/pull/242)) -- Add `android:sharedUserId` attribute to the manifest's top-level `manifest` element. ([#252](https://github.com/rust-windowing/android-ndk-rs/pull/252)) -- Add `queries` element to the manifest's top-level `manifest` element. ([#259](https://github.com/rust-windowing/android-ndk-rs/pull/259)) - -# 0.4.3 (2021-11-22) - -- Provide NDK `build_tag` version from `source.properties` in the NDK root. - -# 0.4.2 (2021-08-06) - -- Pass UNIX path separators to `aapt` on non-UNIX systems, ensuring the resulting separator is compatible with the target device instead of the host platform. - -# 0.4.1 (2021-08-02) - -- Only the highest platform supported by the NDK is now selected as default platform. - -# 0.4.0 (2021-07-06) - -- Added `add_runtime_libs` function for including extra dynamic libraries in the APK. - -# 0.3.0 (2021-05-10) - -- New `ApkConfig` field `apk_name` is now used for APK file naming, instead of the application label. -- Renamed `cargo_apk` utility to `cargo_ndk`. - -# 0.2.0 (2021-04-20) - -- **Breaking:** refactored `Manifest` into a proper (de)serialization struct. `Manifest` now closely matches [an android manifest file](https://developer.android.com/guide/topics/manifest/manifest-element). -- **Breaking:** removed `Config` in favor of using the new `Manifest` struct directly. Instead of using `Config::from_config` to create a `Manifest`, now you instantiate `Manifest` directly using, almost all, the same values. - -# 0.1.4 (2020-11-25) - -- On Windows, fixed UNC path handling for resource folder. - -# 0.1.3 (2020-11-21) - -- `android:launchMode` is configurable. - -# 0.1.2 (2020-09-15) - -- `android:label` is configurable. -- Library search paths are much more intelligent. -- `android:screenOrientation` is configurable. - -# 0.1.1 (2020-07-15) - -- Added support for custom intent filters. -- On Windows, fixed UNC path handling. -- Fixed toolchain path handling when the NDK installation has no host arch suffix on its prebuilt LLVM directories. - -# 0.1.0 (2020-04-22) - -- Initial release! 🎉 diff --git a/ndk-build/Cargo.toml b/ndk-build/Cargo.toml deleted file mode 100644 index 586d8b37..00000000 --- a/ndk-build/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "ndk-build" -version = "0.9.0" -authors = ["The Rust Windowing contributors"] -edition = "2018" -description = "Utilities for building Android binaries" -license = "MIT OR Apache-2.0" -keywords = ["android", "ndk", "apk"] -documentation = "https://docs.rs/ndk-build" -homepage = "https://github.com/rust-windowing/android-ndk-rs" -repository = "https://github.com/rust-windowing/android-ndk-rs" -rust-version = "1.60" - -[dependencies] -dirs = "4" -dunce = "1" -quick-xml = { version = "0.26", features = ["serialize"] } -serde = { version = "1", features = ["derive"] } -thiserror = "1" -which = "4" diff --git a/ndk-build/src/apk.rs b/ndk-build/src/apk.rs deleted file mode 100644 index 0057661c..00000000 --- a/ndk-build/src/apk.rs +++ /dev/null @@ -1,328 +0,0 @@ -use crate::error::NdkError; -use crate::manifest::AndroidManifest; -use crate::ndk::{Key, Ndk}; -use crate::target::Target; -use std::collections::HashMap; -use std::collections::HashSet; -use std::ffi::OsStr; -use std::fs; -use std::path::{Path, PathBuf}; -use std::process::Command; - -/// The options for how to treat debug symbols that are present in any `.so` -/// files that are added to the APK. -/// -/// Using [`strip`](https://doc.rust-lang.org/cargo/reference/profiles.html#strip) -/// or [`split-debuginfo`](https://doc.rust-lang.org/cargo/reference/profiles.html#split-debuginfo) -/// in your cargo manifest(s) may cause debug symbols to not be present in a -/// `.so`, which would cause these options to do nothing. -#[derive(Debug, Copy, Clone, PartialEq, Eq, serde::Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum StripConfig { - /// Does not treat debug symbols specially - Default, - /// Removes debug symbols from the library before copying it into the APK - Strip, - /// Splits the library into into an ELF (`.so`) and DWARF (`.dwarf`). Only the - /// `.so` is copied into the APK - Split, -} - -impl Default for StripConfig { - fn default() -> Self { - Self::Default - } -} - -pub struct ApkConfig { - pub ndk: Ndk, - pub build_dir: PathBuf, - pub apk_name: String, - pub assets: Option, - pub resources: Option, - pub manifest: AndroidManifest, - pub disable_aapt_compression: bool, - pub strip: StripConfig, - pub reverse_port_forward: HashMap, -} - -impl ApkConfig { - fn build_tool(&self, tool: &'static str) -> Result { - let mut cmd = self.ndk.build_tool(tool)?; - cmd.current_dir(&self.build_dir); - Ok(cmd) - } - - fn unaligned_apk(&self) -> PathBuf { - self.build_dir - .join(format!("{}-unaligned.apk", self.apk_name)) - } - - /// Retrieves the path of the APK that will be written when [`UnsignedApk::sign`] - /// is invoked - #[inline] - pub fn apk(&self) -> PathBuf { - self.build_dir.join(format!("{}.apk", self.apk_name)) - } - - pub fn create_apk(&self) -> Result { - std::fs::create_dir_all(&self.build_dir)?; - self.manifest.write_to(&self.build_dir)?; - - let target_sdk_version = self - .manifest - .sdk - .target_sdk_version - .unwrap_or_else(|| self.ndk.default_target_platform()); - let mut aapt = self.build_tool(bin!("aapt"))?; - aapt.arg("package") - .arg("-f") - .arg("-F") - .arg(self.unaligned_apk()) - .arg("-M") - .arg("AndroidManifest.xml") - .arg("-I") - .arg(self.ndk.android_jar(target_sdk_version)?); - - if self.disable_aapt_compression { - aapt.arg("-0").arg(""); - } - - if let Some(res) = &self.resources { - aapt.arg("-S").arg(res); - } - - if let Some(assets) = &self.assets { - aapt.arg("-A").arg(assets); - } - - if !aapt.status()?.success() { - return Err(NdkError::CmdFailed(aapt)); - } - - Ok(UnalignedApk { - config: self, - pending_libs: HashSet::default(), - }) - } -} - -pub struct UnalignedApk<'a> { - config: &'a ApkConfig, - pending_libs: HashSet, -} - -impl<'a> UnalignedApk<'a> { - pub fn config(&self) -> &ApkConfig { - self.config - } - - pub fn add_lib(&mut self, path: &Path, target: Target) -> Result<(), NdkError> { - if !path.exists() { - return Err(NdkError::PathNotFound(path.into())); - } - let abi = target.android_abi(); - let lib_path = Path::new("lib").join(abi).join(path.file_name().unwrap()); - let out = self.config.build_dir.join(&lib_path); - std::fs::create_dir_all(out.parent().unwrap())?; - - match self.config.strip { - StripConfig::Default => { - std::fs::copy(path, out)?; - } - StripConfig::Strip | StripConfig::Split => { - let obj_copy = self.config.ndk.toolchain_bin("objcopy", target)?; - - { - let mut cmd = Command::new(&obj_copy); - cmd.arg("--strip-debug"); - cmd.arg(path); - cmd.arg(&out); - - if !cmd.status()?.success() { - return Err(NdkError::CmdFailed(cmd)); - } - } - - if self.config.strip == StripConfig::Split { - let dwarf_path = out.with_extension("dwarf"); - - { - let mut cmd = Command::new(&obj_copy); - cmd.arg("--only-keep-debug"); - cmd.arg(path); - cmd.arg(&dwarf_path); - - if !cmd.status()?.success() { - return Err(NdkError::CmdFailed(cmd)); - } - } - - let mut cmd = Command::new(obj_copy); - cmd.arg(format!("--add-gnu-debuglink={}", dwarf_path.display())); - cmd.arg(out); - - if !cmd.status()?.success() { - return Err(NdkError::CmdFailed(cmd)); - } - } - } - } - - // Pass UNIX path separators to `aapt` on non-UNIX systems, ensuring the resulting separator - // is compatible with the target device instead of the host platform. - // Otherwise, it results in a runtime error when loading the NativeActivity `.so` library. - let lib_path_unix = lib_path.to_str().unwrap().replace('\\', "/"); - - self.pending_libs.insert(lib_path_unix); - - Ok(()) - } - - pub fn add_runtime_libs( - &mut self, - path: &Path, - target: Target, - search_paths: &[&Path], - ) -> Result<(), NdkError> { - let abi_dir = path.join(target.android_abi()); - for entry in fs::read_dir(&abi_dir).map_err(|e| NdkError::IoPathError(abi_dir, e))? { - let entry = entry?; - let path = entry.path(); - if path.extension() == Some(OsStr::new("so")) { - self.add_lib_recursively(&path, target, search_paths)?; - } - } - Ok(()) - } - - pub fn add_pending_libs_and_align(self) -> Result, NdkError> { - let mut aapt = self.config.build_tool(bin!("aapt"))?; - aapt.arg("add"); - - if self.config.disable_aapt_compression { - aapt.arg("-0").arg(""); - } - - aapt.arg(self.config.unaligned_apk()); - - for lib_path_unix in self.pending_libs { - aapt.arg(lib_path_unix); - } - - if !aapt.status()?.success() { - return Err(NdkError::CmdFailed(aapt)); - } - - let mut zipalign = self.config.build_tool(bin!("zipalign"))?; - zipalign - .arg("-f") - .arg("-v") - .arg("4") - .arg(self.config.unaligned_apk()) - .arg(self.config.apk()); - - if !zipalign.status()?.success() { - return Err(NdkError::CmdFailed(zipalign)); - } - - Ok(UnsignedApk(self.config)) - } -} - -pub struct UnsignedApk<'a>(&'a ApkConfig); - -impl<'a> UnsignedApk<'a> { - pub fn sign(self, key: Key) -> Result { - let mut apksigner = self.0.build_tool(bat!("apksigner"))?; - apksigner - .arg("sign") - .arg("--ks") - .arg(&key.path) - .arg("--ks-pass") - .arg(format!("pass:{}", &key.password)) - .arg(self.0.apk()); - if !apksigner.status()?.success() { - return Err(NdkError::CmdFailed(apksigner)); - } - Ok(Apk::from_config(self.0)) - } -} - -pub struct Apk { - path: PathBuf, - package_name: String, - ndk: Ndk, - reverse_port_forward: HashMap, -} - -impl Apk { - pub fn from_config(config: &ApkConfig) -> Self { - let ndk = config.ndk.clone(); - Self { - path: config.apk(), - package_name: config.manifest.package.clone(), - ndk, - reverse_port_forward: config.reverse_port_forward.clone(), - } - } - - pub fn reverse_port_forwarding(&self, device_serial: Option<&str>) -> Result<(), NdkError> { - for (from, to) in &self.reverse_port_forward { - println!("Reverse port forwarding from {} to {}", from, to); - let mut adb = self.ndk.adb(device_serial)?; - - adb.arg("reverse").arg(from).arg(to); - - if !adb.status()?.success() { - return Err(NdkError::CmdFailed(adb)); - } - } - - Ok(()) - } - - pub fn install(&self, device_serial: Option<&str>) -> Result<(), NdkError> { - let mut adb = self.ndk.adb(device_serial)?; - - adb.arg("install").arg("-r").arg(&self.path); - if !adb.status()?.success() { - return Err(NdkError::CmdFailed(adb)); - } - Ok(()) - } - - pub fn start(&self, device_serial: Option<&str>) -> Result { - let mut am_start = self.ndk.adb(device_serial)?; - am_start - .arg("shell") - .arg("am") - .arg("start") - .arg("-W") - .arg("-a") - .arg("android.intent.action.MAIN") - .arg("-n") - .arg(format!("{}/android.app.NativeActivity", &self.package_name)); - if !am_start.status()?.success() { - return Err(NdkError::CmdFailed(am_start)); - } - - let pid_vec = self - .ndk - .adb(device_serial)? - .arg("shell") - .arg("pidof") - .arg(&self.package_name) - .output()? - .stdout; - - let pid = std::str::from_utf8(&pid_vec).unwrap().trim(); - let pid: u32 = pid - .parse() - .map_err(|e| NdkError::NotAPid(e, pid.to_owned()))?; - - println!("Launched with PID {}", pid); - - Ok(pid) - } -} diff --git a/ndk-build/src/cargo.rs b/ndk-build/src/cargo.rs deleted file mode 100644 index d3abf348..00000000 --- a/ndk-build/src/cargo.rs +++ /dev/null @@ -1,165 +0,0 @@ -use crate::error::NdkError; -use crate::ndk::Ndk; -use crate::target::Target; -use std::path::Path; -use std::process::Command; - -pub fn cargo_ndk( - ndk: &Ndk, - target: Target, - sdk_version: u32, - target_dir: impl AsRef, -) -> Result { - let triple = target.rust_triple(); - let clang_target = format!("--target={}{}", target.ndk_llvm_triple(), sdk_version); - let mut cargo = Command::new("cargo"); - - const SEP: &str = "\x1f"; - - // Read initial CARGO_ENCODED_/RUSTFLAGS - let mut rustflags = match std::env::var("CARGO_ENCODED_RUSTFLAGS") { - Ok(val) => { - if std::env::var_os("RUSTFLAGS").is_some() { - panic!( - "Both `CARGO_ENCODED_RUSTFLAGS` and `RUSTFLAGS` were found in the environment, please clear one or the other before invoking this script" - ); - } - - val - } - Err(std::env::VarError::NotPresent) => { - match std::env::var("RUSTFLAGS") { - Ok(val) => { - cargo.env_remove("RUSTFLAGS"); - - // Same as cargo - // https://github.com/rust-lang/cargo/blob/f6de921a5d807746e972d9d10a4d8e1ca21e1b1f/src/cargo/core/compiler/build_context/target_info.rs#L682-L690 - val.split(' ') - .map(str::trim) - .filter(|s| !s.is_empty()) - .collect::>() - .join(SEP) - } - Err(std::env::VarError::NotPresent) => String::new(), - Err(std::env::VarError::NotUnicode(_)) => { - panic!("RUSTFLAGS environment variable contains non-unicode characters") - } - } - } - Err(std::env::VarError::NotUnicode(_)) => { - panic!("CARGO_ENCODED_RUSTFLAGS environment variable contains non-unicode characters") - } - }; - - let (clang, clang_pp) = ndk.clang()?; - - // Configure cross-compiler for `cc` crate - // https://github.com/rust-lang/cc-rs#external-configuration-via-environment-variables - cargo.env(format!("CC_{}", triple), &clang); - cargo.env(format!("CFLAGS_{}", triple), &clang_target); - cargo.env(format!("CXX_{}", triple), &clang_pp); - cargo.env(format!("CXXFLAGS_{}", triple), &clang_target); - - // Configure LINKER for `rustc` - // https://doc.rust-lang.org/beta/cargo/reference/environment-variables.html#configuration-environment-variables - cargo.env(cargo_env_target_cfg("LINKER", triple), &clang); - if !rustflags.is_empty() { - rustflags.push_str(SEP); - } - rustflags.push_str("-Clink-arg="); - rustflags.push_str(&clang_target); - - let ar = ndk.toolchain_bin("ar", target)?; - cargo.env(format!("AR_{}", triple), &ar); - cargo.env(cargo_env_target_cfg("AR", triple), &ar); - - // Workaround for https://github.com/rust-windowing/android-ndk-rs/issues/149: - // Rust (1.56 as of writing) still requires libgcc during linking, but this does - // not ship with the NDK anymore since NDK r23 beta 3. - // See https://github.com/rust-lang/rust/pull/85806 for a discussion on why libgcc - // is still required even after replacing it with libunwind in the source. - // XXX: Add an upper-bound on the Rust version whenever this is not necessary anymore. - if ndk.build_tag() > 7272597 { - let cargo_apk_link_dir = target_dir - .as_ref() - .join("cargo-apk-temp-extra-link-libraries"); - std::fs::create_dir_all(&cargo_apk_link_dir) - .map_err(|e| NdkError::IoPathError(cargo_apk_link_dir.clone(), e))?; - let libgcc = cargo_apk_link_dir.join("libgcc.a"); - std::fs::write(&libgcc, "INPUT(-lunwind)").map_err(|e| NdkError::IoPathError(libgcc, e))?; - - // cdylibs in transitive dependencies still get built and also need this - // workaround linker flag, yet arguments passed to `cargo rustc` are only - // forwarded to the final compiler invocation rendering our workaround ineffective. - // The cargo page documenting this discrepancy (https://doc.rust-lang.org/cargo/commands/cargo-rustc.html) - // suggests to resort to RUSTFLAGS. - // Note that `rustflags` will never be empty because of an unconditional `.push_str` above, - // so we can safely start with appending \x1f here. - rustflags.push_str(SEP); - rustflags.push_str("-L"); - rustflags.push_str(SEP); - rustflags.push_str( - cargo_apk_link_dir - .to_str() - .expect("Target dir must be valid UTF-8"), - ); - } - - cargo.env("CARGO_ENCODED_RUSTFLAGS", rustflags); - - Ok(cargo) -} - -fn cargo_env_target_cfg(tool: &str, target: &str) -> String { - let utarget = target.replace('-', "_"); - let env = format!("CARGO_TARGET_{}_{}", &utarget, tool); - env.to_uppercase() -} - -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -pub struct VersionCode { - major: u8, - minor: u8, - patch: u8, -} - -impl VersionCode { - pub fn new(major: u8, minor: u8, patch: u8) -> Self { - Self { - major, - minor, - patch, - } - } - - pub fn from_semver(version: &str) -> Result { - let mut iter = version.split(|c1| ['.', '-', '+'].iter().any(|c2| c1 == *c2)); - let mut p = || { - iter.next() - .ok_or(NdkError::InvalidSemver)? - .parse() - .map_err(|_| NdkError::InvalidSemver) - }; - Ok(Self::new(p()?, p()?, p()?)) - } - - pub fn to_code(&self, apk_id: u8) -> u32 { - (apk_id as u32) << 24 - | (self.major as u32) << 16 - | (self.minor as u32) << 8 - | self.patch as u32 - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn from_semver() { - let v = VersionCode::from_semver("0.0.0").unwrap(); - assert_eq!(v, VersionCode::new(0, 0, 0)); - let v = VersionCode::from_semver("254.254.254-alpha.fix+2").unwrap(); - assert_eq!(v, VersionCode::new(254, 254, 254)); - } -} diff --git a/ndk-build/src/dylibs.rs b/ndk-build/src/dylibs.rs deleted file mode 100644 index 14347605..00000000 --- a/ndk-build/src/dylibs.rs +++ /dev/null @@ -1,43 +0,0 @@ -use std::io::Result; -use std::path::{Path, PathBuf}; - -pub fn get_libs_search_paths( - target_dir: &Path, - target_triple: &str, - target_profile: &Path, -) -> Result> { - let mut paths = Vec::new(); - - let deps_dir = target_dir - .join(target_triple) - .join(target_profile) - .join("build"); - - for dep_dir in deps_dir.read_dir()? { - let output_file = dep_dir?.path().join("output"); - if output_file.is_file() { - use std::{ - fs::File, - io::{BufRead, BufReader}, - }; - for line in BufReader::new(File::open(output_file)?).lines() { - let line = line?; - if let Some(link_search) = line.strip_prefix("cargo:rustc-link-search=") { - let mut pie = link_search.split('='); - let (kind, path) = match (pie.next(), pie.next()) { - (Some(kind), Some(path)) => (kind, path), - (Some(path), None) => ("all", path), - _ => unreachable!(), - }; - match kind { - // FIXME: which kinds of search path we interested in - "dependency" | "native" | "all" => paths.push(path.into()), - _ => (), - }; - } - } - } - } - - Ok(paths) -} diff --git a/ndk-build/src/error.rs b/ndk-build/src/error.rs deleted file mode 100644 index 9dee0317..00000000 --- a/ndk-build/src/error.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::io::Error as IoError; -use std::num::ParseIntError; -use std::path::PathBuf; -use std::process::Command; -use thiserror::Error; - -#[derive(Debug, Error)] -pub enum NdkError { - #[error( - "Android SDK is not found. \ - Please set the path to the Android SDK with the $ANDROID_SDK_ROOT \ - environment variable." - )] - SdkNotFound, - #[error( - "Android NDK is not found. \ - Please set the path to the Android NDK with $ANDROID_NDK_ROOT \ - environment variable." - )] - NdkNotFound, - #[error("GNU toolchain binary `{gnu_bin}` nor LLVM toolchain binary `{llvm_bin}` found in `{toolchain_path:?}`.")] - ToolchainBinaryNotFound { - toolchain_path: PathBuf, - gnu_bin: String, - llvm_bin: String, - }, - #[error("Path `{0:?}` doesn't exist.")] - PathNotFound(PathBuf), - #[error("Command `{0}` not found.")] - CmdNotFound(String), - #[error("Android SDK has no build tools.")] - BuildToolsNotFound, - #[error("Android SDK has no platforms installed.")] - NoPlatformFound, - #[error("Platform `{0}` is not installed.")] - PlatformNotFound(u32), - #[error("Target is not supported.")] - UnsupportedTarget, - #[error("Host `{0}` is not supported.")] - UnsupportedHost(String), - #[error(transparent)] - Io(#[from] IoError), - #[error("IoError on `{0:?}`: {1}")] - IoPathError(PathBuf, #[source] IoError), - #[error("Invalid semver")] - InvalidSemver, - #[error("Command `{}` had a non-zero exit code.", format!("{:?}", .0).replace('"', ""))] - CmdFailed(Command), - #[error(transparent)] - Serialize(#[from] quick_xml::de::DeError), - #[error("String `{1}` is not a PID")] - NotAPid(#[source] ParseIntError, String), -} diff --git a/ndk-build/src/lib.rs b/ndk-build/src/lib.rs deleted file mode 100644 index efd6dc6f..00000000 --- a/ndk-build/src/lib.rs +++ /dev/null @@ -1,38 +0,0 @@ -macro_rules! bin { - ($bin:expr) => { - if cfg!(target_os = "windows") { - concat!($bin, ".exe") - } else { - $bin - } - }; -} - -macro_rules! bat { - ($bat:expr) => { - if cfg!(target_os = "windows") { - concat!($bat, ".bat") - } else { - $bat - } - }; -} - -macro_rules! cmd { - ($cmd:expr) => { - if cfg!(target_os = "windows") { - concat!($cmd, ".cmd") - } else { - $cmd - } - }; -} - -pub mod apk; -pub mod cargo; -pub mod dylibs; -pub mod error; -pub mod manifest; -pub mod ndk; -pub mod readelf; -pub mod target; diff --git a/ndk-build/src/manifest.rs b/ndk-build/src/manifest.rs deleted file mode 100644 index 924fdbb6..00000000 --- a/ndk-build/src/manifest.rs +++ /dev/null @@ -1,329 +0,0 @@ -use crate::error::NdkError; -use serde::{Deserialize, Serialize, Serializer}; -use std::{fs::File, path::Path}; - -/// Android [manifest element](https://developer.android.com/guide/topics/manifest/manifest-element), containing an [`Application`] element. -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename = "manifest")] -pub struct AndroidManifest { - #[serde(rename(serialize = "xmlns:android"))] - #[serde(default = "default_namespace")] - ns_android: String, - #[serde(default)] - pub package: String, - #[serde(rename(serialize = "android:sharedUserId"))] - pub shared_user_id: Option, - #[serde(rename(serialize = "android:versionCode"))] - pub version_code: Option, - #[serde(rename(serialize = "android:versionName"))] - pub version_name: Option, - - #[serde(rename(serialize = "uses-sdk"))] - #[serde(default)] - pub sdk: Sdk, - - #[serde(rename(serialize = "uses-feature"))] - #[serde(default)] - pub uses_feature: Vec, - #[serde(rename(serialize = "uses-permission"))] - #[serde(default)] - pub uses_permission: Vec, - - #[serde(default)] - pub queries: Option, - - #[serde(default)] - pub application: Application, -} - -impl Default for AndroidManifest { - fn default() -> Self { - Self { - ns_android: default_namespace(), - package: Default::default(), - shared_user_id: Default::default(), - version_code: Default::default(), - version_name: Default::default(), - sdk: Default::default(), - uses_feature: Default::default(), - uses_permission: Default::default(), - queries: Default::default(), - application: Default::default(), - } - } -} - -impl AndroidManifest { - pub fn write_to(&self, dir: &Path) -> Result<(), NdkError> { - let file = File::create(dir.join("AndroidManifest.xml"))?; - let w = std::io::BufWriter::new(file); - quick_xml::se::to_writer(w, &self)?; - Ok(()) - } -} - -/// Android [application element](https://developer.android.com/guide/topics/manifest/application-element), containing an [`Activity`] element. -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct Application { - #[serde(rename(serialize = "android:debuggable"))] - pub debuggable: Option, - #[serde(rename(serialize = "android:theme"))] - pub theme: Option, - #[serde(rename(serialize = "android:hasCode"))] - #[serde(default)] - pub has_code: bool, - #[serde(rename(serialize = "android:icon"))] - pub icon: Option, - #[serde(rename(serialize = "android:label"))] - #[serde(default)] - pub label: String, - - #[serde(rename(serialize = "meta-data"))] - #[serde(default)] - pub meta_data: Vec, - #[serde(default)] - pub activity: Activity, -} - -/// Android [activity element](https://developer.android.com/guide/topics/manifest/activity-element). -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Activity { - #[serde(rename(serialize = "android:configChanges"))] - #[serde(default = "default_config_changes")] - pub config_changes: Option, - #[serde(rename(serialize = "android:label"))] - pub label: Option, - #[serde(rename(serialize = "android:launchMode"))] - pub launch_mode: Option, - #[serde(rename(serialize = "android:name"))] - #[serde(default = "default_activity_name")] - pub name: String, - #[serde(rename(serialize = "android:screenOrientation"))] - pub orientation: Option, - #[serde(rename(serialize = "android:exported"))] - pub exported: Option, - #[serde(rename(serialize = "android:resizeableActivity"))] - pub resizeable_activity: Option, - - #[serde(rename(serialize = "meta-data"))] - #[serde(default)] - pub meta_data: Vec, - /// If no `MAIN` action exists in any intent filter, a default `MAIN` filter is serialized by `cargo-apk`. - #[serde(rename(serialize = "intent-filter"))] - #[serde(default)] - pub intent_filter: Vec, -} - -impl Default for Activity { - fn default() -> Self { - Self { - config_changes: default_config_changes(), - label: None, - launch_mode: None, - name: default_activity_name(), - orientation: None, - exported: None, - resizeable_activity: None, - meta_data: Default::default(), - intent_filter: Default::default(), - } - } -} - -/// Android [intent filter element](https://developer.android.com/guide/topics/manifest/intent-filter-element). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct IntentFilter { - /// Serialize strings wrapped in `` - #[serde(serialize_with = "serialize_actions")] - #[serde(rename(serialize = "action"))] - #[serde(default)] - pub actions: Vec, - /// Serialize as vector of structs for proper xml formatting - #[serde(serialize_with = "serialize_catergories")] - #[serde(rename(serialize = "category"))] - #[serde(default)] - pub categories: Vec, - #[serde(default)] - pub data: Vec, -} - -fn serialize_actions(actions: &[String], serializer: S) -> Result -where - S: Serializer, -{ - use serde::ser::SerializeSeq; - - #[derive(Serialize)] - struct Action { - #[serde(rename = "android:name")] - name: String, - } - let mut seq = serializer.serialize_seq(Some(actions.len()))?; - for action in actions { - seq.serialize_element(&Action { - name: action.clone(), - })?; - } - seq.end() -} - -fn serialize_catergories(categories: &[String], serializer: S) -> Result -where - S: Serializer, -{ - use serde::ser::SerializeSeq; - - #[derive(Serialize)] - struct Category { - #[serde(rename = "android:name")] - pub name: String, - } - - let mut seq = serializer.serialize_seq(Some(categories.len()))?; - for category in categories { - seq.serialize_element(&Category { - name: category.clone(), - })?; - } - seq.end() -} - -/// Android [intent filter data element](https://developer.android.com/guide/topics/manifest/data-element). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct IntentFilterData { - #[serde(rename(serialize = "android:scheme"))] - pub scheme: Option, - #[serde(rename(serialize = "android:host"))] - pub host: Option, - #[serde(rename(serialize = "android:port"))] - pub port: Option, - #[serde(rename(serialize = "android:path"))] - pub path: Option, - #[serde(rename(serialize = "android:pathPattern"))] - pub path_pattern: Option, - #[serde(rename(serialize = "android:pathPrefix"))] - pub path_prefix: Option, - #[serde(rename(serialize = "android:mimeType"))] - pub mime_type: Option, -} - -/// Android [meta-data element](https://developer.android.com/guide/topics/manifest/meta-data-element). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct MetaData { - #[serde(rename(serialize = "android:name"))] - pub name: String, - #[serde(rename(serialize = "android:value"))] - pub value: String, -} - -/// Android [uses-feature element](https://developer.android.com/guide/topics/manifest/uses-feature-element). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct Feature { - #[serde(rename(serialize = "android:name"))] - pub name: Option, - #[serde(rename(serialize = "android:required"))] - pub required: Option, - /// The `version` field is currently used for the following features: - /// - /// - `name="android.hardware.vulkan.compute"`: The minimum level of compute features required. See the [Android documentation](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VULKAN_HARDWARE_COMPUTE) - /// for available levels and the respective Vulkan features required/provided. - /// - /// - `name="android.hardware.vulkan.level"`: The minimum Vulkan requirements. See the [Android documentation](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VULKAN_HARDWARE_LEVEL) - /// for available levels and the respective Vulkan features required/provided. - /// - /// - `name="android.hardware.vulkan.version"`: Represents the value of Vulkan's `VkPhysicalDeviceProperties::apiVersion`. See the [Android documentation](https://developer.android.com/reference/android/content/pm/PackageManager#FEATURE_VULKAN_HARDWARE_VERSION) - /// for available levels and the respective Vulkan features required/provided. - #[serde(rename(serialize = "android:version"))] - pub version: Option, - #[serde(rename(serialize = "android:glEsVersion"))] - #[serde(serialize_with = "serialize_opengles_version")] - pub opengles_version: Option<(u8, u8)>, -} - -fn serialize_opengles_version( - version: &Option<(u8, u8)>, - serializer: S, -) -> Result -where - S: Serializer, -{ - match version { - Some(version) => { - let opengles_version = format!("0x{:04}{:04}", version.0, version.1); - serializer.serialize_some(&opengles_version) - } - None => serializer.serialize_none(), - } -} - -/// Android [uses-permission element](https://developer.android.com/guide/topics/manifest/uses-permission-element). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct Permission { - #[serde(rename(serialize = "android:name"))] - pub name: String, - #[serde(rename(serialize = "android:maxSdkVersion"))] - pub max_sdk_version: Option, -} - -/// Android [package element](https://developer.android.com/guide/topics/manifest/queries-element#package). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct Package { - #[serde(rename(serialize = "android:name"))] - pub name: String, -} - -/// Android [provider element](https://developer.android.com/guide/topics/manifest/queries-element#provider). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct QueryProvider { - #[serde(rename(serialize = "android:authorities"))] - pub authorities: String, - - // The specs say only an `authorities` attribute is required for providers contained in a `queries` element - // however this is required for aapt support and should be made optional if/when cargo-apk migrates to aapt2 - #[serde(rename(serialize = "android:name"))] - pub name: String, -} - -/// Android [queries element](https://developer.android.com/guide/topics/manifest/queries-element). -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -pub struct Queries { - #[serde(default)] - pub package: Vec, - #[serde(default)] - pub intent: Vec, - #[serde(default)] - pub provider: Vec, -} - -/// Android [uses-sdk element](https://developer.android.com/guide/topics/manifest/uses-sdk-element). -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Sdk { - #[serde(rename(serialize = "android:minSdkVersion"))] - pub min_sdk_version: Option, - #[serde(rename(serialize = "android:targetSdkVersion"))] - pub target_sdk_version: Option, - #[serde(rename(serialize = "android:maxSdkVersion"))] - pub max_sdk_version: Option, -} - -impl Default for Sdk { - fn default() -> Self { - Self { - min_sdk_version: Some(23), - target_sdk_version: None, - max_sdk_version: None, - } - } -} - -fn default_namespace() -> String { - "http://schemas.android.com/apk/res/android".to_string() -} - -fn default_activity_name() -> String { - "android.app.NativeActivity".to_string() -} - -fn default_config_changes() -> Option { - Some("orientation|keyboardHidden|screenSize".to_string()) -} diff --git a/ndk-build/src/ndk.rs b/ndk-build/src/ndk.rs deleted file mode 100644 index 962ce936..00000000 --- a/ndk-build/src/ndk.rs +++ /dev/null @@ -1,504 +0,0 @@ -use crate::error::NdkError; -use crate::target::Target; -use std::collections::HashMap; -use std::path::{Path, PathBuf}; -use std::process::Command; - -/// The default password used when creating the default `debug.keystore` via -/// [`Ndk::debug_key`] -pub const DEFAULT_DEV_KEYSTORE_PASSWORD: &str = "android"; - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Ndk { - sdk_path: PathBuf, - user_home: PathBuf, - ndk_path: PathBuf, - build_tools_version: String, - build_tag: u32, - platforms: Vec, -} - -impl Ndk { - pub fn from_env() -> Result { - let sdk_path = { - let sdk_path = std::env::var("ANDROID_SDK_ROOT").ok(); - if sdk_path.is_some() { - eprintln!( - "Warning: Environment variable ANDROID_SDK_ROOT is deprecated \ - (https://developer.android.com/studio/command-line/variables#envar). \ - It will be used until it is unset and replaced by ANDROID_HOME." - ); - } - - PathBuf::from( - sdk_path - .or_else(|| std::env::var("ANDROID_HOME").ok()) - .ok_or(NdkError::SdkNotFound)?, - ) - }; - - let user_home = { - let user_home = std::env::var("ANDROID_SDK_HOME") - .map(PathBuf::from) - // Unlike ANDROID_USER_HOME, ANDROID_SDK_HOME points to the _parent_ directory of .android: - // https://developer.android.com/studio/command-line/variables#envar - .map(|home| home.join(".android")) - .ok(); - - if user_home.is_some() { - eprintln!( - "Warning: Environment variable ANDROID_SDK_HOME is deprecated \ - (https://developer.android.com/studio/command-line/variables#envar). \ - It will be used until it is unset and replaced by ANDROID_USER_HOME." - ); - } - - // Default to $HOME/.android - user_home - .or_else(|| std::env::var("ANDROID_USER_HOME").map(PathBuf::from).ok()) - .or_else(|| dirs::home_dir().map(|home| home.join(".android"))) - .ok_or_else(|| NdkError::PathNotFound(PathBuf::from("$HOME")))? - }; - - let ndk_path = { - let ndk_path = std::env::var("ANDROID_NDK_ROOT") - .ok() - .or_else(|| std::env::var("ANDROID_NDK_PATH").ok()) - .or_else(|| std::env::var("ANDROID_NDK_HOME").ok()) - .or_else(|| std::env::var("NDK_HOME").ok()); - - // default ndk installation path - if ndk_path.is_none() && sdk_path.join("ndk-bundle").exists() { - sdk_path.join("ndk-bundle") - } else { - PathBuf::from(ndk_path.ok_or(NdkError::NdkNotFound)?) - } - }; - - let build_tools_dir = sdk_path.join("build-tools"); - let build_tools_version = std::fs::read_dir(&build_tools_dir) - .or(Err(NdkError::PathNotFound(build_tools_dir)))? - .filter_map(|path| path.ok()) - .filter(|path| path.path().is_dir()) - .filter_map(|path| path.file_name().into_string().ok()) - .filter(|name| name.chars().next().unwrap().is_ascii_digit()) - .max() - .ok_or(NdkError::BuildToolsNotFound)?; - - let build_tag = std::fs::read_to_string(ndk_path.join("source.properties")) - .expect("Failed to read source.properties"); - - let build_tag = build_tag - .split('\n') - .find_map(|line| { - let (key, value) = line - .split_once('=') - .expect("Failed to parse `key = value` from source.properties"); - if key.trim() == "Pkg.Revision" { - // AOSP writes a constantly-incrementing build version to the patch field. - // This number is incrementing across NDK releases. - let mut parts = value.trim().split('.'); - let _major = parts.next().unwrap(); - let _minor = parts.next().unwrap(); - let patch = parts.next().unwrap(); - // Can have an optional `XXX-beta1` - let patch = patch.split_once('-').map_or(patch, |(patch, _beta)| patch); - Some(patch.parse().expect("Failed to parse patch field")) - } else { - None - } - }) - .expect("No `Pkg.Revision` in source.properties"); - - let ndk_platforms = std::fs::read_to_string(ndk_path.join("build/core/platforms.mk"))?; - let ndk_platforms = ndk_platforms - .split('\n') - .map(|s| s.split_once(" := ").unwrap()) - .collect::>(); - - let min_platform_level = ndk_platforms["NDK_MIN_PLATFORM_LEVEL"] - .parse::() - .unwrap(); - let max_platform_level = ndk_platforms["NDK_MAX_PLATFORM_LEVEL"] - .parse::() - .unwrap(); - - let platforms_dir = sdk_path.join("platforms"); - let platforms: Vec = std::fs::read_dir(&platforms_dir) - .or(Err(NdkError::PathNotFound(platforms_dir)))? - .filter_map(|path| path.ok()) - .filter(|path| path.path().is_dir()) - .filter_map(|path| path.file_name().into_string().ok()) - .filter_map(|name| { - name.strip_prefix("android-") - .and_then(|api| api.parse::().ok()) - }) - .filter(|level| (min_platform_level..=max_platform_level).contains(level)) - .collect(); - - if platforms.is_empty() { - return Err(NdkError::NoPlatformFound); - } - - Ok(Self { - sdk_path, - user_home, - ndk_path, - build_tools_version, - build_tag, - platforms, - }) - } - - pub fn sdk(&self) -> &Path { - &self.sdk_path - } - - pub fn ndk(&self) -> &Path { - &self.ndk_path - } - - pub fn build_tools_version(&self) -> &str { - &self.build_tools_version - } - - pub fn build_tag(&self) -> u32 { - self.build_tag - } - - pub fn platforms(&self) -> &[u32] { - &self.platforms - } - - pub fn build_tool(&self, tool: &str) -> Result { - let path = self - .sdk_path - .join("build-tools") - .join(&self.build_tools_version) - .join(tool); - if !path.exists() { - return Err(NdkError::CmdNotFound(tool.to_string())); - } - Ok(Command::new(dunce::canonicalize(path)?)) - } - - pub fn platform_tool_path(&self, tool: &str) -> Result { - let path = self.sdk_path.join("platform-tools").join(tool); - if !path.exists() { - return Err(NdkError::CmdNotFound(tool.to_string())); - } - Ok(dunce::canonicalize(path)?) - } - - pub fn adb_path(&self) -> Result { - self.platform_tool_path(bin!("adb")) - } - - pub fn platform_tool(&self, tool: &str) -> Result { - Ok(Command::new(self.platform_tool_path(tool)?)) - } - - pub fn highest_supported_platform(&self) -> u32 { - self.platforms().iter().max().cloned().unwrap() - } - - /// Returns platform `30` as currently [required by Google Play], or lower - /// when the detected SDK does not support it yet. - /// - /// [required by Google Play]: https://developer.android.com/distribute/best-practices/develop/target-sdk - pub fn default_target_platform(&self) -> u32 { - self.highest_supported_platform().min(30) - } - - pub fn platform_dir(&self, platform: u32) -> Result { - let dir = self - .sdk_path - .join("platforms") - .join(format!("android-{}", platform)); - if !dir.exists() { - return Err(NdkError::PlatformNotFound(platform)); - } - Ok(dir) - } - - pub fn android_jar(&self, platform: u32) -> Result { - let android_jar = self.platform_dir(platform)?.join("android.jar"); - if !android_jar.exists() { - return Err(NdkError::PathNotFound(android_jar)); - } - Ok(android_jar) - } - - fn host_arch() -> Result<&'static str, NdkError> { - let host_os = std::env::var("HOST").ok(); - let host_contains = |s| host_os.as_ref().map(|h| h.contains(s)).unwrap_or(false); - - Ok(if host_contains("linux") { - "linux" - } else if host_contains("macos") { - "darwin" - } else if host_contains("windows") { - "windows" - } else if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "macos") { - "darwin" - } else if cfg!(target_os = "windows") { - "windows" - } else { - return match host_os { - Some(host_os) => Err(NdkError::UnsupportedHost(host_os)), - _ => Err(NdkError::UnsupportedTarget), - }; - }) - } - - pub fn toolchain_dir(&self) -> Result { - let arch = Self::host_arch()?; - let mut toolchain_dir = self - .ndk_path - .join("toolchains") - .join("llvm") - .join("prebuilt") - .join(format!("{}-x86_64", arch)); - if !toolchain_dir.exists() { - toolchain_dir.set_file_name(arch); - } - if !toolchain_dir.exists() { - return Err(NdkError::PathNotFound(toolchain_dir)); - } - Ok(toolchain_dir) - } - - pub fn clang(&self) -> Result<(PathBuf, PathBuf), NdkError> { - let ext = if cfg!(target_os = "windows") { - "exe" - } else { - "" - }; - - let bin_path = self.toolchain_dir()?.join("bin"); - - let clang = bin_path.join("clang").with_extension(ext); - if !clang.exists() { - return Err(NdkError::PathNotFound(clang)); - } - - let clang_pp = bin_path.join("clang++").with_extension(ext); - if !clang_pp.exists() { - return Err(NdkError::PathNotFound(clang_pp)); - } - - Ok((clang, clang_pp)) - } - - pub fn toolchain_bin(&self, name: &str, target: Target) -> Result { - let ext = if cfg!(target_os = "windows") { - ".exe" - } else { - "" - }; - - let toolchain_path = self.toolchain_dir()?.join("bin"); - - // Since r21 (https://github.com/android/ndk/wiki/Changelog-r21) LLVM binutils are included _for testing_; - // Since r22 (https://github.com/android/ndk/wiki/Changelog-r22) GNU binutils are deprecated in favour of LLVM's; - // Since r23 (https://github.com/android/ndk/wiki/Changelog-r23) GNU binutils have been removed. - // To maintain stability with the current ndk-build crate release, prefer GNU binutils for - // as long as it is provided by the NDK instead of trying to use llvm-* from r21 onwards. - let gnu_bin = format!("{}-{}{}", target.ndk_triple(), name, ext); - let gnu_path = toolchain_path.join(&gnu_bin); - if gnu_path.exists() { - Ok(gnu_path) - } else { - let llvm_bin = format!("llvm-{}{}", name, ext); - let llvm_path = toolchain_path.join(&llvm_bin); - if llvm_path.exists() { - Ok(llvm_path) - } else { - Err(NdkError::ToolchainBinaryNotFound { - toolchain_path, - gnu_bin, - llvm_bin, - }) - } - } - } - - pub fn prebuilt_dir(&self) -> Result { - let arch = Self::host_arch()?; - let prebuilt_dir = self - .ndk_path - .join("prebuilt") - .join(format!("{}-x86_64", arch)); - if !prebuilt_dir.exists() { - Err(NdkError::PathNotFound(prebuilt_dir)) - } else { - Ok(prebuilt_dir) - } - } - - pub fn ndk_gdb( - &self, - launch_dir: impl AsRef, - launch_activity: &str, - device_serial: Option<&str>, - ) -> Result<(), NdkError> { - let abi = self.detect_abi(device_serial)?; - let jni_dir = launch_dir.as_ref().join("jni"); - std::fs::create_dir_all(&jni_dir)?; - std::fs::write( - jni_dir.join("Android.mk"), - format!("APP_ABI={}\nTARGET_OUT=\n", abi.android_abi()), - )?; - let mut ndk_gdb = Command::new(self.prebuilt_dir()?.join("bin").join(cmd!("ndk-gdb"))); - - if let Some(device_serial) = &device_serial { - ndk_gdb.arg("-s").arg(device_serial); - } - - ndk_gdb - .arg("--adb") - .arg(self.adb_path()?) - .arg("--launch") - .arg(launch_activity) - .current_dir(launch_dir) - .status()?; - Ok(()) - } - - pub fn android_user_home(&self) -> Result { - let android_user_home = self.user_home.clone(); - std::fs::create_dir_all(&android_user_home)?; - Ok(android_user_home) - } - - pub fn keytool(&self) -> Result { - if let Ok(keytool) = which::which(bin!("keytool")) { - return Ok(Command::new(keytool)); - } - if let Ok(java) = std::env::var("JAVA_HOME") { - let keytool = PathBuf::from(java).join("bin").join(bin!("keytool")); - if keytool.exists() { - return Ok(Command::new(keytool)); - } - } - Err(NdkError::CmdNotFound("keytool".to_string())) - } - - pub fn debug_key(&self) -> Result { - let path = self.android_user_home()?.join("debug.keystore"); - let password = DEFAULT_DEV_KEYSTORE_PASSWORD.to_owned(); - - if !path.exists() { - let mut keytool = self.keytool()?; - keytool - .arg("-genkey") - .arg("-v") - .arg("-keystore") - .arg(&path) - .arg("-storepass") - .arg(&password) - .arg("-alias") - .arg("androiddebugkey") - .arg("-keypass") - .arg(&password) - .arg("-dname") - .arg("CN=Android Debug,O=Android,C=US") - .arg("-keyalg") - .arg("RSA") - .arg("-keysize") - .arg("2048") - .arg("-validity") - .arg("10000"); - if !keytool.status()?.success() { - return Err(NdkError::CmdFailed(keytool)); - } - } - Ok(Key { path, password }) - } - - pub fn sysroot_lib_dir(&self, target: Target) -> Result { - let sysroot_lib_dir = self - .toolchain_dir()? - .join("sysroot") - .join("usr") - .join("lib") - .join(target.ndk_triple()); - if !sysroot_lib_dir.exists() { - return Err(NdkError::PathNotFound(sysroot_lib_dir)); - } - Ok(sysroot_lib_dir) - } - - pub fn sysroot_platform_lib_dir( - &self, - target: Target, - min_sdk_version: u32, - ) -> Result { - let sysroot_lib_dir = self.sysroot_lib_dir(target)?; - - // Look for a platform <= min_sdk_version - let mut tmp_platform = min_sdk_version; - while tmp_platform > 1 { - let path = sysroot_lib_dir.join(tmp_platform.to_string()); - if path.exists() { - return Ok(path); - } - tmp_platform += 1; - } - - // Look for the minimum API level supported by the NDK - let mut tmp_platform = min_sdk_version; - while tmp_platform < 100 { - let path = sysroot_lib_dir.join(tmp_platform.to_string()); - if path.exists() { - return Ok(path); - } - tmp_platform += 1; - } - - Err(NdkError::PlatformNotFound(min_sdk_version)) - } - - pub fn detect_abi(&self, device_serial: Option<&str>) -> Result { - let mut adb = self.adb(device_serial)?; - - let stdout = adb - .arg("shell") - .arg("getprop") - .arg("ro.product.cpu.abi") - .output()? - .stdout; - let abi = std::str::from_utf8(&stdout).or(Err(NdkError::UnsupportedTarget))?; - Target::from_android_abi(abi.trim()) - } - - pub fn adb(&self, device_serial: Option<&str>) -> Result { - let mut adb = Command::new(self.adb_path()?); - - if let Some(device_serial) = device_serial { - adb.arg("-s").arg(device_serial); - } - - Ok(adb) - } -} - -pub struct Key { - pub path: PathBuf, - pub password: String, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - #[ignore] - fn test_detect() { - let ndk = Ndk::from_env().unwrap(); - assert_eq!(ndk.build_tools_version(), "29.0.2"); - assert_eq!(ndk.platforms(), &[29, 28]); - } -} diff --git a/ndk-build/src/readelf.rs b/ndk-build/src/readelf.rs deleted file mode 100644 index 1f8778f2..00000000 --- a/ndk-build/src/readelf.rs +++ /dev/null @@ -1,121 +0,0 @@ -use crate::apk::UnalignedApk; -use crate::error::NdkError; -use crate::target::Target; -use std::collections::HashSet; -use std::io::BufRead; -use std::path::{Path, PathBuf}; -use std::process::Command; - -impl<'a> UnalignedApk<'a> { - pub fn add_lib_recursively( - &mut self, - lib: &Path, - target: Target, - search_paths: &[&Path], - ) -> Result<(), NdkError> { - let ndk = &self.config().ndk; - let default_min_sdk = crate::manifest::Sdk::default().min_sdk_version.unwrap(); - let min_sdk_version = self - .config() - .manifest - .sdk - .min_sdk_version - .unwrap_or(default_min_sdk); - let readelf_path = ndk.toolchain_bin("readelf", target)?; - - let android_search_paths = [ - &*ndk.sysroot_lib_dir(target)?, - &*ndk.sysroot_platform_lib_dir(target, min_sdk_version)?, - ]; - - let mut provided = HashSet::new(); - for path in &android_search_paths { - for lib in list_libs(path)? { - if lib != "libc++_shared.so" { - provided.insert(lib); - } - } - } - - let mut artifacts = vec![lib.to_path_buf()]; - while let Some(artifact) = artifacts.pop() { - self.add_lib(&artifact, target)?; - for need in list_needed_libs(&readelf_path, &artifact)? { - // c++_shared is available in the NDK but not on-device. - // Must be bundled with the apk if used: - // https://developer.android.com/ndk/guides/cpp-support#libc - let search_paths = if need == "libc++_shared.so" { - &android_search_paths - } else if !provided.contains(&need) { - search_paths - } else { - continue; - }; - - if let Some(path) = find_library_path(search_paths, &need)? { - if provided.insert(path.file_name().unwrap().to_str().unwrap().to_string()) { - artifacts.push(path); - } - } else { - eprintln!("Shared library \"{}\" not found.", need); - } - } - } - - Ok(()) - } -} - -/// List all linked shared libraries -fn list_needed_libs(readelf_path: &Path, library_path: &Path) -> Result, NdkError> { - let mut readelf = Command::new(readelf_path); - let output = readelf.arg("-d").arg(library_path).output()?; - if !output.status.success() { - return Err(NdkError::CmdFailed(readelf)); - } - let mut needed = HashSet::new(); - for line in output.stdout.lines() { - let line = line?; - if line.contains("(NEEDED)") { - let lib = line - .split("Shared library: [") - .last() - .and_then(|line| line.split(']').next()); - if let Some(lib) = lib { - needed.insert(lib.to_string()); - } - } - } - Ok(needed) -} - -/// List shared libraries -fn list_libs(path: &Path) -> Result, NdkError> { - let mut libs = HashSet::new(); - let entries = std::fs::read_dir(path)?; - for entry in entries { - let entry = entry?; - if !entry.path().is_dir() { - if let Some(file_name) = entry.file_name().to_str() { - if file_name.ends_with(".so") { - libs.insert(file_name.to_string()); - } - } - } - } - Ok(libs) -} - -/// Resolves native library using search paths -fn find_library_path>( - paths: &[&Path], - library: S, -) -> Result, NdkError> { - for path in paths { - let lib_path = path.join(&library); - if lib_path.exists() { - return Ok(Some(dunce::canonicalize(lib_path)?)); - } - } - Ok(None) -} diff --git a/ndk-build/src/target.rs b/ndk-build/src/target.rs deleted file mode 100644 index 676b9005..00000000 --- a/ndk-build/src/target.rs +++ /dev/null @@ -1,79 +0,0 @@ -use crate::error::NdkError; -use serde::Deserialize; - -#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq)] -#[repr(u8)] -pub enum Target { - #[serde(rename = "armv7-linux-androideabi")] - ArmV7a = 1, - #[serde(rename = "aarch64-linux-android")] - Arm64V8a = 2, - #[serde(rename = "i686-linux-android")] - X86 = 3, - #[serde(rename = "x86_64-linux-android")] - X86_64 = 4, -} - -impl Target { - /// Identifier used in the NDK to refer to the ABI - pub fn android_abi(self) -> &'static str { - match self { - Self::Arm64V8a => "arm64-v8a", - Self::ArmV7a => "armeabi-v7a", - Self::X86 => "x86", - Self::X86_64 => "x86_64", - } - } - - /// Returns `Target` for abi. - pub fn from_android_abi(abi: &str) -> Result { - match abi { - "arm64-v8a" => Ok(Self::Arm64V8a), - "armeabi-v7a" => Ok(Self::ArmV7a), - "x86" => Ok(Self::X86), - "x86_64" => Ok(Self::X86_64), - _ => Err(NdkError::UnsupportedTarget), - } - } - - /// Returns the triple used by the rust build tools - pub fn rust_triple(self) -> &'static str { - match self { - Self::Arm64V8a => "aarch64-linux-android", - Self::ArmV7a => "armv7-linux-androideabi", - Self::X86 => "i686-linux-android", - Self::X86_64 => "x86_64-linux-android", - } - } - - /// Returns `Target` for rust triple. - pub fn from_rust_triple(triple: &str) -> Result { - match triple { - "aarch64-linux-android" => Ok(Self::Arm64V8a), - "armv7-linux-androideabi" => Ok(Self::ArmV7a), - "i686-linux-android" => Ok(Self::X86), - "x86_64-linux-android" => Ok(Self::X86_64), - _ => Err(NdkError::UnsupportedTarget), - } - } - - // Returns the triple NDK provided LLVM - pub fn ndk_llvm_triple(self) -> &'static str { - match self { - Self::Arm64V8a => "aarch64-linux-android", - Self::ArmV7a => "armv7a-linux-androideabi", - Self::X86 => "i686-linux-android", - Self::X86_64 => "x86_64-linux-android", - } - } - - /// Returns the triple used by the non-LLVM parts of the NDK - pub fn ndk_triple(self) -> &'static str { - match self { - Self::Arm64V8a => "aarch64-linux-android", - Self::ArmV7a => "arm-linux-androideabi", - Self::X86 => "i686-linux-android", - Self::X86_64 => "x86_64-linux-android", - } - } -} diff --git a/ndk-context/CHANGELOG.md b/ndk-context/CHANGELOG.md deleted file mode 100644 index 585e9ae9..00000000 --- a/ndk-context/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Unreleased - -# 0.1.1 (2022-04-19) - -- Add `release_android_context()` function to remove `AndroidContext` when activity is destroyed. (#263) - -# 0.1.0 (2022-02-14) - -- Initial release! 🎉 diff --git a/ndk-context/Cargo.toml b/ndk-context/Cargo.toml deleted file mode 100644 index 484bd28d..00000000 --- a/ndk-context/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "ndk-context" -version = "0.1.1" -authors = ["The Rust Windowing contributors"] -edition = "2021" -description = "Handles for accessing Android APIs" -license = "MIT OR Apache-2.0" -keywords = ["android", "ndk", "apk", "jni"] -documentation = "https://docs.rs/ndk-context" -homepage = "https://github.com/rust-windowing/android-ndk-rs" -repository = "https://github.com/rust-windowing/android-ndk-rs" -rust-version = "1.60" diff --git a/ndk-context/README.md b/ndk-context/README.md deleted file mode 100644 index 38941eaf..00000000 --- a/ndk-context/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# ndk-context - -Provides a stable api to rust crates for interfacing with the Android platform. It is -initialized by the runtime, usually [__ndk-glue__](https://crates.io/crates/ndk-glue), -but could also be initialized by Java or Kotlin code when embedding in an existing Android -project. diff --git a/ndk-context/src/lib.rs b/ndk-context/src/lib.rs deleted file mode 100644 index 1e1e54f5..00000000 --- a/ndk-context/src/lib.rs +++ /dev/null @@ -1,100 +0,0 @@ -//! Provides a stable api to rust crates for interfacing with the Android platform. It is -//! initialized by the runtime, usually [__ndk-glue__](https://crates.io/crates/ndk-glue), -//! but could also be initialized by Java or Kotlin code when embedding in an existing Android -//! project. -//! -//! ```no_run -//! let ctx = ndk_context::android_context(); -//! let vm = unsafe { jni::JavaVM::from_raw(ctx.vm().cast()) }?; -//! let env = vm.attach_current_thread(); -//! let class_ctx = env.find_class("android/content/Context")?; -//! let audio_service = env.get_static_field(class_ctx, "AUDIO_SERVICE", "Ljava/lang/String;")?; -//! let audio_manager = env -//! .call_method( -//! ctx.context() as jni::sys::jobject, -//! "getSystemService", -//! "(Ljava/lang/String;)Ljava/lang/Object;", -//! &[audio_service], -//! )? -//! .l()?; -//! ``` -use std::ffi::c_void; - -static mut ANDROID_CONTEXT: Option = None; - -/// [`AndroidContext`] provides the pointers required to interface with the jni on Android -/// platforms. -#[derive(Clone, Copy, Debug)] -pub struct AndroidContext { - java_vm: *mut c_void, - context_jobject: *mut c_void, -} - -impl AndroidContext { - /// A handle to the `JavaVM` object. - /// - /// Usage with [__jni__](https://crates.io/crates/jni) crate: - /// ```no_run - /// let ctx = ndk_context::android_context(); - /// let vm = unsafe { jni::JavaVM::from_raw(ctx.vm().cast()) }?; - /// let env = vm.attach_current_thread(); - /// ``` - pub fn vm(self) -> *mut c_void { - self.java_vm - } - - /// A handle to an [android.content.Context](https://developer.android.com/reference/android/content/Context). - /// In most cases this will be a ptr to an `Activity`, but this isn't guaranteed. - /// - /// Usage with [__jni__](https://crates.io/crates/jni) crate: - /// ```no_run - /// let ctx = ndk_context::android_context(); - /// let vm = unsafe { jni::JavaVM::from_raw(ctx.vm().cast()) }?; - /// let env = vm.attach_current_thread(); - /// let class_ctx = env.find_class("android/content/Context")?; - /// let audio_service = env.get_static_field(class_ctx, "AUDIO_SERVICE", "Ljava/lang/String;")?; - /// let audio_manager = env - /// .call_method( - /// ctx.context() as jni::sys::jobject, - /// "getSystemService", - /// "(Ljava/lang/String;)Ljava/lang/Object;", - /// &[audio_service], - /// )? - /// .l()?; - /// ``` - pub fn context(self) -> *mut c_void { - self.context_jobject - } -} - -/// Main entry point to this crate. Returns an [`AndroidContext`]. -pub fn android_context() -> AndroidContext { - unsafe { ANDROID_CONTEXT.expect("android context was not initialized") } -} - -/// Initializes the [`AndroidContext`]. [`AndroidContext`] is initialized by [__ndk-glue__](https://crates.io/crates/ndk-glue) -/// before `main` is called. -/// -/// # Safety -/// -/// The pointers must be valid and this function must be called exactly once before `main` is -/// called. -pub unsafe fn initialize_android_context(java_vm: *mut c_void, context_jobject: *mut c_void) { - let previous = ANDROID_CONTEXT.replace(AndroidContext { - java_vm, - context_jobject, - }); - assert!(previous.is_none()); -} - -/// Removes the [`AndroidContext`]. It is released by [__ndk-glue__](https://crates.io/crates/ndk-glue) -/// when the activity is finished and destroyed. -/// -/// # Safety -/// -/// This function must only be called after [`initialize_android_context()`], -/// when the activity is subsequently destroyed according to Android. -pub unsafe fn release_android_context() { - let previous = ANDROID_CONTEXT.take(); - assert!(previous.is_some()); -} diff --git a/ndk-examples/Cargo.toml b/ndk-examples/Cargo.toml deleted file mode 100644 index 5c22b30f..00000000 --- a/ndk-examples/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "ndk-examples" -version = "0.1.0" -authors = ["David Craven "] -edition = "2018" -publish = false - -[target.'cfg(target_os = "android")'.dependencies] -jni = "0.20" -libc = "0.2" -log = "0.4.14" -ndk = { path = "../ndk", features = ["api-level-23"] } -ndk-context = { path = "../ndk-context" } -ndk-glue = { path = "../ndk-glue", features = ["logger"] } - -[[example]] -name = "hello_world" -crate-type = ["cdylib"] - -[[example]] -name = "jni_audio" -crate-type = ["cdylib"] - -[[example]] -name = "looper" -crate-type = ["cdylib"] - -[package.metadata.android.sdk] -min_sdk_version = 16 -target_sdk_version = 29 diff --git a/ndk-examples/README.md b/ndk-examples/README.md deleted file mode 100644 index c4eec76b..00000000 --- a/ndk-examples/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# ndk-examples - -Collection of examples showing different parts of the libraries. - -## Examples - -In order to see logs of the sample apps execute in a console: -```console -$ adb logcat RustStdoutStderr:D '*:S' -``` - -### hello_world - -Prints `hello world` in the console - -```console -$ cargo apk build --example hello_world -``` - -### jni_audio - -Prints output audio devices in the console - -```console -$ cargo apk run --example jni_audio -``` diff --git a/ndk-examples/examples/hello_world.rs b/ndk-examples/examples/hello_world.rs deleted file mode 100644 index 68fab11f..00000000 --- a/ndk-examples/examples/hello_world.rs +++ /dev/null @@ -1,14 +0,0 @@ -use log::info; -use ndk::trace; - -#[cfg_attr( - target_os = "android", - ndk_glue::main(backtrace = "on", logger(level = "debug", tag = "hello-world")) -)] -fn main() { - let _trace; - if trace::is_trace_enabled() { - _trace = trace::Section::new("ndk-rs example main").unwrap(); - } - info!("hello world"); -} diff --git a/ndk-examples/examples/jni_audio.rs b/ndk-examples/examples/jni_audio.rs deleted file mode 100644 index 3a339858..00000000 --- a/ndk-examples/examples/jni_audio.rs +++ /dev/null @@ -1,75 +0,0 @@ -use jni::objects::JObject; - -#[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] -fn main() { - enumerate_audio_devices().unwrap(); -} - -const GET_DEVICES_OUTPUTS: jni::sys::jint = 2; - -fn enumerate_audio_devices() -> Result<(), Box> { - // Create a VM for executing Java calls - let ctx = ndk_context::android_context(); - let vm = unsafe { jni::JavaVM::from_raw(ctx.vm().cast()) }?; - let context = unsafe { JObject::from_raw(ctx.context().cast()) }; - let env = vm.attach_current_thread()?; - - // Query the global Audio Service - let class_ctxt = env.find_class("android/content/Context")?; - let audio_service = env.get_static_field(class_ctxt, "AUDIO_SERVICE", "Ljava/lang/String;")?; - - let audio_manager = env - .call_method( - context, - "getSystemService", - // JNI type signature needs to be derived from the Java API - // (ArgTys)ResultTy - "(Ljava/lang/String;)Ljava/lang/Object;", - &[audio_service], - )? - .l()?; - - // Enumerate output devices - let devices = env.call_method( - audio_manager, - "getDevices", - "(I)[Landroid/media/AudioDeviceInfo;", - &[GET_DEVICES_OUTPUTS.into()], - )?; - - println!("-- Output Audio Devices --"); - - let device_array = devices.l()?.into_raw(); - let len = env.get_array_length(device_array)?; - for i in 0..len { - let device = env.get_object_array_element(device_array, i)?; - - // Collect device information - // See https://developer.android.com/reference/android/media/AudioDeviceInfo - let product_name: String = { - let name = - env.call_method(device, "getProductName", "()Ljava/lang/CharSequence;", &[])?; - let name = env.call_method(name.l()?, "toString", "()Ljava/lang/String;", &[])?; - env.get_string(name.l()?.into())?.into() - }; - let id = env.call_method(device, "getId", "()I", &[])?.i()?; - let ty = env.call_method(device, "getType", "()I", &[])?.i()?; - - let sample_rates = { - let sample_array = env - .call_method(device, "getSampleRates", "()[I", &[])? - .l()? - .into_raw(); - let len = env.get_array_length(sample_array)?; - - let mut sample_rates = vec![0; len as usize]; - env.get_int_array_region(sample_array, 0, &mut sample_rates)?; - sample_rates - }; - - println!("Device {}: Id {}, Type {}", product_name, id, ty); - println!("sample rates: {:#?}", sample_rates); - } - - Ok(()) -} diff --git a/ndk-examples/examples/looper.rs b/ndk-examples/examples/looper.rs deleted file mode 100644 index 180c7082..00000000 --- a/ndk-examples/examples/looper.rs +++ /dev/null @@ -1,158 +0,0 @@ -//! Demonstrates how to manage application lifetime using Android's `Looper` - -use std::mem::MaybeUninit; -use std::os::unix::prelude::RawFd; -use std::time::Duration; - -use log::info; -use ndk::event::{InputEvent, Keycode}; -use ndk::looper::{FdEvent, Poll, ThreadLooper}; - -const U32_SIZE: usize = std::mem::size_of::(); - -#[cfg_attr( - target_os = "android", - ndk_glue::main(backtrace = "on", logger(level = "debug")) -)] -fn main() { - // Retrieve the Looper that ndk_glue created for us on the current thread. - // Android uses this to block on events and poll file descriptors with a single mechanism. - let looper = - ThreadLooper::for_thread().expect("ndk-glue did not attach thread looper before main()!"); - - // First free number after ndk_glue::NDK_GLUE_LOOPER_INPUT_QUEUE_IDENT. This might be fragile. - const CUSTOM_EVENT_IDENT: i32 = ndk_glue::NDK_GLUE_LOOPER_INPUT_QUEUE_IDENT + 1; - - fn create_pipe() -> [RawFd; 2] { - let mut ends = MaybeUninit::<[RawFd; 2]>::uninit(); - assert_eq!(unsafe { libc::pipe(ends.as_mut_ptr().cast()) }, 0); - unsafe { ends.assume_init() } - } - - // Create a Unix pipe to send custom events to the Looper. ndk-glue uses a similar mechanism to deliver - // ANativeActivityCallbacks asynchronously to the Looper through NDK_GLUE_LOOPER_EVENT_PIPE_IDENT. - let custom_event_pipe = create_pipe(); - let custom_callback_pipe = create_pipe(); - - // Attach the reading end of the pipe to the looper, so that it wakes up - // whenever data is available for reading (FdEvent::INPUT) - looper - .as_foreign() - .add_fd( - custom_event_pipe[0], - CUSTOM_EVENT_IDENT, - FdEvent::INPUT, - std::ptr::null_mut(), - ) - .expect("Failed to add file descriptor to Looper"); - - // Attach the reading end of a pipe to a callback, too - looper - .as_foreign() - .add_fd_with_callback(custom_callback_pipe[0], FdEvent::INPUT, |fd| { - let mut recv = !0u32; - assert_eq!( - unsafe { libc::read(fd, &mut recv as *mut _ as *mut _, U32_SIZE) } as usize, - U32_SIZE - ); - info!("Read custom event from pipe, in callback: {}", recv); - // Detach this handler by returning `false` once the count reaches 5 - recv < 5 - }) - .expect("Failed to add file descriptor to Looper"); - - std::thread::spawn(move || { - // Send a "custom event" to the looper every second - for i in 0.. { - let i_addr = &i as *const _ as *const _; - std::thread::sleep(Duration::from_secs(1)); - assert_eq!( - unsafe { libc::write(custom_event_pipe[1], i_addr, U32_SIZE) }, - U32_SIZE as isize - ); - assert_eq!( - unsafe { libc::write(custom_callback_pipe[1], i_addr, U32_SIZE,) }, - U32_SIZE as isize - ); - } - }); - - let mut exit = false; - - while !exit { - // looper.poll_*_timeout(timeout) to not block indefinitely. - // Pass a timeout of Duration::ZERO to never block. - match looper.poll_all().unwrap() { - Poll::Wake => { /* looper.as_foreign().wake() was called */ } - Poll::Callback => { - /* An event with a registered callback was received. - * Only received when polling for single events with poll_once_* - */ - unreachable!() - } - Poll::Timeout => { - /* Timed out as per poll_*_timeout */ - unreachable!() - } - Poll::Event { - ident, - fd, - events: _, - data: _, - } => { - info!("File descriptor event on identifier {}", ident); - match ident { - ndk_glue::NDK_GLUE_LOOPER_EVENT_PIPE_IDENT => { - // One of the callbacks in ANativeActivityCallbacks is called, and delivered - // to this application asynchronously by ndk_glue through a pipe. - // These consist mostly of important lifecycle and window events! Graphics - // applications will create and destroy their output surface/swapchain here. - info!( - "Event pipe yields: {:?}", - ndk_glue::poll_events() - .expect("Looper says event-pipe has data available!") - ) - } - ndk_glue::NDK_GLUE_LOOPER_INPUT_QUEUE_IDENT => { - let input_queue = ndk_glue::input_queue(); - let input_queue = input_queue.as_ref().expect("Input queue not attached"); - assert!(input_queue.has_events()); - // Consume as many events as possible - while let Some(event) = input_queue.get_event().unwrap() { - // Pass the event by a possible IME (Input Method Editor, ie. an open keyboard) first - if let Some(event) = input_queue.pre_dispatch(event) { - info!("Input event {:?}", event); - let mut handled = false; - if let InputEvent::KeyEvent(key_event) = &event { - if key_event.key_code() == Keycode::Back { - // Gracefully stop the app when the user presses the back button - exit = true; - handled = true; - } - } - // Let Android know that we did not consume the event - // (Pass true here if you did) - input_queue.finish_event(event, handled); - } - } - } - CUSTOM_EVENT_IDENT => { - // Expect to receive 32-bit numbers to describe events, - // as sent by the thread above - let mut recv = !0u32; - assert_eq!( - unsafe { libc::read(fd, &mut recv as *mut _ as *mut _, U32_SIZE) } - as usize, - U32_SIZE - ); - info!("Read custom event from pipe: {}", recv); - } - i => panic!("Unexpected event identifier {}", i), - } - } - } - } - - // Stop the activity - ndk_glue::native_activity().unwrap().finish() -} diff --git a/ndk-glue/CHANGELOG.md b/ndk-glue/CHANGELOG.md deleted file mode 100644 index f4c96e06..00000000 --- a/ndk-glue/CHANGELOG.md +++ /dev/null @@ -1,76 +0,0 @@ -# Unreleased - -- **Breaking:** `NativeActivity` is now behind a lock, and will be removed as soon as `onDestroy` - is called. Due to the async nature of events, make sure to hold on to the lock received from - `native_activity()` _beforehand_ if you wish to use it during handling of `Event::Destroy`. The - lock should be released to allow `onDestroy` to return. - -# 0.7.0 (2022-07-24) - -- **Breaking:** Provide a `LockReadGuard` newtype around `NativeWindow`/`InputQueue` to hide the underlying lock implementation. (#288) -- **Breaking:** Transpose `LockReadGuard>` into `Option>` to only necessitate an `Option` unpack/`unwrap()` once. (#282) - -# 0.6.2 (2022-04-19) - -- Call `ndk_context::release_android_context()` function to remove `AndroidContext` when activity is destroyed. (#263) - -# 0.6.1 (2022-02-14) - -- Initialize `ndk-context` for cross-version access to the Java `VM` and Android `Context`. - -# 0.6.0 (2022-01-05) - -- **Breaking:** Update to `ndk-sys 0.3.0` and `ndk 0.6.0`. (#214) - -# 0.5.2 (2022-04-19) - -- Call `ndk_context::release_android_context()` function to remove `AndroidContext` when activity is destroyed. (#263) - -# 0.5.1 (2022-02-15) - -- Initialize `ndk-context` for cross-version access to the Java `VM` and Android `Context`. - -# 0.5.0 (2021-11-22) - -- Document when to lock and unlock the window/input queue when certain events are received. -- **Breaking:** Update to `ndk 0.5.0` and `ndk-macros 0.3.0`. - -# 0.4.2 (2022-04-19) - -- Call `ndk_context::release_android_context()` function to remove `AndroidContext` when activity is destroyed. (#263) - -# 0.4.1 (2022-02-15) - -- Initialize `ndk-context` for cross-version access to the Java `VM` and Android `Context`. - -# 0.4.0 (2021-08-02) - -- Looper is now created before returning from `ANativeActivity_onCreate`, solving - race conditions in `onInputQueueCreated`. -- Event pipe and looper are now notified of removal _before_ destroying `NativeWindow` - and `InputQueue`. This allows applications to unlock their read-locks of these instances - first (which they are supposed to hold on to during use) instead of deadlocking in - Android callbacks. -- Reexport `android_logger` and `log` from the crate root for `ndk-macro` to use. -- Use new `FdEvents` `bitflags` for looper file descriptor events. -- Update to `ndk` 0.4.0. - This minor dependency bump causes a minor bump for `ndk-glue` too. - -# 0.3.0 (2021-01-30) - -- **Breaking:** Looper `ident` not passed in `data` pointer anymore. - If you are relying on `Poll::Event::data` to tell event fd and - input queue apart, please use `Poll::Event::ident` and the new - constants introduced in `ndk-glue`! - -# 0.2.1 (2020-10-15) - -- Fix documentation build on docs.rs - -# 0.2.0 (2020-09-15) - -- **Breaking:** Removed `ndk_glue` macro in favor of new `main` attribute macro. - -# 0.1.0 (2020-04-22) - -- Initial release! 🎉 diff --git a/ndk-glue/Cargo.toml b/ndk-glue/Cargo.toml deleted file mode 100644 index beb91894..00000000 --- a/ndk-glue/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "ndk-glue" -version = "0.7.0" -authors = ["The Rust Windowing contributors"] -edition = "2018" -description = "Startup code for android binaries" -license = "MIT OR Apache-2.0" -keywords = ["android", "ndk"] -readme = "README.md" -documentation = "https://docs.rs/ndk-glue" -homepage = "https://github.com/rust-windowing/android-ndk-rs" -repository = "https://github.com/rust-windowing/android-ndk-rs" -rust-version = "1.60" - -[dependencies] -android_logger = { version = "0.11", optional = true } -libc = "0.2.84" -log = "0.4.14" -ndk = { path = "../ndk", version = "0.7.0" } -ndk-context = { path = "../ndk-context", version = "0.1.1" } -ndk-macro = { path = "../ndk-macro", version = "0.3.0" } -ndk-sys = { path = "../ndk-sys", version = "0.4.0" } -once_cell = "1" -parking_lot = "0.12" - -[features] -default = [] -test = ["ndk/test", "ndk-sys/test"] -logger = ["android_logger", "ndk-macro/logger"] - -[package.metadata.docs.rs] -rustdoc-args = ["--cfg", "docsrs"] -targets = [ - "aarch64-linux-android", - "armv7-linux-androideabi", - "i686-linux-android", - "x86_64-linux-android", -] diff --git a/ndk-glue/README.md b/ndk-glue/README.md deleted file mode 100644 index c434770e..00000000 --- a/ndk-glue/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# ndk-glue - -Interoperability library for a native Rust application with the Android framework. -Provides access to `NativeActivity`, `NativeWindow` and `InputQueue`. - -This library exports the `main` attribute macro from `ndk-macro`, see the corresponding README for more details. diff --git a/ndk-glue/src/lib.rs b/ndk-glue/src/lib.rs deleted file mode 100644 index 60a0d6ff..00000000 --- a/ndk-glue/src/lib.rs +++ /dev/null @@ -1,431 +0,0 @@ -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] - -use log::Level; -use ndk::input_queue::InputQueue; -use ndk::looper::{FdEvent, ForeignLooper, ThreadLooper}; -use ndk::native_activity::NativeActivity; -use ndk::native_window::NativeWindow; -use ndk_sys::{AInputQueue, ANativeActivity, ANativeWindow, ARect}; -use once_cell::sync::Lazy; -use parking_lot::{MappedRwLockReadGuard, RwLock, RwLockReadGuard}; -use std::ffi::{CStr, CString}; -use std::fmt; -use std::fs::File; -use std::io::{BufRead, BufReader}; -use std::ops::Deref; -use std::os::raw; -use std::os::unix::prelude::*; -use std::ptr::NonNull; -use std::sync::{Arc, Condvar, Mutex}; -use std::thread; - -#[cfg(feature = "logger")] -pub use android_logger; -#[cfg(feature = "logger")] -pub use log; - -pub use ndk_macro::main; - -/// `ndk-glue` macros register the reading end of an event pipe with the -/// main [`ThreadLooper`] under this `ident`. -/// When returned from [`ThreadLooper::poll_*`][ThreadLooper::poll_once] -/// an event can be retrieved from [`poll_events()`]. -pub const NDK_GLUE_LOOPER_EVENT_PIPE_IDENT: i32 = 0; - -/// The [`InputQueue`] received from Android is registered with the main -/// [`ThreadLooper`] under this `ident`. -/// When returned from [`ThreadLooper::poll_*`][ThreadLooper::poll_once] -/// an event can be retrieved from [`input_queue()`]. -pub const NDK_GLUE_LOOPER_INPUT_QUEUE_IDENT: i32 = 1; - -pub fn android_log(level: Level, tag: &CStr, msg: &CStr) { - let prio = match level { - Level::Error => ndk_sys::android_LogPriority::ANDROID_LOG_ERROR, - Level::Warn => ndk_sys::android_LogPriority::ANDROID_LOG_WARN, - Level::Info => ndk_sys::android_LogPriority::ANDROID_LOG_INFO, - Level::Debug => ndk_sys::android_LogPriority::ANDROID_LOG_DEBUG, - Level::Trace => ndk_sys::android_LogPriority::ANDROID_LOG_VERBOSE, - }; - unsafe { - ndk_sys::__android_log_write(prio.0 as raw::c_int, tag.as_ptr(), msg.as_ptr()); - } -} - -static NATIVE_ACTIVITY: Lazy>> = Lazy::new(Default::default); -static NATIVE_WINDOW: Lazy>> = Lazy::new(Default::default); -static INPUT_QUEUE: Lazy>> = Lazy::new(Default::default); -static CONTENT_RECT: Lazy> = Lazy::new(Default::default); -static LOOPER: Lazy>> = Lazy::new(Default::default); - -/// This function accesses a `static` variable internally and must only be used if you are sure -/// there is exactly one version of [`ndk_glue`][crate] in your dependency tree. -/// -/// If you need access to the `JavaVM` through [`NativeActivity::vm()`] or Activity `Context` -/// through [`NativeActivity::activity()`], please use the [`ndk_context`] crate and its -/// [`ndk_context::android_context()`] getter to acquire the `JavaVM` and `Context` instead. -pub fn native_activity() -> Option> { - LockReadGuard::from_wrapped_option(NATIVE_ACTIVITY.read()) -} - -pub struct LockReadGuard(MappedRwLockReadGuard<'static, T>); - -impl LockReadGuard { - /// Transpose an [`Option`] wrapped inside a [`LockReadGuard`] - /// - /// This is a _read_ lock for which the contents can't change; hence allowing the user to only - /// check for [`None`] once and hold a lock containing `T` directly thereafter, without - /// subsequent infallible [`Option::unwrap()`]s. - fn from_wrapped_option(wrapped: RwLockReadGuard<'static, Option>) -> Option { - RwLockReadGuard::try_map(wrapped, Option::as_ref) - .ok() - .map(Self) - } -} - -impl Deref for LockReadGuard { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl fmt::Debug for LockReadGuard { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} - -impl fmt::Display for LockReadGuard { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} - -/// Returns a [`NativeWindow`] held inside a lock, preventing Android from freeing it immediately -/// in [its `NativeWindow` destructor]. -/// -/// If the window is in use by e.g. a graphics API, make sure to hold on to this lock. -/// -/// After receiving [`Event::WindowDestroyed`] `ndk-glue` will block in Android's [`NativeWindow`] destructor -/// callback until the lock is released, returning to Android and allowing it to free the window. -/// -/// [its `NativeWindow` destructor]: https://developer.android.com/ndk/reference/struct/a-native-activity-callbacks#onnativewindowdestroyed -/// -/// # Warning -/// This function accesses a `static` variable internally and must only be used if you are sure -/// there is exactly one version of `ndk_glue` in your dependency tree. -pub fn native_window() -> Option> { - LockReadGuard::from_wrapped_option(NATIVE_WINDOW.read()) -} - -/// Returns an [`InputQueue`] held inside a lock, preventing Android from freeing it immediately -/// in [its `InputQueue` destructor]. -/// -/// After receiving [`Event::InputQueueDestroyed`] `ndk-glue` will block in Android's [`InputQueue`] destructor -/// callback until the lock is released, returning to Android and allowing it to free the window. -/// -/// [its `InputQueue` destructor]: https://developer.android.com/ndk/reference/struct/a-native-activity-callbacks#oninputqueuedestroyed -/// -/// # Warning -/// This function accesses a `static` variable internally and must only be used if you are sure -/// there is exactly one version of `ndk_glue` in your dependency tree. -pub fn input_queue() -> Option> { - LockReadGuard::from_wrapped_option(INPUT_QUEUE.read()) -} - -/// This function accesses a `static` variable internally and must only be used if you are sure -/// there is exactly one version of `ndk_glue` in your dependency tree. -pub fn content_rect() -> Rect { - CONTENT_RECT.read().clone() -} - -static PIPE: Lazy<[RawFd; 2]> = Lazy::new(|| { - let mut pipe: [RawFd; 2] = Default::default(); - unsafe { libc::pipe(pipe.as_mut_ptr()) }; - pipe -}); - -pub fn poll_events() -> Option { - unsafe { - let size = std::mem::size_of::(); - let mut event = Event::Start; - if libc::read(PIPE[0], &mut event as *mut _ as *mut _, size) == size as _ { - Some(event) - } else { - None - } - } -} - -unsafe fn wake(_activity: *mut ANativeActivity, event: Event) { - log::trace!("{:?}", event); - let size = std::mem::size_of::(); - let res = libc::write(PIPE[1], &event as *const _ as *const _, size); - assert_eq!(res, size as _); -} - -#[derive(Clone, Debug, Default, Eq, PartialEq)] -pub struct Rect { - pub left: u32, - pub top: u32, - pub right: u32, - pub bottom: u32, -} - -#[derive(Clone, Debug, Eq, PartialEq)] -#[repr(u8)] -pub enum Event { - Start, - Resume, - SaveInstanceState, - Pause, - Stop, - /// The native activity will be stopped and destroyed after this event. - /// Due to the async nature of these events, make sure to hold on to the - /// lock received from [`native_activity()`] _beforehand_ if you wish to use - /// it during handling of [`Event::Destroy`]. The lock should be released to - /// allow `onDestroy` to return. - Destroy, - ConfigChanged, - LowMemory, - WindowLostFocus, - WindowHasFocus, - /// A [`NativeWindow`] is now available through [`native_window()`]. See that function for more - /// details about holding on to the returned [`LockReadGuard`]. - /// - /// Be sure to release any resources (e.g. Vulkan/OpenGL graphics surfaces) created from - /// it followed by releasing this lock upon receiving [`Event::WindowDestroyed`]. - WindowCreated, - WindowResized, - WindowRedrawNeeded, - /// If the window is in use by e.g. a graphics API, make sure the [`LockReadGuard`] from - /// [`native_window()`] is held on to until after freeing those resources. - /// - /// After receiving this [`Event`] `ndk_glue` will block inside its [`NativeWindow`] destructor - /// until that read-lock is released before returning to Android and allowing it to free the - /// window. - /// - /// From this point [`native_window()`] will return [`None`] until receiving - /// [`Event::WindowCreated`] again. - WindowDestroyed, - /// An [`InputQueue`] is now available through [`input_queue()`]. - /// - /// Be sure to release the returned lock upon receiving [`Event::InputQueueDestroyed`]. - InputQueueCreated, - /// After receiving this [`Event`] `ndk_glue` will block inside its [`InputQueue`] destructor - /// until the read-lock from [`input_queue()`] is released before returning to Android and - /// allowing it to free the input queue. - /// - /// From this point [`input_queue()`] will return [`None`] until receiving - /// [`Event::InputQueueCreated`] again. - InputQueueDestroyed, - ContentRectChanged, -} - -/// # Safety -/// `activity` must either be null (resulting in a safe panic) -/// or a pointer to a valid Android `ANativeActivity`. -pub unsafe fn init( - activity: *mut ANativeActivity, - _saved_state: *mut u8, - _saved_state_size: usize, - main: fn(), -) { - let mut activity = NonNull::new(activity).unwrap(); - let mut callbacks = activity.as_mut().callbacks.as_mut().unwrap(); - callbacks.onStart = Some(on_start); - callbacks.onResume = Some(on_resume); - callbacks.onSaveInstanceState = Some(on_save_instance_state); - callbacks.onPause = Some(on_pause); - callbacks.onStop = Some(on_stop); - callbacks.onDestroy = Some(on_destroy); - callbacks.onWindowFocusChanged = Some(on_window_focus_changed); - callbacks.onNativeWindowCreated = Some(on_window_created); - callbacks.onNativeWindowResized = Some(on_window_resized); - callbacks.onNativeWindowRedrawNeeded = Some(on_window_redraw_needed); - callbacks.onNativeWindowDestroyed = Some(on_window_destroyed); - callbacks.onInputQueueCreated = Some(on_input_queue_created); - callbacks.onInputQueueDestroyed = Some(on_input_queue_destroyed); - callbacks.onContentRectChanged = Some(on_content_rect_changed); - callbacks.onConfigurationChanged = Some(on_configuration_changed); - callbacks.onLowMemory = Some(on_low_memory); - - let activity = NativeActivity::from_ptr(activity); - ndk_context::initialize_android_context(activity.vm().cast(), activity.activity().cast()); - NATIVE_ACTIVITY.write().replace(activity); - - let mut logpipe: [RawFd; 2] = Default::default(); - libc::pipe(logpipe.as_mut_ptr()); - libc::dup2(logpipe[1], libc::STDOUT_FILENO); - libc::dup2(logpipe[1], libc::STDERR_FILENO); - thread::spawn(move || { - let tag = CStr::from_bytes_with_nul(b"RustStdoutStderr\0").unwrap(); - let file = File::from_raw_fd(logpipe[0]); - let mut reader = BufReader::new(file); - let mut buffer = String::new(); - loop { - buffer.clear(); - if let Ok(len) = reader.read_line(&mut buffer) { - if len == 0 { - break; - } else if let Ok(msg) = CString::new(buffer.clone()) { - android_log(Level::Info, tag, &msg); - } - } - } - }); - - let looper_ready = Arc::new(Condvar::new()); - let signal_looper_ready = looper_ready.clone(); - - thread::spawn(move || { - let looper = ThreadLooper::prepare(); - let foreign = looper.into_foreign(); - foreign - .add_fd( - PIPE[0], - NDK_GLUE_LOOPER_EVENT_PIPE_IDENT, - FdEvent::INPUT, - std::ptr::null_mut(), - ) - .unwrap(); - - { - let mut locked_looper = LOOPER.lock().unwrap(); - locked_looper.replace(foreign); - signal_looper_ready.notify_one(); - } - - main() - }); - - // Don't return from this function (`ANativeActivity_onCreate`) until the thread - // has created its `ThreadLooper` and assigned it to the static `LOOPER` - // variable. It will be used from `on_input_queue_created` as soon as this - // function returns. - let locked_looper = LOOPER.lock().unwrap(); - let _mutex_guard = looper_ready - .wait_while(locked_looper, |looper| looper.is_none()) - .unwrap(); -} - -unsafe extern "C" fn on_start(activity: *mut ANativeActivity) { - wake(activity, Event::Start); -} - -unsafe extern "C" fn on_resume(activity: *mut ANativeActivity) { - wake(activity, Event::Resume); -} - -unsafe extern "C" fn on_save_instance_state( - activity: *mut ANativeActivity, - _out_size: *mut ndk_sys::size_t, -) -> *mut raw::c_void { - // TODO - wake(activity, Event::SaveInstanceState); - std::ptr::null_mut() -} - -unsafe extern "C" fn on_pause(activity: *mut ANativeActivity) { - wake(activity, Event::Pause); -} - -unsafe extern "C" fn on_stop(activity: *mut ANativeActivity) { - wake(activity, Event::Stop); -} - -unsafe extern "C" fn on_destroy(activity: *mut ANativeActivity) { - wake(activity, Event::Destroy); - ndk_context::release_android_context(); - let mut native_activity_guard = NATIVE_ACTIVITY.write(); - let native_activity = native_activity_guard.take().unwrap(); - assert_eq!(native_activity.ptr().as_ptr(), activity); -} - -unsafe extern "C" fn on_configuration_changed(activity: *mut ANativeActivity) { - wake(activity, Event::ConfigChanged); -} - -unsafe extern "C" fn on_low_memory(activity: *mut ANativeActivity) { - wake(activity, Event::LowMemory); -} - -unsafe extern "C" fn on_window_focus_changed( - activity: *mut ANativeActivity, - has_focus: raw::c_int, -) { - let event = if has_focus == 0 { - Event::WindowLostFocus - } else { - Event::WindowHasFocus - }; - wake(activity, event); -} - -unsafe extern "C" fn on_window_created(activity: *mut ANativeActivity, window: *mut ANativeWindow) { - NATIVE_WINDOW - .write() - .replace(NativeWindow::clone_from_ptr(NonNull::new(window).unwrap())); - wake(activity, Event::WindowCreated); -} - -unsafe extern "C" fn on_window_resized( - activity: *mut ANativeActivity, - _window: *mut ANativeWindow, -) { - wake(activity, Event::WindowResized); -} - -unsafe extern "C" fn on_window_redraw_needed( - activity: *mut ANativeActivity, - _window: *mut ANativeWindow, -) { - wake(activity, Event::WindowRedrawNeeded); -} - -unsafe extern "C" fn on_window_destroyed( - activity: *mut ANativeActivity, - window: *mut ANativeWindow, -) { - wake(activity, Event::WindowDestroyed); - let mut native_window_guard = NATIVE_WINDOW.write(); - assert_eq!(native_window_guard.as_ref().unwrap().ptr().as_ptr(), window); - native_window_guard.take(); -} - -unsafe extern "C" fn on_input_queue_created( - activity: *mut ANativeActivity, - queue: *mut AInputQueue, -) { - let input_queue = InputQueue::from_ptr(NonNull::new(queue).unwrap()); - let locked_looper = LOOPER.lock().unwrap(); - // The looper should always be `Some` after `fn init()` returns, unless - // future code cleans it up and sets it back to `None` again. - let looper = locked_looper.as_ref().expect("Looper does not exist"); - input_queue.attach_looper(looper, NDK_GLUE_LOOPER_INPUT_QUEUE_IDENT); - INPUT_QUEUE.write().replace(input_queue); - wake(activity, Event::InputQueueCreated); -} - -unsafe extern "C" fn on_input_queue_destroyed( - activity: *mut ANativeActivity, - queue: *mut AInputQueue, -) { - wake(activity, Event::InputQueueDestroyed); - let mut input_queue_guard = INPUT_QUEUE.write(); - let input_queue = input_queue_guard.take().unwrap(); - assert_eq!(input_queue.ptr().as_ptr(), queue); - input_queue.detach_looper(); -} - -unsafe extern "C" fn on_content_rect_changed(activity: *mut ANativeActivity, rect: *const ARect) { - let rect = Rect { - left: (*rect).left as _, - top: (*rect).top as _, - right: (*rect).right as _, - bottom: (*rect).bottom as _, - }; - *CONTENT_RECT.write() = rect; - wake(activity, Event::ContentRectChanged); -} diff --git a/ndk-macro/CHANGELOG.md b/ndk-macro/CHANGELOG.md deleted file mode 100644 index d4521b36..00000000 --- a/ndk-macro/CHANGELOG.md +++ /dev/null @@ -1,15 +0,0 @@ -# Unreleased - -# 0.3.0 (2021-11-22) - -- **Breaking:** Removed `android_logger` and `log` crate path overrides from macro input attributes in favour of using the reexports from `ndk-glue`. - Applications no longer have to provide these crates in scope of the `ndk_glue::main` macro when logging is enabled. - -# 0.2.0 (2020-09-15) - -- Added crate name override option -- **Breaking:** Changed macro attribute syntax - -# 0.1.0 (2020-07-29) - -- Initial release! 🎉 diff --git a/ndk-macro/Cargo.toml b/ndk-macro/Cargo.toml deleted file mode 100644 index af0cc8db..00000000 --- a/ndk-macro/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "ndk-macro" -version = "0.3.0" -authors = ["The Rust Windowing contributors"] -edition = "2018" -description = "Helper macros for android ndk" -license = "MIT OR Apache-2.0" -keywords = ["android", "ndk"] -readme = "README.md" -documentation = "https://docs.rs/ndk-macro" -homepage = "https://github.com/rust-windowing/android-ndk-rs" -repository = "https://github.com/rust-windowing/android-ndk-rs" -rust-version = "1.60" - -[lib] -proc-macro = true - -[dependencies] -proc-macro2 = "1.0.24" -proc-macro-crate = "1.0" -quote = "1.0.8" -syn = { version = "1.0.60", features = ["full"] } -darling = "0.14" - -[features] -default = [] -logger = [] - -[package.metadata.docs.rs] -rustdoc-args = ["--cfg", "docsrs"] diff --git a/ndk-macro/README.md b/ndk-macro/README.md deleted file mode 100644 index d09671f3..00000000 --- a/ndk-macro/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# ndk-macro - -Implementation of the attribute procedural macro `main` which applied directly to main function. - -This macro is re-exported in `ndk-glue`. Typically, it's not needed to depend on this library directly! - -## Usage -```Rust -#[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] -pub fn main() { - println!("hello world"); -} -``` - -The attribute macro supports optional input attributes: - -- `backtrace = "on|full"`: Enables backtraces by setting the `RUST_BACKTRACE` env var -- `ndk_glue = "path::to::ndk_glue"`: Overrides default path to __ndk_glue__ crate -- `logger(...props)`: Configures android logger with the passed configuration (requires the `logger` feature): - - `level = "error|warn|info|debug|trace"`: Changes log level for logger - - `tag = "my-tag"`: Assigns tag to logger - - `filter = "filtering-rules"`: Changes default filtering rules diff --git a/ndk-macro/src/expand.rs b/ndk-macro/src/expand.rs deleted file mode 100644 index 28df80ce..00000000 --- a/ndk-macro/src/expand.rs +++ /dev/null @@ -1,503 +0,0 @@ -use core::iter::once; -use proc_macro2::TokenStream; -use quote::{quote, ToTokens}; -use syn::ItemFn; - -use crate::{ - helper::crate_path, - parse::{BacktraceProp, MainAttr}, -}; - -impl ToTokens for BacktraceProp { - fn to_tokens(&self, tokens: &mut TokenStream) { - use BacktraceProp::*; - - let prop = match self { - On => Some(quote! { "1" }), - Full => Some(quote! { "full" }), - }; - - tokens.extend(quote! { - std::env::set_var("RUST_BACKTRACE", #prop); - }); - } -} - -#[cfg(feature = "logger")] -mod logger { - use super::*; - use crate::parse::{LogLevel, LoggerProp}; - use syn::Path; - - impl LoggerProp { - pub(crate) fn expand(&self, glue_crate: &Path) -> TokenStream { - let mut withs = Vec::new(); - - if let Some(tag) = &self.tag { - withs.push(quote! { with_tag(#tag) }); - } - if let Some(level) = &self.level { - withs.push(quote! { with_min_level(#glue_crate::log::Level::#level) }); - } - if let Some(filter) = &self.filter { - withs.push(quote! { - with_filter(#glue_crate::android_logger::FilterBuilder::new().parse(#filter).build()) - }); - } - - quote! { - #glue_crate::android_logger::init_once( - #glue_crate::android_logger::Config::default() - #(.#withs)* - ); - } - } - } - - impl ToTokens for LogLevel { - fn to_tokens(&self, tokens: &mut TokenStream) { - use LogLevel::*; - - tokens.extend(match self { - Error => quote! { Error }, - Warn => quote! { Warn }, - Info => quote! { Info }, - Debug => quote! { Debug }, - Trace => quote! { Trace }, - }); - } - } -} - -impl MainAttr { - pub fn expand(&self, main_fn_item: &ItemFn) -> TokenStream { - let main_fn_name = &main_fn_item.sig.ident; - let glue_crate = crate_path("ndk-glue", &self.ndk_glue); - - let preamble = { - let backtrace = &self.backtrace; - once(quote! { #backtrace }) - }; - - #[cfg(feature = "logger")] - let preamble = preamble.chain( - self.logger - .as_ref() - .map(|l| l.expand(&glue_crate)) - .into_iter(), - ); - - quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - #(#preamble)* - #glue_crate::init( - activity as _, - saved_state as _, - saved_state_size as _, - #main_fn_name, - ); - } - - #main_fn_item - } - } -} - -#[cfg(test)] -mod test { - use crate::parse::{BacktraceProp, MainAttr}; - use quote::quote; - use syn::parse_quote; - - #[test] - fn main_without_props() { - let attr = MainAttr::default(); - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_backtrace_on() { - let attr = MainAttr { - backtrace: Some(BacktraceProp::On), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - std::env::set_var("RUST_BACKTRACE", "1"); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_backtrace_full() { - let attr = MainAttr { - backtrace: Some(BacktraceProp::Full), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - std::env::set_var("RUST_BACKTRACE", "full"); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_overridden_ndk_glue() { - let attr = MainAttr { - ndk_glue: Some(parse_quote! { my::re::exported::ndk_glue }), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - my::re::exported::ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[cfg(feature = "logger")] - mod logger { - use super::*; - use crate::parse::{LogLevel, LoggerProp}; - - #[test] - fn main_with_logger_default() { - let attr = MainAttr { - logger: Some(LoggerProp::default()), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - ndk_glue::android_logger::init_once( - ndk_glue::android_logger::Config::default() - ); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_logger_with_min_level() { - let attr = MainAttr { - logger: Some(LoggerProp { - level: Some(LogLevel::Debug), - ..Default::default() - }), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - ndk_glue::android_logger::init_once( - ndk_glue::android_logger::Config::default() - .with_min_level(ndk_glue::log::Level::Debug) - ); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_logger_with_tag() { - let attr = MainAttr { - logger: Some(LoggerProp { - tag: Some("my-tag".into()), - ..Default::default() - }), - ..Default::default() - }; - let item = parse_quote! { fn my_main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - ndk_glue::android_logger::init_once( - ndk_glue::android_logger::Config::default() - .with_tag("my-tag") - ); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - my_main, - ); - } - fn my_main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_logger_with_filter() { - let attr = MainAttr { - logger: Some(LoggerProp { - filter: Some("debug,hellow::world=trace".into()), - ..Default::default() - }), - ..Default::default() - }; - let item = parse_quote! { fn my_main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - ndk_glue::android_logger::init_once( - ndk_glue::android_logger::Config::default() - .with_filter(ndk_glue::android_logger::FilterBuilder::new().parse("debug,hellow::world=trace").build()) - ); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - my_main, - ); - } - fn my_main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_logger_with_min_level_and_with_tag() { - let attr = MainAttr { - logger: Some(LoggerProp { - level: Some(LogLevel::Warn), - tag: Some("my-tag".into()), - ..Default::default() - }), - ..Default::default() - }; - let item = parse_quote! { fn my_main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - ndk_glue::android_logger::init_once( - ndk_glue::android_logger::Config::default() - .with_tag("my-tag") - .with_min_level(ndk_glue::log::Level::Warn) - ); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - my_main, - ); - } - fn my_main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_backtrace_on_and_logger_with_tag() { - let attr = MainAttr { - backtrace: Some(BacktraceProp::On), - logger: Some(LoggerProp { - tag: Some("my-tag".into()), - ..Default::default() - }), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - std::env::set_var("RUST_BACKTRACE", "1"); - ndk_glue::android_logger::init_once( - ndk_glue::android_logger::Config::default() - .with_tag("my-tag") - ); - ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_logger_with_overridden_ndk_glue_and_filter() { - let attr = MainAttr { - logger: Some(LoggerProp { - filter: Some("debug,hellow::world=trace".into()), - ..Default::default() - }), - ndk_glue: Some(parse_quote! { my::re::exported::ndk_glue }), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - my::re::exported::ndk_glue::android_logger::init_once( - my::re::exported::ndk_glue::android_logger::Config::default() - .with_filter(my::re::exported::ndk_glue::android_logger::FilterBuilder::new().parse("debug,hellow::world=trace").build()) - ); - my::re::exported::ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - - #[test] - fn main_with_logger_with_overridden_ndk_glue_and_log_level() { - let attr = MainAttr { - logger: Some(LoggerProp { - level: Some(LogLevel::Trace), - ..Default::default() - }), - ndk_glue: Some(parse_quote! { my::re::exported::ndk_glue }), - ..Default::default() - }; - let item = parse_quote! { fn main() {} }; - let actual = attr.expand(&item); - let expected = quote! { - #[no_mangle] - unsafe extern "C" fn ANativeActivity_onCreate( - activity: *mut std::os::raw::c_void, - saved_state: *mut std::os::raw::c_void, - saved_state_size: usize, - ) { - my::re::exported::ndk_glue::android_logger::init_once( - my::re::exported::ndk_glue::android_logger::Config::default() - .with_min_level(my::re::exported::ndk_glue::log::Level::Trace) - ); - my::re::exported::ndk_glue::init( - activity as _, - saved_state as _, - saved_state_size as _, - main, - ); - } - fn main() {} - }; - assert_eq!(actual.to_string(), expected.to_string()); - } - } -} diff --git a/ndk-macro/src/helper.rs b/ndk-macro/src/helper.rs deleted file mode 100644 index caf53bf9..00000000 --- a/ndk-macro/src/helper.rs +++ /dev/null @@ -1,66 +0,0 @@ -use core::ops::Deref; -use proc_macro2::{Ident, Span}; -use proc_macro_crate::FoundCrate; -use syn::{ - parse::{Parse, ParseStream, Result}, - Path, Token, -}; - -/// A newtype for testing -/// -/// This needed because AttributeArgs from syn crate is not a newtype and does not implements `Parse` trait -#[derive(Debug)] -pub struct AttributeArgs(syn::AttributeArgs); - -impl Deref for AttributeArgs { - type Target = syn::AttributeArgs; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl Parse for AttributeArgs { - fn parse(input: ParseStream) -> Result { - let mut metas = Vec::new(); - - loop { - if input.is_empty() { - break; - } - let value = input.parse()?; - metas.push(value); - if input.is_empty() { - break; - } - input.parse::()?; - } - - Ok(Self(metas)) - } -} - -#[cfg(not(test))] -use proc_macro_crate::crate_name; - -#[cfg(test)] -fn crate_name(name: &str) -> Result { - Ok(FoundCrate::Name(name.replace('-', "_"))) -} - -pub fn crate_path(name: &str, overridden_path: &Option) -> Path { - // try to use overridden crate path - overridden_path.clone().unwrap_or_else(|| { - Ident::new( - // try to determine crate name from Cargo.toml - match crate_name(name) - .as_ref() - .expect("Crate not found in `Cargo.toml`") - { - FoundCrate::Itself => "ndk_macro", - FoundCrate::Name(n) => n.as_str(), - }, - Span::call_site(), - ) - .into() - }) -} diff --git a/ndk-macro/src/lib.rs b/ndk-macro/src/lib.rs deleted file mode 100644 index 19daf679..00000000 --- a/ndk-macro/src/lib.rs +++ /dev/null @@ -1,24 +0,0 @@ -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] - -use darling::FromMeta; -use proc_macro::TokenStream; -use syn::{parse_macro_input, ItemFn}; - -mod expand; -mod helper; -mod parse; - -use helper::AttributeArgs; -use parse::MainAttr; - -#[proc_macro_attribute] -pub fn main(attr_input: TokenStream, item_input: TokenStream) -> TokenStream { - let item_ast = parse_macro_input!(item_input as ItemFn); - let attr_ast = parse_macro_input!(attr_input as AttributeArgs); - let attr: MainAttr = match FromMeta::from_list(&attr_ast) { - Ok(attr) => attr, - Err(errs) => return TokenStream::from(errs.write_errors()), - }; - - attr.expand(&item_ast).into() -} diff --git a/ndk-macro/src/parse.rs b/ndk-macro/src/parse.rs deleted file mode 100644 index 70d0cd55..00000000 --- a/ndk-macro/src/parse.rs +++ /dev/null @@ -1,197 +0,0 @@ -use darling::FromMeta; -use syn::Path; - -#[cfg(feature = "logger")] -pub use logger::{LogLevel, LoggerProp}; - -#[derive(Default, FromMeta, Debug)] -#[darling(default)] -pub struct MainAttr { - pub backtrace: Option, - // Path to `ndk_glue` to override - pub ndk_glue: Option, - #[cfg(feature = "logger")] - pub logger: Option, -} - -#[derive(FromMeta, PartialEq, Eq, Debug, Clone, Copy)] -#[darling(default)] -pub enum BacktraceProp { - On, - Full, -} - -impl Default for BacktraceProp { - fn default() -> Self { - BacktraceProp::On - } -} - -#[cfg(feature = "logger")] -mod logger { - use super::*; - - #[derive(FromMeta, PartialEq, Eq, Default, Debug, Clone)] - #[darling(default)] - pub struct LoggerProp { - // Minimum log level - pub level: Option, - // Tag name for logger - pub tag: Option, - // Filtering rules - pub filter: Option, - } - - #[derive(FromMeta, PartialEq, Eq, Debug, Clone, Copy)] - #[darling(default)] - pub enum LogLevel { - Error, - Warn, - Info, - Debug, - Trace, - } - - impl Default for LogLevel { - fn default() -> Self { - LogLevel::Error - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::AttributeArgs; - use syn::parse_quote; - - #[test] - fn empty_attr() { - let attr: AttributeArgs = parse_quote! {}; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - assert_eq!(attr.backtrace, None); - #[cfg(feature = "logger")] - assert_eq!(attr.logger, None); - } - - #[should_panic] - #[test] - fn invalid_attr() { - let attr: AttributeArgs = parse_quote! { - wrong - }; - let _attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - } - - #[test] - fn backtrace_on() { - let attr: AttributeArgs = parse_quote! { - backtrace = "on" - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - assert_eq!(attr.backtrace, Some(BacktraceProp::On)); - #[cfg(feature = "logger")] - assert_eq!(attr.logger, None); - } - - #[test] - fn backtrace_full() { - let attr: AttributeArgs = parse_quote! { - backtrace = "full" - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - assert_eq!(attr.backtrace, Some(BacktraceProp::Full)); - #[cfg(feature = "logger")] - assert_eq!(attr.logger, None); - } - - #[test] - fn overridden_ndk_glue() { - let attr: AttributeArgs = parse_quote! { - ndk_glue = "my::re::exported::ndk_glue" - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - let expected_path: Path = parse_quote! { - my::re::exported::ndk_glue - }; - - assert_eq!(attr.ndk_glue.unwrap(), expected_path); - } - - #[cfg(feature = "logger")] - mod logger { - use super::*; - - #[test] - fn logger_with_level() { - let attr: AttributeArgs = parse_quote! { - logger(level = "debug") - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - let logger = attr.logger.unwrap(); - - assert_eq!(logger.level, Some(LogLevel::Debug)); - assert_eq!(logger.tag, None); - } - - #[test] - fn logger_with_tag() { - let attr: AttributeArgs = parse_quote! { - logger(tag = "my-tag") - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - let logger = attr.logger.unwrap(); - - assert_eq!(logger.level, None); - assert_eq!(logger.tag.unwrap(), "my-tag"); - } - - #[test] - fn logger_with_filter() { - let attr: AttributeArgs = parse_quote! { - logger(filter = "debug,hello::world=trace") - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - let logger = attr.logger.unwrap(); - - assert_eq!(logger.level, None); - assert_eq!(logger.filter.unwrap(), "debug,hello::world=trace"); - } - - #[test] - fn logger_with_level_and_with_tag() { - let attr: AttributeArgs = parse_quote! { - logger(level = "error", tag = "my-app") - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - let logger = attr.logger.unwrap(); - - assert_eq!(logger.level, Some(LogLevel::Error)); - assert_eq!(logger.tag.unwrap(), "my-app"); - } - - #[test] - fn backtrace_on_and_logger_with_level_and_with_tag() { - let attr: AttributeArgs = parse_quote! { - logger(level = "warn", tag = "my-app"), - backtrace = "on" - }; - let attr: MainAttr = FromMeta::from_list(&attr).unwrap(); - - assert_eq!(attr.backtrace, Some(BacktraceProp::On)); - - let logger = attr.logger.unwrap(); - - assert_eq!(logger.level, Some(LogLevel::Warn)); - assert_eq!(logger.tag.unwrap(), "my-app"); - } - } -}