From cb986aff9f2aff6f5c5bb89701ef3aa904c3960c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 13 Mar 2020 13:05:32 -0700 Subject: [PATCH] Fixed exception at shutdown if the controllers are closed after the HIDDeviceManager is shutdown --- src/hidapi/android/hid.cpp | 52 ++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/src/hidapi/android/hid.cpp b/src/hidapi/android/hid.cpp index dd0edf1c68f7c..e5af5ad2dd98b 100644 --- a/src/hidapi/android/hid.cpp +++ b/src/hidapi/android/hid.cpp @@ -436,6 +436,12 @@ class CHIDDevice g_JVM->AttachCurrentThread( &env, NULL ); pthread_setspecific( g_ThreadKey, (void*)env ); + if ( !g_HIDDeviceManagerCallbackHandler ) + { + LOGV( "Device open without callback handler" ); + return false; + } + m_bIsWaitingForOpen = false; m_bOpenResult = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerOpen, m_nId ); ExceptionCheck( env, "BOpen" ); @@ -545,11 +551,18 @@ class CHIDDevice g_JVM->AttachCurrentThread( &env, NULL ); pthread_setspecific( g_ThreadKey, (void*)env ); - jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); - int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf ); - ExceptionCheck( env, "SendOutputReport" ); - - env->DeleteLocalRef( pBuf ); + int nRet = -1; + if ( g_HIDDeviceManagerCallbackHandler ) + { + jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); + nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf ); + ExceptionCheck( env, "SendOutputReport" ); + env->DeleteLocalRef( pBuf ); + } + else + { + LOGV( "SendOutputReport without callback handler" ); + } return nRet; } @@ -560,10 +573,18 @@ class CHIDDevice g_JVM->AttachCurrentThread( &env, NULL ); pthread_setspecific( g_ThreadKey, (void*)env ); - jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); - int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf ); - ExceptionCheck( env, "SendFeatureReport" ); - env->DeleteLocalRef( pBuf ); + int nRet = -1; + if ( g_HIDDeviceManagerCallbackHandler ) + { + jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); + nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf ); + ExceptionCheck( env, "SendFeatureReport" ); + env->DeleteLocalRef( pBuf ); + } + else + { + LOGV( "SendFeatureReport without callback handler" ); + } return nRet; } @@ -587,6 +608,12 @@ class CHIDDevice g_JVM->AttachCurrentThread( &env, NULL ); pthread_setspecific( g_ThreadKey, (void*)env ); + if ( !g_HIDDeviceManagerCallbackHandler ) + { + LOGV( "GetFeatureReport without callback handler" ); + return -1; + } + { hid_mutex_guard cvl( &m_cvLock ); if ( m_bIsWaitingForFeatureReport ) @@ -657,8 +684,11 @@ class CHIDDevice g_JVM->AttachCurrentThread( &env, NULL ); pthread_setspecific( g_ThreadKey, (void*)env ); - env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId ); - ExceptionCheck( env, "Close" ); + if ( g_HIDDeviceManagerCallbackHandler ) + { + env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId ); + ExceptionCheck( env, "Close" ); + } hid_mutex_guard dataLock( &m_dataLock ); m_vecData.clear();