feat(android): wire Android Keystore JNI via OnceLock
Remove the dependency on bevy::android::ANDROID_APP inside android_keystore.rs. Instead, solitaire_data owns a process-wide OnceLock<JavaVM> initialised by a new pub fn init_android_jvm(). solitaire_app calls it from android_main before run() so JNI is ready before any auth-token operation can execute. - android_keystore: drop ANDROID_APP import; add ANDROID_JVM OnceLock and init_android_jvm(vm_ptr: *mut c_void) - solitaire_data/lib.rs: re-export init_android_jvm for android target - auth_tokens.rs: update doc comment (Android backend is now complete) - solitaire_app/lib.rs: call init_android_jvm from android_main Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -65,10 +65,9 @@ pub fn run() {
|
||||
// operations will fail gracefully with TokenError::KeychainUnavailable.
|
||||
//
|
||||
// Android: `keyring` isn't compiled in (its `rpassword` transitive
|
||||
// pulls a libc symbol Android's bionic doesn't expose). `auth_tokens`
|
||||
// ships an Android stub that returns KeychainUnavailable for every
|
||||
// call — the runtime behaviour is "session login required each launch"
|
||||
// until we wire Android Keystore via JNI in the Phase-Android round.
|
||||
// pulls a libc symbol Android's bionic doesn't expose). The Android
|
||||
// auth-token path uses Android Keystore via JNI; `android_main` passes
|
||||
// the process JavaVM pointer into `solitaire_data` before `run()`.
|
||||
#[cfg(not(target_os = "android"))]
|
||||
if let Err(e) = keyring::use_native_store(true) {
|
||||
eprintln!(
|
||||
@@ -366,6 +365,10 @@ fn set_window_icon(
|
||||
#[cfg(target_os = "android")]
|
||||
#[unsafe(no_mangle)]
|
||||
fn android_main(android_app: bevy::android::android_activity::AndroidApp) {
|
||||
let vm_ptr = android_app.vm_as_ptr().cast();
|
||||
if let Err(e) = solitaire_data::init_android_jvm(vm_ptr) {
|
||||
eprintln!("warn: could not initialise Android Keystore JNI ({e})");
|
||||
}
|
||||
let _ = bevy::android::ANDROID_APP.set(android_app);
|
||||
run();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user