Add exception handling to Android hidapi.

Sam Lantinga 2018-10-22 14:55:42 -07:00
parent 4a50a04213
commit c4918db580
6 changed files with 38 additions and 1 deletions

0
Xcode-iOS/Demos/Demos.xcodeproj/project.pbxproj Normal file → Executable file
View File

0
Xcode-iOS/SDL/SDL.xcodeproj/project.pbxproj Normal file → Executable file
View File

0
Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj Normal file → Executable file
View File

0
Xcode/SDL/SDL.xcodeproj/project.pbxproj Normal file → Executable file
View File

0
Xcode/SDLTest/SDLTest.xcodeproj/project.pbxproj Normal file → Executable file
View File

View File

@ -14,6 +14,10 @@
#include <string.h> // For memcpy() #include <string.h> // For memcpy()
#define TAG "hidapi" #define TAG "hidapi"
// Have error log always available
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#ifdef DEBUG #ifdef DEBUG
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__) #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
@ -398,6 +402,33 @@ public:
return m_pDevice; return m_pDevice;
} }
void ExceptionCheck( JNIEnv *env, const char *pszMethodName )
{
if ( env->ExceptionCheck() )
{
// Get our exception
jthrowable jExcept = env->ExceptionOccurred();
// Clear the exception so we can call JNI again
env->ExceptionClear();
// Get our exception message
jclass jExceptClass = env->GetObjectClass( jExcept );
jmethodID jMessageMethod = env->GetMethodID( jExceptClass, "getMessage", "()Ljava/lang/String;" );
jstring jMessage = (jstring)( env->CallObjectMethod( jExcept, jMessageMethod ) );
const char *pszMessage = env->GetStringUTFChars( jMessage, NULL );
// ...and log it.
LOGE( "CHIDDevice::%s threw an exception: %s", pszMethodName, pszMessage );
// Cleanup
env->ReleaseStringUTFChars( jMessage, pszMessage );
env->DeleteLocalRef( jMessage );
env->DeleteLocalRef( jExceptClass );
env->DeleteLocalRef( jExcept );
}
}
bool BOpen() bool BOpen()
{ {
// Make sure thread is attached to JVM/env // Make sure thread is attached to JVM/env
@ -407,6 +438,7 @@ public:
m_bIsWaitingForOpen = false; m_bIsWaitingForOpen = false;
m_bOpenResult = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerOpen, m_nId ); m_bOpenResult = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerOpen, m_nId );
ExceptionCheck( env, "BOpen" );
if ( m_bIsWaitingForOpen ) if ( m_bIsWaitingForOpen )
{ {
@ -515,6 +547,8 @@ public:
jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); jbyteArray pBuf = NewByteArray( env, pData, nDataLen );
int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf ); int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf );
ExceptionCheck( env, "SendOutputReport" );
env->DeleteLocalRef( pBuf ); env->DeleteLocalRef( pBuf );
return nRet; return nRet;
} }
@ -528,6 +562,7 @@ public:
jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); jbyteArray pBuf = NewByteArray( env, pData, nDataLen );
int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf ); int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf );
ExceptionCheck( env, "SendFeatureReport" );
env->DeleteLocalRef( pBuf ); env->DeleteLocalRef( pBuf );
return nRet; return nRet;
} }
@ -564,6 +599,7 @@ public:
jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); jbyteArray pBuf = NewByteArray( env, pData, nDataLen );
int nRet = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerGetFeatureReport, m_nId, pBuf ) ? 0 : -1; int nRet = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerGetFeatureReport, m_nId, pBuf ) ? 0 : -1;
ExceptionCheck( env, "GetFeatureReport" );
env->DeleteLocalRef( pBuf ); env->DeleteLocalRef( pBuf );
if ( nRet < 0 ) if ( nRet < 0 )
{ {
@ -622,6 +658,7 @@ public:
pthread_setspecific( g_ThreadKey, (void*)env ); pthread_setspecific( g_ThreadKey, (void*)env );
env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId ); env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId );
ExceptionCheck( env, "Close" );
hid_mutex_guard dataLock( &m_dataLock ); hid_mutex_guard dataLock( &m_dataLock );
m_vecData.clear(); m_vecData.clear();