Unverified Commit 2542a7c0 authored by Gus Grubba's avatar Gus Grubba Committed by GitHub

Merge pull request #7270 from mavlink/jniException

Properly handle jni exceptions.
parents 07e88661 89fc9397
...@@ -10,6 +10,15 @@ int JoystickAndroid::ACTION_DOWN; ...@@ -10,6 +10,15 @@ int JoystickAndroid::ACTION_DOWN;
int JoystickAndroid::ACTION_UP; int JoystickAndroid::ACTION_UP;
QMutex JoystickAndroid::m_mutex; QMutex JoystickAndroid::m_mutex;
static void clear_jni_exception()
{
QAndroidJniEnvironment jniEnv;
if (jniEnv->ExceptionCheck()) {
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
}
JoystickAndroid::JoystickAndroid(const QString& name, int axisCount, int buttonCount, int id, MultiVehicleManager* multiVehicleManager) JoystickAndroid::JoystickAndroid(const QString& name, int axisCount, int buttonCount, int id, MultiVehicleManager* multiVehicleManager)
: Joystick(name,axisCount,buttonCount,0,multiVehicleManager) : Joystick(name,axisCount,buttonCount,0,multiVehicleManager)
, deviceId(id) , deviceId(id)
...@@ -30,12 +39,13 @@ JoystickAndroid::JoystickAndroid(const QString& name, int axisCount, int buttonC ...@@ -30,12 +39,13 @@ JoystickAndroid::JoystickAndroid(const QString& name, int axisCount, int buttonC
btnValue = new bool[_buttonCount]; btnValue = new bool[_buttonCount];
btnCode = new int[_buttonCount]; btnCode = new int[_buttonCount];
int c = 0; int c = 0;
for (i=0;i<_androidBtnListCount;i++) for (i = 0; i < _androidBtnListCount; i++) {
if (supportedButtons[i]) { if (supportedButtons[i]) {
btnValue[c] = false; btnValue[c] = false;
btnCode[c] = _androidBtnList[i]; btnCode[c] = _androidBtnList[i];
c++; c++;
} }
}
env->ReleaseBooleanArrayElements(jSupportedButtons, supportedButtons, 0); env->ReleaseBooleanArrayElements(jSupportedButtons, supportedButtons, 0);
...@@ -147,10 +157,10 @@ bool JoystickAndroid::handleKeyEvent(jobject event) { ...@@ -147,10 +157,10 @@ bool JoystickAndroid::handleKeyEvent(jobject event) {
const int action = ev.callMethod<jint>("getAction", "()I"); const int action = ev.callMethod<jint>("getAction", "()I");
const int keyCode = ev.callMethod<jint>("getKeyCode", "()I"); const int keyCode = ev.callMethod<jint>("getKeyCode", "()I");
for (int i=0;i<_buttonCount;i++) { for (int i = 0; i <_buttonCount; i++) {
if (btnCode[i]==keyCode) { if (btnCode[i] == keyCode) {
if (action==ACTION_DOWN) btnValue[i] = true; if (action == ACTION_DOWN) btnValue[i] = true;
if (action==ACTION_UP) btnValue[i] = false; if (action == ACTION_UP) btnValue[i] = false;
return true; return true;
} }
} }
...@@ -163,9 +173,9 @@ bool JoystickAndroid::handleGenericMotionEvent(jobject event) { ...@@ -163,9 +173,9 @@ bool JoystickAndroid::handleGenericMotionEvent(jobject event) {
const int _deviceId = ev.callMethod<jint>("getDeviceId", "()I"); const int _deviceId = ev.callMethod<jint>("getDeviceId", "()I");
if (_deviceId!=deviceId) return false; if (_deviceId!=deviceId) return false;
for (int i=0;i<_axisCount;i++) { for (int i = 0; i <_axisCount; i++) {
const float v = ev.callMethod<jfloat>("getAxisValue", "(I)F",axisCode[i]); const float v = ev.callMethod<jfloat>("getAxisValue", "(I)F",axisCode[i]);
axisValue[i] = (int)(v*32767.f); axisValue[i] = static_cast<int>((v*32767.f));
} }
return true; return true;
} }
...@@ -215,7 +225,8 @@ bool JoystickAndroid::init(JoystickManager *manager) { ...@@ -215,7 +225,8 @@ bool JoystickAndroid::init(JoystickManager *manager) {
//int *JoystickAndroid:: //int *JoystickAndroid::
_androidBtnList = ret; _androidBtnList = ret;
for (i=1;i<=16;i++) { clear_jni_exception();
for (i = 1; i <= 16; i++) {
QString name = "KEYCODE_BUTTON_"+QString::number(i); QString name = "KEYCODE_BUTTON_"+QString::number(i);
ret[i-1] = QAndroidJniObject::getStaticField<jint>("android/view/KeyEvent", name.toStdString().c_str()); ret[i-1] = QAndroidJniObject::getStaticField<jint>("android/view/KeyEvent", name.toStdString().c_str());
} }
...@@ -267,14 +278,11 @@ void JoystickAndroid::setNativeMethods(JoystickManager *manager) ...@@ -267,14 +278,11 @@ void JoystickAndroid::setNativeMethods(JoystickManager *manager)
{"nativeUpdateAvailableJoysticks", "()V", reinterpret_cast<void *>(jniUpdateAvailableJoysticks)} {"nativeUpdateAvailableJoysticks", "()V", reinterpret_cast<void *>(jniUpdateAvailableJoysticks)}
}; };
clear_jni_exception();
QAndroidJniEnvironment jniEnv; QAndroidJniEnvironment jniEnv;
if (jniEnv->ExceptionCheck()) {
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
jclass objectClass = jniEnv->FindClass(kJniClassName); jclass objectClass = jniEnv->FindClass(kJniClassName);
if(!objectClass) { if(!objectClass) {
clear_jni_exception();
qWarning() << "Couldn't find class:" << kJniClassName; qWarning() << "Couldn't find class:" << kJniClassName;
return; return;
} }
...@@ -286,9 +294,5 @@ void JoystickAndroid::setNativeMethods(JoystickManager *manager) ...@@ -286,9 +294,5 @@ void JoystickAndroid::setNativeMethods(JoystickManager *manager)
} else { } else {
qCDebug(JoystickLog) << "Native Functions Registered"; qCDebug(JoystickLog) << "Native Functions Registered";
} }
clear_jni_exception();
if (jniEnv->ExceptionCheck()) {
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment