tirbofish/dropbear · commit
2c8c840f755bd7d53291b9c21e2b7d99afa1e998
fix: scene load error Unverified
@@ -288,10 +288,11 @@ pub mod jni { mut env: JNIEnv, _: JClass, command_buffer_ptr: jlong, + scene_loader_handle: jlong, scene_id: jlong, ) { let command_buffer = convert_ptr!(command_buffer_ptr, CommandBufferPtr => crossbeam_channel::Sender<CommandBuffer>); - let scene_loader = convert_ptr!(scene_id as SceneLoaderPtr => parking_lot::Mutex<crate::scene::loading::SceneLoader>); + let scene_loader = convert_ptr!(scene_loader_handle, SceneLoaderPtr => parking_lot::Mutex<crate::scene::loading::SceneLoader>); if let Err(e) = super::shared::switch_to_scene_async(command_buffer, scene_loader, scene_id as u64) { eprintln!("Failed to switch scene async: {}", e); @@ -355,6 +355,19 @@ macro_rules! convert_ptr { return $crate::ffi_error_return!("{}", message); } + let addr = ptr as usize; + let align = std::mem::align_of::<$target_ty>(); + if addr % align != 0 { + let message = format!( + "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}", + std::any::type_name::<$target_ty>(), + stringify!($ptr), + addr, + align + ); + return $crate::ffi_error_return!("{}", message); + } + unsafe { &mut *(ptr as *mut $target_ty) } }}; @@ -368,6 +381,19 @@ macro_rules! convert_ptr { ); return $crate::ffi_error_return!("{}", message); } + + let addr = ptr as usize; + let align = std::mem::align_of::<$target_ty>(); + if addr % align != 0 { + let message = format!( + "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}", + std::any::type_name::<$target_ty>(), + stringify!($ptr), + addr, + align + ); + return $crate::ffi_error_return!("{}", message); + } unsafe { &mut *ptr } }}; @@ -381,6 +407,19 @@ macro_rules! convert_ptr { ); return $crate::ffi_error_return!("{}", message); } + + let addr = ptr as usize; + let align = std::mem::align_of::<$target_ty>(); + if addr % align != 0 { + let message = format!( + "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}", + std::any::type_name::<$target_ty>(), + stringify!($ptr), + addr, + align + ); + return $crate::ffi_error_return!("{}", message); + } unsafe { &*(ptr as *const $target_ty) } }}; @@ -394,6 +433,19 @@ macro_rules! convert_ptr { ); return $crate::ffi_error_return!("{}", message); } + + let addr = ptr as usize; + let align = std::mem::align_of::<$target_ty>(); + if addr % align != 0 { + let message = format!( + "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}", + std::any::type_name::<$target_ty>(), + stringify!($ptr), + addr, + align + ); + return $crate::ffi_error_return!("{}", message); + } unsafe { &*ptr } }}; } @@ -9,7 +9,7 @@ public class SceneLoadHandleNative { } public static native String getSceneLoadHandleSceneName(long sceneLoaderHandle, long sceneId); - public static native void switchToSceneAsync(long commandBufferPtr, long sceneId); + public static native void switchToSceneAsync(long commandBufferPtr, long sceneLoaderHandle, long sceneId); public static native Progress getSceneLoadProgress(long sceneLoaderHandle, long sceneId); public static native int getSceneLoadStatus(long sceneLoaderHandle, long sceneId); } @@ -8,7 +8,11 @@ internal actual fun SceneLoadHandle.getSceneLoadHandleSceneName(id: Long): Strin } internal actual fun SceneLoadHandle.switchToSceneAsync() { - return SceneLoadHandleNative.switchToSceneAsync(DropbearEngine.native.commandBufferHandle, this.id) + return SceneLoadHandleNative.switchToSceneAsync( + DropbearEngine.native.commandBufferHandle, + DropbearEngine.native.sceneLoaderHandle, + this.id + ) } internal actual fun SceneLoadHandle.getSceneLoadProgress(): Progress {