Commit 30f04d63e6972855626278469a4c1762d27736b9

Sam Lantinga 2021-11-26T07:15:46

HIDAPI is only reliable on Android 4.3 and newer Fixes https://github.com/libsdl-org/SDL/issues/4955

diff --git a/src/hidapi/android/hid.cpp b/src/hidapi/android/hid.cpp
index 0984f47..faed885 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;