feat(android): basic android support via winit native activity

This commit is contained in:
Chance 2025-04-17 23:04:24 -04:00
parent aa655a84d3
commit 766ed81987
Signed by: caznix
GPG key ID: 489D213143D753FD
3 changed files with 37 additions and 8 deletions

View file

@ -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"] }

1
src/lib.rs Normal file
View file

@ -0,0 +1 @@
include!("main.rs");

View file

@ -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(())
}