(android_input.c) Attempt to only grab dlopen handle once

This commit is contained in:
twinaphex 2015-12-03 21:19:16 +01:00
parent 07109e8e89
commit 071912871b
1 changed files with 25 additions and 10 deletions

View File

@ -105,6 +105,8 @@ static typeof(AMotionEvent_getAxisValue) *p_AMotionEvent_getAxisValue;
#define AMotionEvent_getAxisValue (*p_AMotionEvent_getAxisValue) #define AMotionEvent_getAxisValue (*p_AMotionEvent_getAxisValue)
static void *libandroid_handle;
static bool android_input_lookup_name_prekitkat(char *buf, static bool android_input_lookup_name_prekitkat(char *buf,
int *vendorId, int *productId, size_t size, int id) int *vendorId, int *productId, size_t size, int id)
{ {
@ -406,6 +408,25 @@ static void engine_handle_dpad_getaxisvalue(android_input_data_t *android_data,
android_data->analog_state[port][9] = (int16_t)(gas * 32767.0f); android_data->analog_state[port][9] = (int16_t)(gas * 32767.0f);
} }
static bool android_input_init_handle(void)
{
if (libandroid_handle != NULL) /* already initialized */
return true;
if ((libandroid_handle = dlopen("/system/lib/libandroid.so",
RTLD_LOCAL | RTLD_LAZY)) == 0)
return false;
if ((p_AMotionEvent_getAxisValue = dlsym(RTLD_DEFAULT,
"AMotionEvent_getAxisValue")))
{
RARCH_LOG("Set engine_handle_dpad to 'Get Axis Value' (for reading extra analog sticks)");
engine_handle_dpad = engine_handle_dpad_getaxisvalue;
}
return true;
}
static void *android_input_init(void) static void *android_input_init(void)
{ {
int32_t sdk; int32_t sdk;
@ -432,20 +453,11 @@ static void *android_input_init(void)
engine_handle_dpad = engine_handle_dpad_default; engine_handle_dpad = engine_handle_dpad_default;
if ((dlopen("/system/lib/libandroid.so", RTLD_LOCAL | RTLD_LAZY)) == 0) if (!android_input_init_handle())
{ {
RARCH_WARN("Unable to open libandroid.so\n"); RARCH_WARN("Unable to open libandroid.so\n");
goto end;
} }
if ((p_AMotionEvent_getAxisValue = dlsym(RTLD_DEFAULT,
"AMotionEvent_getAxisValue")))
{
RARCH_LOG("Set engine_handle_dpad to 'Get Axis Value' (for reading extra analog sticks)");
engine_handle_dpad = engine_handle_dpad_getaxisvalue;
}
end:
return android; return android;
} }
@ -1007,6 +1019,9 @@ static void android_input_free_input(void *data)
android->joypad->destroy(); android->joypad->destroy();
android->joypad = NULL; android->joypad = NULL;
dylib_close((dylib_t)libandroid_handle);
libandroid_handle = NULL;
android_keyboard_free(); android_keyboard_free();
free(data); free(data);
} }