From 30f04d63e6972855626278469a4c1762d27736b9 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 26 Nov 2021 07:15:46 -0800
Subject: [PATCH] HIDAPI is only reliable on Android 4.3 and newer
Fixes https://github.com/libsdl-org/SDL/issues/4955
---
src/hidapi/android/hid.cpp | 45 ++++++++++++++++++++------------------
1 file changed, 24 insertions(+), 21 deletions(-)
diff --git a/src/hidapi/android/hid.cpp b/src/hidapi/android/hid.cpp
index 0984f47eb4..faed885542 100644
--- a/src/hidapi/android/hid.cpp
+++ b/src/hidapi/android/hid.cpp
@@ -1047,29 +1047,32 @@ int hid_init(void)
{
if ( !g_initialized )
{
- // Make sure thread is attached to JVM/env
- JNIEnv *env;
- g_JVM->AttachCurrentThread( &env, NULL );
- pthread_setspecific( g_ThreadKey, (void*)env );
-
- if ( !g_HIDDeviceManagerCallbackHandler )
- {
- LOGV( "hid_init() without callback handler" );
- return -1;
- }
+ // HIDAPI doesn't work well with Android < 4.3
+ if (SDL_GetAndroidSDKVersion() >= 18) {
+ // Make sure thread is attached to JVM/env
+ JNIEnv *env;
+ g_JVM->AttachCurrentThread( &env, NULL );
+ pthread_setspecific( g_ThreadKey, (void*)env );
+
+ if ( !g_HIDDeviceManagerCallbackHandler )
+ {
+ LOGV( "hid_init() without callback handler" );
+ return -1;
+ }
- // Bluetooth is currently only used for Steam Controllers, so check that hint
- // before initializing Bluetooth, which will prompt the user for permission.
- bool init_usb = true;
- bool init_bluetooth = false;
- if (SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI_STEAM, SDL_FALSE)) {
- if (SDL_GetAndroidSDKVersion() < 31 ||
- Android_JNI_RequestPermission("android.permission.BLUETOOTH_CONNECT")) {
- init_bluetooth = true;
+ // Bluetooth is currently only used for Steam Controllers, so check that hint
+ // before initializing Bluetooth, which will prompt the user for permission.
+ bool init_usb = true;
+ bool init_bluetooth = false;
+ if (SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI_STEAM, SDL_FALSE)) {
+ if (SDL_GetAndroidSDKVersion() < 31 ||
+ Android_JNI_RequestPermission("android.permission.BLUETOOTH_CONNECT")) {
+ init_bluetooth = true;
+ }
}
- }
- env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerInitialize, init_usb, init_bluetooth );
- ExceptionCheck( env, NULL, "hid_init" );
+ env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerInitialize, init_usb, init_bluetooth );
+ ExceptionCheck( env, NULL, "hid_init" );
+ }
g_initialized = true; // Regardless of result, so it's only called once
}
return 0;