Joystick::~Joystick() { // Closes any open joysticks. for (int i = 0; i != getNumJoysticks(); i++) { if (isOpen(i)) close(i); } free(joysticks); SDL_QuitSubSystem(SDL_INIT_JOYSTICK); }
bool JVMInputFunctions::init( JNIEnv* _env, jclass rfdynhudClass, jobject _rfdynhudObject ) { env = _env; rfdynhudObject = _rfdynhudObject; unsigned short numKeys = getNumKeys(); unsigned char maxKeyNameLength = getMaxKeyNameLength(); unsigned int bufferSize = 2 + 1 + numKeys * ( maxKeyNameLength + 1 ); unsigned char numJoysticks = getNumJoysticks(); unsigned char* numButtons = (unsigned char*)malloc( numJoysticks ); bufferSize += 1 + numJoysticks * MAX_JOYSTICK_NAME_LENGTH; for ( unsigned char i = 0; i < numJoysticks; i++ ) { numButtons[i] = getNumButtons( i ); bufferSize += 1 + numButtons[i] * MAX_JOYSTICK_BUTTON_NAME_LENGTH; } jbyteArray arr = env->NewByteArray( bufferSize ); char* buffer = (char*)env->GetPrimitiveArrayCritical( arr, &isCopy ); unsigned int bufferOffset = 0; *( (unsigned short*)( buffer + bufferOffset ) ) = numKeys; bufferOffset += 2; *( (unsigned char*)( buffer + bufferOffset ) ) = maxKeyNameLength; bufferOffset += 1; getAllKeyNames( buffer + bufferOffset ); bufferOffset += numKeys * ( maxKeyNameLength + 1 ); *( (unsigned char*)( buffer + bufferOffset ) ) = numJoysticks; bufferOffset += 1; getJoystickNames( (char*)( buffer + bufferOffset ) ); bufferOffset += numJoysticks * MAX_JOYSTICK_NAME_LENGTH; for ( unsigned char i = 0; i < numJoysticks; i++ ) { *( (unsigned char*)( buffer + bufferOffset ) ) = numButtons[i]; bufferOffset += 1; getJoystickButtonNames( i, (char*)( buffer + bufferOffset ) ); bufferOffset += numButtons[i] * MAX_JOYSTICK_BUTTON_NAME_LENGTH; } env->ReleasePrimitiveArrayCritical( arr, buffer, 0 ); jmethodID mid = env->GetMethodID( rfdynhudClass, "initInput", "([B)V" ); if ( mid == 0 ) { logg( "ERROR: Failed to find the initInput() method." ); return ( false ); } logg( "Initializing input bindings..." ); env->CallVoidMethod( _rfdynhudObject, mid, arr ); logg( "Finished initialization of input bindings." ); env->DeleteLocalRef( arr ); mid = env->GetMethodID( rfdynhudClass, "getInputBuffer", "()Ljava/nio/ByteBuffer;" ); if ( mid == 0 ) { logg( "ERROR: Failed to find the getInputBuffer() method." ); return ( false ); } inputBufferObj = env->CallObjectMethod( _rfdynhudObject, mid ); if ( inputBufferObj == NULL ) { logg( "ERROR: Failed to get the input buffer." ); return ( false ); } inputBuffer = (char*)env->GetDirectBufferAddress( inputBufferObj ); if ( inputBuffer == NULL ) { logg( "ERROR: Input buffer is null." ); return ( false ); } updateInputMethod = env->GetMethodID( rfdynhudClass, "updateInput", "(I)B" ); if ( updateInputMethod == 0 ) { logg( "ERROR: Failed to find the updateInput() method." ); return ( false ); } return ( true ); }
bool Joystick::checkIndex(int index) { return index >= 0 && index < getNumJoysticks(); }