UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AndroidWindow.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8#include <android/native_window.h>
9#if USE_ANDROID_JNI
10#include <android/native_window_jni.h>
11#endif
12#include "Async/SharedMutex.h"
13#include "Async/Mutex.h"
14#include "Async/UniqueLock.h"
15
21class FAndroidWindow : public FGenericWindow, public TSharedFromThis<FAndroidWindow>
22{
23public:
25
32
33 APPLICATIONCORE_API virtual void Destroy() override;
34
35 virtual void* GetOSWindowHandle() const override { return (void*) this; }
36
38
40 APPLICATIONCORE_API virtual bool GetFullScreenInfo( int32& X, int32& Y, int32& Width, int32& Height ) const override;
41
42 APPLICATIONCORE_API virtual void SetOSWindowHandle(void*);
43
46
47 // When bUseEventThreadWindow == false this uses dimensions cached when the game thread processes android events.
48 // When bUseEventThreadWindow == true this uses dimensions directly from the android event thread, unless called from event thread this requires acquiring GAndroidWindowLock to use.
51
53
56
57 // This returns the current hardware window as set from the event thread.
60
65
68
69 // called by the Android event thread to initially set the current window dimensions.
71
72 // Called by the event manager to update the cached window dimensions to match the event it is processing.
74
76
78
80 {
81 bool bWriteAccess;
82 class FAndroidWindow* ProtectedObj = nullptr;
84 public:
86 {
87 ProtectedObj = obj.ProtectedObj;
88 bWriteAccess = obj.bWriteAccess;
89 obj.ProtectedObj = nullptr;
90 }
91
94 {
95 if (bWriteAccess)
96 {
97 ProtectedObj->ANativeHandleMutex.Lock();
98 }
99 else
100 {
101 ProtectedObj->ANativeHandleMutex.LockShared();
102 }
103 }
104
106 {
107 if(ProtectedObj)
108 {
109 if (bWriteAccess)
110 {
111 ProtectedObj->ANativeHandleMutex.Unlock();
112 }
113 else
114 {
115 ProtectedObj->ANativeHandleMutex.UnlockShared();
116 }
117 }
118 }
119
120 FAndroidWindow* Get() { return ProtectedObj; }
121 const FAndroidWindow* Get() const { return ProtectedObj; }
122
124 const FAndroidWindow* operator ->() const { return Get(); }
125
127 {
128 check(bWriteAccess);
129 ProtectedObj->PreviousANativeHandle = ProtectedObj->CurrentANativeHandle;
130 ProtectedObj->CurrentANativeHandle = ANativeHandle;
131 }
132 ANativeWindow* GetANativeWindow() const { return ProtectedObj->CurrentANativeHandle; }
133 ANativeWindow* GetPreviousANativeWindow() const { return ProtectedObj->PreviousANativeHandle; }
134 };
135
137 {
138 return FNativeAccessor(bWriteAccess, this);
139 }
140
141protected:
143 virtual EWindowMode::Type GetWindowMode() const override { return WindowMode; }
144
145private:
146 ANativeWindow* CurrentANativeHandle = nullptr;
147 ANativeWindow* PreviousANativeHandle = nullptr;
148 UE::FSharedMutex ANativeHandleMutex;
150
155
156 FAndroidApplication* OwningApplication;
157
158 static APPLICATIONCORE_API void* NativeWindow;
159
160 // Waits for the event thread to report an initial window size.
161 static APPLICATIONCORE_API bool WaitForWindowDimensions();
162
163 static APPLICATIONCORE_API bool bAreCachedNativeDimensionsValid;
164 static APPLICATIONCORE_API int32 CachedNativeWindowWidth;
165 static APPLICATIONCORE_API int32 CachedNativeWindowHeight;
166
168};
169
171{
172 friend class FAndroidWindow;
173
174public:
175
177 {
179 return Single;
180 }
181
183 {
184 UE::TUniqueLock Lock(WindowManagerLock);
185 if (Windows.IsEmpty())
186 {
188 }
189
190 FAndroidWindow::FNativeAccessor Accessor = Windows[0]->GetANativeAccessor(bWriteAccess);
192 }
193
194
209
210 // Android native window handling.
211 // this is used to collect the native window before the game has created its own FAndroidWindow.
213 {
214 static inline ANativeWindow* PendingANativeWindow = nullptr;
215 static inline UE::FMutex Lock;
218 public:
221
223 ANativeWindow* GetANativeWindow() const { return PendingANativeWindow; }
224 };
225
230
231private:
233
234 int AddWindow(TSharedRef<FAndroidWindow> AddMe)
235 {
236 UE::TUniqueLock Lock(WindowManagerLock);
237 Windows.Add(AddMe);
238 return Windows.Num();
239 }
240
241 void RemoveWindow(TSharedRef<FAndroidWindow> RemoveMe)
242 {
243 UE::TUniqueLock Lock(WindowManagerLock);
244 Windows.Remove(RemoveMe);
245 }
246
247 mutable UE::FMutex WindowManagerLock;
248};
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47
EDeviceScreenOrientation
Definition GenericPlatformMisc.h:236
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
Definition AndroidApplication.h:30
Definition AndroidWindow.h:213
FPendingWindowAccessor()
Definition AndroidWindow.h:219
~FPendingWindowAccessor()
Definition AndroidWindow.h:220
void SetANativeWindow(ANativeWindow *ANativeHandle)
Definition AndroidWindow.h:222
ANativeWindow * GetANativeWindow() const
Definition AndroidWindow.h:223
Definition AndroidWindow.h:171
TOptional< FAndroidWindow::FNativeAccessor > FindFromANativeWindow(bool bWriteAccess, bool bSearchPrevious, const void *SearchANativeHandle)
Definition AndroidWindow.h:195
TOptional< FAndroidWindow::FNativeAccessor > GetMainWindowAsNativeAccessor(bool bWriteAccess)
Definition AndroidWindow.h:182
static FPendingWindowAccessor GetPendingWindowAccessor()
Definition AndroidWindow.h:226
static FAndroidWindowManager & Get()
Definition AndroidWindow.h:176
Definition AndroidWindow.h:80
ANativeWindow * GetPreviousANativeWindow() const
Definition AndroidWindow.h:133
FAndroidWindow * Get()
Definition AndroidWindow.h:120
ANativeWindow * GetANativeWindow() const
Definition AndroidWindow.h:132
FNativeAccessor(const FNativeAccessor &)=delete
~FNativeAccessor()
Definition AndroidWindow.h:105
void SetANativeWindow(ANativeWindow *ANativeHandle)
Definition AndroidWindow.h:126
const FAndroidWindow * Get() const
Definition AndroidWindow.h:121
FAndroidWindow * operator->()
Definition AndroidWindow.h:123
FNativeAccessor(bool bWriteAccessIn, FAndroidWindow *ProtectedObjIn)
Definition AndroidWindow.h:93
FNativeAccessor(FNativeAccessor &&obj)
Definition AndroidWindow.h:85
Definition AndroidWindow.h:22
static APPLICATIONCORE_API FVector4 GetSafezone(bool bPortrait)
Definition AndroidWindow.cpp:217
static APPLICATIONCORE_API void EventManagerUpdateWindowDimensions(int32 Width, int32 Height)
Definition AndroidWindow.cpp:377
static APPLICATIONCORE_API void SetHardwareWindow_EventThread(void *InWindow)
Definition AndroidWindow.cpp:295
static APPLICATIONCORE_API void CalculateSurfaceSize(int32_t &SurfaceWidth, int32_t &SurfaceHeight, bool bUseEventThreadWindow=false)
Definition AndroidWindow.cpp:648
virtual EWindowMode::Type GetWindowMode() const override
Definition AndroidWindow.h:143
virtual APPLICATIONCORE_API void SetOSWindowHandle(void *)
Definition AndroidWindow.cpp:154
static APPLICATIONCORE_API void AcquireWindowRef(ANativeWindow *InWindow)
Definition AndroidWindow.cpp:232
static APPLICATIONCORE_API bool OnWindowOrientationChanged(EDeviceScreenOrientation DeviceScreenOrientation)
Definition AndroidWindow.cpp:707
static APPLICATIONCORE_API int32 GetDepthBufferPreference()
Definition AndroidWindow.cpp:222
virtual APPLICATIONCORE_API bool GetFullScreenInfo(int32 &X, int32 &Y, int32 &Width, int32 &Height) const override
Definition AndroidWindow.cpp:141
static APPLICATIONCORE_API void SetWindowDimensions_EventThread(ANativeWindow *DimensionWindow)
Definition AndroidWindow.cpp:356
static APPLICATIONCORE_API void ReleaseWindowRef(ANativeWindow *InWindow)
Definition AndroidWindow.cpp:272
static APPLICATIONCORE_API bool IsPortraitOrientation()
Definition AndroidWindow.cpp:212
APPLICATIONCORE_API ~FAndroidWindow()
Definition AndroidWindow.cpp:103
virtual void * GetOSWindowHandle() const override
Definition AndroidWindow.h:35
static APPLICATIONCORE_API FPlatformRect GetScreenRect(bool bUseEventThreadWindow=false)
Definition AndroidWindow.cpp:537
FNativeAccessor GetANativeAccessor(bool bWriteAccess)
Definition AndroidWindow.h:136
virtual APPLICATIONCORE_API void Destroy() override
Definition AndroidWindow.cpp:130
static APPLICATIONCORE_API TSharedRef< FAndroidWindow > Make()
Definition AndroidWindow.cpp:108
virtual void SetWindowMode(EWindowMode::Type InNewWindowMode)
Definition AndroidWindow.h:77
APPLICATIONCORE_API bool GetNativeWindowResolution(int32_t &OutWidth, int32_t &OutHeight) const
Definition AndroidWindow.cpp:404
static APPLICATIONCORE_API void * WaitForHardwareWindow()
Definition AndroidWindow.cpp:426
static APPLICATIONCORE_API void InvalidateCachedScreenRect()
Definition AndroidWindow.cpp:227
static APPLICATIONCORE_API void * GetHardwareWindow_EventThread()
Definition AndroidWindow.cpp:314
Definition GenericWindow.h:94
Definition Array.h:670
Definition SharedPointer.h:1640
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition Mutex.h:18
Definition SharedMutex.h:22
void LockShared()
Definition SharedMutex.h:83
void Lock()
Definition SharedMutex.h:42
void Unlock()
Definition SharedMutex.h:52
void UnlockShared()
Definition SharedMutex.h:95
Definition UniqueLock.h:20
Type
Definition GenericWindow.h:17
@ Fullscreen
Definition GenericWindow.h:19
Definition MinimalWindowsApi.h:62
Definition GenericApplication.h:320
Definition Optional.h:131