From: Twaik Yont <9674930+twaik@users.noreply.github.com> Move AHardwareBuffer symbol loading into load_android_libs() and drop the separate init_ahardwarebuffers() path. libandroid is part of the public NDK API surface, so both the library itself and the AHardwareBuffer interfaces it provides are expected to be available on all supported Android systems. Load these symbols together with the rest of the Android APIs instead of treating them as an optional or separately initialized component. This simplifies initialization and removes redundant code paths. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- dlls/wineandroid.drv/android.h | 15 ++++++++++- dlls/wineandroid.drv/device.c | 49 ++-------------------------------- dlls/wineandroid.drv/init.c | 25 ++++++++++++++--- 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 8aee7b22406..0bd25de8e9e 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -46,6 +46,20 @@ DECL_FUNCPTR( __android_log_print ); DECL_FUNCPTR( ANativeWindow_fromSurface ); DECL_FUNCPTR( ANativeWindow_release ); + +#ifdef __ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ +extern struct AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(struct ANativeWindowBuffer* anwb) __INTRODUCED_IN(26); + +DECL_FUNCPTR( AHardwareBuffer_describe ); +DECL_FUNCPTR( AHardwareBuffer_acquire ); +DECL_FUNCPTR( AHardwareBuffer_release ); +DECL_FUNCPTR( AHardwareBuffer_lock ); +DECL_FUNCPTR( AHardwareBuffer_unlock ); +DECL_FUNCPTR( AHardwareBuffer_recvHandleFromUnixSocket ); +DECL_FUNCPTR( AHardwareBuffer_sendHandleToUnixSocket ); +DECL_FUNCPTR( ANativeWindowBuffer_getHardwareBuffer ); +#endif + #undef DECL_FUNCPTR @@ -119,7 +133,6 @@ enum android_window_messages WM_ANDROID_REFRESH = WM_WINE_FIRST_DRIVER_MSG, }; -extern void init_ahardwarebuffers(void); extern HWND get_capture_window(void); extern void init_monitors( int width, int height ); extern void set_screen_dpi( DWORD dpi ); diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index b04210bc7fe..570aab818ab 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -22,10 +22,10 @@ #pragma makedep unix #endif -#include "config.h" - #define __ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ +#include "config.h" + #include <assert.h> #include <errno.h> #include <stdio.h> @@ -48,19 +48,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(android); -#define DECL_FUNCPTR(f) static typeof(f) * p##f = NULL - -struct AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(struct ANativeWindowBuffer* anwb) __INTRODUCED_IN(26); - -DECL_FUNCPTR( AHardwareBuffer_describe ); -DECL_FUNCPTR( AHardwareBuffer_acquire ); -DECL_FUNCPTR( AHardwareBuffer_release ); -DECL_FUNCPTR( AHardwareBuffer_lock ); -DECL_FUNCPTR( AHardwareBuffer_unlock ); -DECL_FUNCPTR( AHardwareBuffer_recvHandleFromUnixSocket ); -DECL_FUNCPTR( AHardwareBuffer_sendHandleToUnixSocket ); -DECL_FUNCPTR( ANativeWindowBuffer_getHardwareBuffer ); - #ifndef SYNC_IOC_WAIT #define SYNC_IOC_WAIT _IOW('>', 0, __s32) #endif @@ -484,38 +471,6 @@ void register_native_window( HWND hwnd, struct ANativeWindow *win, BOOL opengl ) NtQueueApcThread( thread, register_window_callback, (ULONG_PTR)hwnd, (ULONG_PTR)win, opengl ); } -#define LOAD_FUNCPTR(lib, func) do { \ - const char *err; \ - dlerror(); \ - p##func = dlsym( lib, #func ); \ - if (!p##func) \ - { \ - err = dlerror(); \ - ERR( "can't find symbol %s: %s\n", #func, err ? err : "unknown error" ); \ - abort(); \ - } \ -} while (0) -void init_ahardwarebuffers(void) -{ - void *libandroid; - - if (!(libandroid = dlopen( "libandroid.so", RTLD_NOW ))) - { - const char *err = dlerror(); - ERR( "failed to dlopen libandroid.so: %s\n", err ? err : "unknown error" ); - abort(); - } - - LOAD_FUNCPTR( libandroid, AHardwareBuffer_describe ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_acquire ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_release ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_lock ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_unlock ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_recvHandleFromUnixSocket ); - LOAD_FUNCPTR( libandroid, AHardwareBuffer_sendHandleToUnixSocket ); - LOAD_FUNCPTR( libandroid, ANativeWindowBuffer_getHardwareBuffer ); -} - /* get the capture window stored in the desktop process */ HWND get_capture_window(void) { diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 4ce07e3fd9f..0dbd6c11785 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -22,6 +22,8 @@ #pragma makedep unix #endif +#define __ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ + #include "config.h" #include <stdarg.h> @@ -335,12 +337,20 @@ static const JNINativeMethod methods[] = #define DECL_FUNCPTR(f) typeof(f) * p##f = NULL #define LOAD_FUNCPTR(lib, func) do { \ if ((p##func = dlsym( lib, #func )) == NULL) \ - { ERR( "can't find symbol %s\n", #func); return; } \ + { ERR( "can't find symbol %s\n", #func); abort(); return; } \ } while(0) DECL_FUNCPTR( __android_log_print ); DECL_FUNCPTR( ANativeWindow_fromSurface ); DECL_FUNCPTR( ANativeWindow_release ); +DECL_FUNCPTR( AHardwareBuffer_describe ); +DECL_FUNCPTR( AHardwareBuffer_acquire ); +DECL_FUNCPTR( AHardwareBuffer_release ); +DECL_FUNCPTR( AHardwareBuffer_lock ); +DECL_FUNCPTR( AHardwareBuffer_unlock ); +DECL_FUNCPTR( AHardwareBuffer_recvHandleFromUnixSocket ); +DECL_FUNCPTR( AHardwareBuffer_sendHandleToUnixSocket ); +DECL_FUNCPTR( ANativeWindowBuffer_getHardwareBuffer ); static void load_android_libs(void) { @@ -349,16 +359,26 @@ static void load_android_libs(void) if (!(libandroid = dlopen( "libandroid.so", RTLD_GLOBAL ))) { ERR( "failed to load libandroid.so: %s\n", dlerror() ); + abort(); return; } if (!(liblog = dlopen( "liblog.so", RTLD_GLOBAL ))) { ERR( "failed to load liblog.so: %s\n", dlerror() ); + abort(); return; } LOAD_FUNCPTR( liblog, __android_log_print ); LOAD_FUNCPTR( libandroid, ANativeWindow_fromSurface ); LOAD_FUNCPTR( libandroid, ANativeWindow_release ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_describe ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_acquire ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_release ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_lock ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_unlock ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_recvHandleFromUnixSocket ); + LOAD_FUNCPTR( libandroid, AHardwareBuffer_sendHandleToUnixSocket ); + LOAD_FUNCPTR( libandroid, ANativeWindowBuffer_getHardwareBuffer ); } #undef DECL_FUNCPTR @@ -371,7 +391,7 @@ static HRESULT android_init( void *arg ) jclass class; JNIEnv *jni_env; - init_ahardwarebuffers(); + load_android_libs(); pthread_mutexattr_init( &attr ); pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); @@ -387,7 +407,6 @@ static HRESULT android_init( void *arg ) WORD old_fs; __asm__( "mov %%fs,%0" : "=r" (old_fs) ); #endif - load_android_libs(); (*java_vm)->AttachCurrentThread( java_vm, &jni_env, 0 ); class = (*jni_env)->GetObjectClass( jni_env, java_object ); (*jni_env)->RegisterNatives( jni_env, class, methods, ARRAY_SIZE( methods )); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10690