From: Twaik Yont <9674930+twaik@users.noreply.github.com> wineandroid.so is already linked against ntdll by the build system, so there is no need to resolve java_vm, java_object and java_gdt_sel via dlsym() at runtime. Replace the indirect pointers (p_java_*) with direct references to the exported symbols. This simplifies the code and removes unnecessary runtime linking. Signed-off-by: Twaik Yont <9674930+twaik@users.noreply.github.com> --- dlls/wineandroid.drv/android.h | 6 +++--- dlls/wineandroid.drv/device.c | 18 ++++++------------ dlls/wineandroid.drv/init.c | 23 ++++------------------- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 00061cf2812..8aee7b22406 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -184,9 +184,9 @@ union event_data int send_event( const union event_data *data ); -extern JavaVM **p_java_vm; -extern jobject *p_java_object; -extern unsigned short *p_java_gdt_sel; +extern JavaVM *java_vm; +extern jobject java_object; +extern unsigned short java_gdt_sel; /* string helpers */ diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index 77050337273..b04210bc7fe 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -235,11 +235,11 @@ static inline void wrap_java_call(void) { __asm__( "mov %0,%%fs" :: "r" (java_ static inline void unwrap_java_call(void) { __asm__( "mov %0,%%fs" :: "r" (orig_fs) ); } static inline void init_java_thread( JavaVM *java_vm ) { - java_fs = *p_java_gdt_sel; + java_fs = java_gdt_sel; __asm__( "mov %%fs,%0" : "=r" (orig_fs) ); __asm__( "mov %0,%%fs" :: "r" (java_fs) ); (*java_vm)->AttachCurrentThread( java_vm, &jni_env, 0 ); - if (!*p_java_gdt_sel) __asm__( "mov %%fs,%0" : "=r" (java_fs) ); + if (!java_gdt_sel) __asm__( "mov %%fs,%0" : "=r" (java_fs) ); __asm__( "mov %0,%%fs" :: "r" (orig_fs) ); } @@ -571,14 +571,12 @@ static int status_to_android_error( unsigned int status ) static jobject load_java_method( jmethodID *method, const char *name, const char *args ) { - jobject object = *p_java_object; - if (!*method) { jclass class; wrap_java_call(); - class = (*jni_env)->GetObjectClass( jni_env, object ); + class = (*jni_env)->GetObjectClass( jni_env, java_object ); *method = (*jni_env)->GetMethodID( jni_env, class, name, args ); unwrap_java_call(); if (!*method) @@ -587,7 +585,7 @@ static jobject load_java_method( jmethodID *method, const char *name, const char return NULL; } } - return object; + return java_object; } static void create_desktop_view(void) @@ -1067,9 +1065,7 @@ NTSTATUS android_dispatch_ioctl( void *arg ) NTSTATUS android_java_init( void *arg ) { - JavaVM *java_vm; - - if (!(java_vm = *p_java_vm)) return STATUS_UNSUCCESSFUL; /* not running under Java */ + if (!java_vm) return STATUS_UNSUCCESSFUL; /* not running under Java */ init_java_thread( java_vm ); create_desktop_view(); @@ -1078,9 +1074,7 @@ NTSTATUS android_java_init( void *arg ) NTSTATUS android_java_uninit( void *arg ) { - JavaVM *java_vm; - - if (!(java_vm = *p_java_vm)) return STATUS_UNSUCCESSFUL; /* not running under Java */ + if (!java_vm) return STATUS_UNSUCCESSFUL; /* not running under Java */ wrap_java_call(); (*java_vm)->DetachCurrentThread( java_vm ); diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 303655cde58..4ce07e3fd9f 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -84,7 +84,7 @@ void init_monitors( int width, int height ) wine_dbgstr_rect( &rect ), wine_dbgstr_rect( &monitor_rc_work )); /* if we're notified from Java thread, update registry */ - if (*p_java_vm) NtUserCallNoParam( NtUserCallNoParam_DisplayModeChanged ); + if (java_vm) NtUserCallNoParam( NtUserCallNoParam_DisplayModeChanged ); } @@ -168,7 +168,7 @@ void set_screen_dpi( DWORD dpi ) */ static void fetch_display_metrics(void) { - if (*p_java_vm) return; /* for Java threads it will be set when the top view is created */ + if (java_vm) return; /* for Java threads it will be set when the top view is created */ SERVER_START_REQ( get_window_rectangles ) { @@ -364,27 +364,12 @@ static void load_android_libs(void) #undef DECL_FUNCPTR #undef LOAD_FUNCPTR -JavaVM **p_java_vm = NULL; -jobject *p_java_object = NULL; -unsigned short *p_java_gdt_sel = NULL; - static HRESULT android_init( void *arg ) { struct init_params *params = arg; pthread_mutexattr_t attr; jclass class; - jobject object; JNIEnv *jni_env; - JavaVM *java_vm; - void *ntdll; - - if (!(ntdll = dlopen( "ntdll.so", RTLD_NOW ))) return STATUS_UNSUCCESSFUL; - - p_java_vm = dlsym( ntdll, "java_vm" ); - p_java_object = dlsym( ntdll, "java_object" ); - p_java_gdt_sel = dlsym( ntdll, "java_gdt_sel" ); - - object = *p_java_object; init_ahardwarebuffers(); @@ -396,7 +381,7 @@ static HRESULT android_init( void *arg ) register_window_callback = params->register_window_callback; start_device_callback = params->start_device_callback; - if ((java_vm = *p_java_vm)) /* running under Java */ + if (java_vm) /* running under Java */ { #ifdef __i386__ WORD old_fs; @@ -404,7 +389,7 @@ static HRESULT android_init( void *arg ) #endif load_android_libs(); (*java_vm)->AttachCurrentThread( java_vm, &jni_env, 0 ); - class = (*jni_env)->GetObjectClass( jni_env, object ); + class = (*jni_env)->GetObjectClass( jni_env, java_object ); (*jni_env)->RegisterNatives( jni_env, class, methods, ARRAY_SIZE( methods )); (*jni_env)->DeleteLocalRef( jni_env, class ); #ifdef __i386__ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10690