diff --git a/code/plugins/Joystick/android/orxJoystick.cpp b/code/plugins/Joystick/android/orxJoystick.cpp index 37e05048f..e1266f072 100644 --- a/code/plugins/Joystick/android/orxJoystick.cpp +++ b/code/plugins/Joystick/android/orxJoystick.cpp @@ -313,56 +313,58 @@ orxSTATUS orxFASTCALL orxJoystick_Android_Init() /* Wasn't already initialized? */ if(!(sstJoystick.u32Flags & orxJOYSTICK_KU32_STATIC_FLAG_READY)) { - /* Cleans static controller */ - orxMemory_Zero(&sstJoystick, sizeof(orxJOYSTICK_STATIC)); - - orxASSERT(Paddleboat_isInitialized()); - /* Adds controller status callback */ - /* Note : Undocumented quirk. Without a controller status callback, - * connected devices will remain inactive. */ - Paddleboat_setControllerStatusCallback(orxJoystick_Android_GameControllerStatusCallback, NULL); + if(Paddleboat_isInitialized()) + { + /* Cleans static controller */ + orxMemory_Zero(&sstJoystick, sizeof(orxJOYSTICK_STATIC)); - orxConfig_PushSection(KZ_CONFIG_ANDROID); + /* Adds controller status callback */ + /* Note : Undocumented quirk. Without a controller status callback, + * connected devices will remain inactive. */ + Paddleboat_setControllerStatusCallback(orxJoystick_Android_GameControllerStatusCallback, NULL); - sstJoystick.s32ScreenRotation = -1; - sstJoystick.bAccelerometerEnabled = orxFALSE; + orxConfig_PushSection(KZ_CONFIG_ANDROID); - if(orxConfig_HasValue(KZ_CONFIG_ACCELEROMETER_FREQUENCY)) - { - sstJoystick.u32Frequency = orxConfig_GetU32(KZ_CONFIG_ACCELEROMETER_FREQUENCY); - } + sstJoystick.s32ScreenRotation = -1; + sstJoystick.bAccelerometerEnabled = orxFALSE; - orxConfig_PopSection(); + if(orxConfig_HasValue(KZ_CONFIG_ACCELEROMETER_FREQUENCY)) + { + sstJoystick.u32Frequency = orxConfig_GetU32(KZ_CONFIG_ACCELEROMETER_FREQUENCY); + } - /* Note : Avoid consuming battery if accelerometer is not used. */ - if(sstJoystick.u32Frequency > 0) - { - sstJoystick.sensorManager = ASensorManager_getInstance(); - sstJoystick.accelerometerSensor = ASensorManager_getDefaultSensor(sstJoystick.sensorManager, ASENSOR_TYPE_ACCELEROMETER); + orxConfig_PopSection(); - if(sstJoystick.accelerometerSensor != NULL) + /* Note : Avoid consuming battery if accelerometer is not used. */ + if(sstJoystick.u32Frequency > 0) { - /* Adds event handlers */ - if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_SYSTEM, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE) - { - orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_SYSTEM, orxNULL, orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_LOST) | orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_GAINED), orxEVENT_KU32_MASK_ID_ALL); + sstJoystick.sensorManager = ASensorManager_getInstance(); + sstJoystick.accelerometerSensor = ASensorManager_getDefaultSensor(sstJoystick.sensorManager, ASENSOR_TYPE_ACCELEROMETER); - if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_ANDROID, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE) + if(sstJoystick.accelerometerSensor != NULL) + { + /* Adds event handlers */ + if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_SYSTEM, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE) { - orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_ANDROID, orxNULL, orxEVENT_GET_FLAG(orxANDROID_EVENT_SURFACE_CHANGE) | orxEVENT_GET_FLAG(orxANDROID_EVENT_ACCELERATE), orxEVENT_KU32_MASK_ID_ALL); + orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_SYSTEM, orxNULL, orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_LOST) | orxEVENT_GET_FLAG(orxSYSTEM_EVENT_FOCUS_GAINED), orxEVENT_KU32_MASK_ID_ALL); + + if((eResult = orxEvent_AddHandler(orxEVENT_TYPE_ANDROID, orxJoystick_Android_EventHandler)) != orxSTATUS_FAILURE) + { + orxEvent_SetHandlerIDFlags(orxJoystick_Android_EventHandler, orxEVENT_TYPE_ANDROID, orxNULL, orxEVENT_GET_FLAG(orxANDROID_EVENT_SURFACE_CHANGE) | orxEVENT_GET_FLAG(orxANDROID_EVENT_ACCELERATE), orxEVENT_KU32_MASK_ID_ALL); - ALooper* looper = ALooper_forThread(); - sstJoystick.sensorEventQueue = ASensorManager_createEventQueue(sstJoystick.sensorManager, looper, LOOPER_ID_SENSOR, NULL, NULL); + ALooper* looper = ALooper_forThread(); + sstJoystick.sensorEventQueue = ASensorManager_createEventQueue(sstJoystick.sensorManager, looper, LOOPER_ID_SENSOR, NULL, NULL); - /* Enables sensor */ - orxJoystick_Android_EnableSensorManager(); + /* Enables sensor */ + orxJoystick_Android_EnableSensorManager(); + } } } } - } - /* Updates status */ - sstJoystick.u32Flags |= orxJOYSTICK_KU32_STATIC_FLAG_READY; + /* Updates status */ + sstJoystick.u32Flags |= orxJOYSTICK_KU32_STATIC_FLAG_READY; + } } /* Done! */ @@ -420,10 +422,10 @@ orxFLOAT orxFASTCALL orxJoystick_Android_GetAxisValue(orxJOYSTICK_AXIS _eAxis) if(Paddleboat_getControllerData(u32ID, &controllerData) == PADDLEBOAT_NO_ERROR) { orxS32 s32Axis; - + /* Gets axis */ s32Axis = _eAxis % orxJOYSTICK_AXIS_SINGLE_NUMBER; - + /* Updates result */ switch(s32Axis) { diff --git a/code/src/main/android/orxAndroidSupport.cpp b/code/src/main/android/orxAndroidSupport.cpp index 45f563a3e..79cf36368 100644 --- a/code/src/main/android/orxAndroidSupport.cpp +++ b/code/src/main/android/orxAndroidSupport.cpp @@ -744,13 +744,17 @@ extern int main(int argc, char *argv[]); void android_main(android_app *_pstState) { - char *argv[orxANDROID_KU32_MAX_ARGUMENT_COUNT]; + Paddleboat_ErrorCode paddleboatError; + bool bSwappyInitialized; + char *azArgumentList[orxANDROID_KU32_MAX_ARGUMENT_COUNT]; + int iArgumentCount; + char *pc; /* Inits Java VM */ jVM = _pstState->activity->vm; JNIEnv *pstEnv = orxAndroid_JNI_GetEnv(); - if (pstEnv == NULL) + if(pstEnv == NULL) { /* Exits gracefully */ return; @@ -779,31 +783,34 @@ void android_main(android_app *_pstState) _pstState->onAppCmd = orxAndroid_handleCmd; - /* Inits joystick support */ - Paddleboat_init(pstEnv, _pstState->activity->javaGameActivity); + /* Inits Paddleboat */ + paddleboatError = Paddleboat_init(pstEnv, _pstState->activity->javaGameActivity); android_app_set_motion_event_filter(_pstState, NULL); /* Inits SwappyGL */ - SwappyGL_init(pstEnv, _pstState->activity->javaGameActivity); - SwappyGL_setAutoSwapInterval(false); - SwappyGL_setAutoPipelineMode(false); + bSwappyInitialized = SwappyGL_init(pstEnv, _pstState->activity->javaGameActivity); + if(bSwappyInitialized) + { + SwappyGL_setAutoSwapInterval(false); + SwappyGL_setAutoPipelineMode(false); + } /* Gets arguments from manifest */ orxAndroid_JNI_GetArguments(); /* Parses the arguments */ - int argc = 0; + iArgumentCount = 0; - char *pc = strtok(sstAndroid.zArguments, " "); - while(pc && argc < orxANDROID_KU32_MAX_ARGUMENT_COUNT - 1) + pc = strtok(sstAndroid.zArguments, " "); + while(pc && iArgumentCount < orxANDROID_KU32_MAX_ARGUMENT_COUNT - 1) { - argv[argc++] = pc; + azArgumentList[iArgumentCount++] = pc; pc = strtok(0, " "); } - argv[argc] = NULL; + azArgumentList[iArgumentCount] = NULL; /* Runs the application code */ - main(argc, argv); + main(iArgumentCount, azArgumentList); if(_pstState->destroyRequested == 0) { @@ -831,8 +838,17 @@ void android_main(android_app *_pstState) } } - Paddleboat_destroy(pstEnv); - SwappyGL_destroy(); + if(paddleboatError == PADDLEBOAT_NO_ERROR) + { + /* Destroys Paddleboat */ + Paddleboat_destroy(pstEnv); + } + + if(bSwappyInitialized) + { + /* Destroys SwappyGL */ + SwappyGL_destroy(); + } } /* APK orxRESOURCE */