diff options
-rw-r--r-- | ports/libsimpleservo/jniapi/src/lib.rs | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/ports/libsimpleservo/jniapi/src/lib.rs b/ports/libsimpleservo/jniapi/src/lib.rs index a79aa2a91b2..0f1d47916a8 100644 --- a/ports/libsimpleservo/jniapi/src/lib.rs +++ b/ports/libsimpleservo/jniapi/src/lib.rs @@ -16,6 +16,7 @@ use log::Level; use simpleservo::{self, gl_glue, ServoGlue, SERVO}; use simpleservo::{Coordinates, EventLoopWaker, HostTrait, InitOptions, VRInitOptions}; use std::os::raw::{c_char, c_int, c_void}; +use std::ptr::{null, null_mut}; use std::sync::Arc; use std::thread; @@ -508,19 +509,51 @@ fn initialize_android_glue(env: &JNIEnv, activity: JObject) { // From jni-rs to android_injected_glue - let mut app: ffi::android_app = unsafe { std::mem::zeroed() }; - let mut native_activity: ffi::ANativeActivity = unsafe { std::mem::zeroed() }; - - let clazz = Box::into_raw(Box::new(env.new_global_ref(activity).unwrap())); - native_activity.clazz = unsafe { (*clazz).as_obj().into_inner() as *mut c_void }; - - let vm = env.get_java_vm().unwrap().get_java_vm_pointer(); - native_activity.vm = vm as *mut ffi::_JavaVM; + let clazz = Box::leak(Box::new(env.new_global_ref(activity).unwrap())); + + let activity = Box::into_raw(Box::new(ffi::ANativeActivity { + clazz: clazz.as_obj().into_inner() as *mut c_void, + vm: env.get_java_vm().unwrap().get_java_vm_pointer() as *mut ffi::_JavaVM, + + callbacks: null_mut(), + env: null_mut(), + internalDataPath: null(), + externalDataPath: null(), + sdkVersion: 0, + instance: null_mut(), + assetManager: null_mut(), + obbPath: null(), + })); + + extern "C" fn on_app_cmd(_: *mut ffi::android_app, _: i32) {} + extern "C" fn on_input_event(_: *mut ffi::android_app, _: *const c_void) -> i32 { + 0 + } - app.activity = Box::into_raw(Box::new(native_activity)); + let app = Box::into_raw(Box::new(ffi::android_app { + activity, + onAppCmd: on_app_cmd, + onInputEvent: on_input_event, + + userData: null_mut(), + config: null(), + savedState: null_mut(), + savedStateSize: 0, + looper: null_mut(), + inputQueue: null(), + window: null_mut(), + contentRect: ffi::ARect { + left: 0, + top: 0, + right: 0, + bottom: 0, + }, + activityState: 0, + destroyRequested: 0, + })); unsafe { - ANDROID_APP = Box::into_raw(Box::new(app)); + ANDROID_APP = app; } } |