From e50409943c209d059ff1c50d5164de439aabf9df Mon Sep 17 00:00:00 2001 From: Chance Date: Thu, 17 Apr 2025 23:04:24 -0400 Subject: [PATCH] feat(android): basic android support via winit native activity --- Cargo.toml | 8 +++++++- src/lib.rs | 1 + src/main.rs | 36 +++++++++++++++++++++++++++++------- 3 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 76f6f84..7c423c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,9 @@ license = "MIT" homepage = "https://zenyx-engine.github.io/" repository = "https://codeberg.org/Caznix/Zenyx" +[lib] +crate-type = ["cdylib"] + [workspace] resolver = "2" members = ["subcrates/renderer", "subcrates/zlog"] @@ -42,6 +45,7 @@ cgmath = "0.18.0" image = "0.25.6" smol = "2.0.2" +winit = { version = "0.30.9" } terminator = "0.3.2" thiserror = "2.0.12" tobj = "4.0.3" @@ -49,5 +53,7 @@ tracing = "0.1.41" tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } vulkano = "0.35.1" wgpu = { version = "25.0.0", features = ["spirv"] } -winit = { version = "0.30.9", features = ["android-native-activity"] } zlog.workspace = true + +[target.aarch64-linux-android.dependencies] +winit = { version = "0.30.9", features = ["android-native-activity"] } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..d5be06a --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +include!("main.rs"); diff --git a/src/main.rs b/src/main.rs index dffe4bf..3a0f237 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,6 @@ +use bytemuck::bytes_of; use std::collections::BTreeMap; use std::sync::Arc; - -use bytemuck::bytes_of; use tracing::info; use wgpu::util::DeviceExt; use wgpu::{ @@ -11,6 +10,8 @@ use wgpu::{ use winit::application::ApplicationHandler; use winit::event::{ElementState, MouseButton}; use winit::event_loop::{ActiveEventLoop, EventLoop}; +#[cfg(target_os = "android")] +use winit::platform::android::activity::AndroidApp; use winit::window::{Window, WindowAttributes, WindowId}; use zlog::LogLevel; use zlog::config::LoggerConfig; @@ -493,8 +494,7 @@ impl ApplicationHandler for App<'_> { } } } - -fn main() -> Result<(), terminator::Terminator> { +pub fn main() -> Result<(), terminator::Terminator> { let config = LoggerConfig::default() .colored_stdout(true) .log_to_stdout(true) @@ -503,11 +503,33 @@ fn main() -> Result<(), terminator::Terminator> { .level(LogLevel::Info) .log_path("zenyx.log"); let _logger = zlog::Logger::new(config); - let event_loop = EventLoop::new()?; - event_loop.set_control_flow(winit::event_loop::ControlFlow::Poll); - + #[cfg(not(target_os = "android"))] + { + _main() + } +} +pub fn run_app(event_loop: winit::event_loop::EventLoop<()>) -> Result<(), terminator::Terminator> { let mut app = App::new(); + event_loop.set_control_flow(winit::event_loop::ControlFlow::Poll); event_loop.run_app(&mut app)?; + Ok(()) +} + +#[unsafe(no_mangle)] +#[cfg(target_os = "android")] +extern "C" fn android_main(app: AndroidApp) { + use winit::event_loop::EventLoopBuilder; + use winit::platform::android::EventLoopBuilderExtAndroid; + let event_loop = EventLoopBuilder::default() + .with_android_app(app) + .build() + .unwrap(); + run_app(event_loop).unwrap() +} + +fn _main() -> Result<(), terminator::Terminator> { + let event_loop = EventLoop::new()?; + run_app(event_loop)?; info!("Exiting..."); Ok(()) }