Bug 932692 - Check for uncaught exceptions after JNI calls followed by JNI calls. r=blassey

This commit is contained in:
Gian-Carlo Pascutto 2013-11-22 09:54:45 +01:00
Родитель e6381043a1
Коммит 85ebed2d1c
2 изменённых файлов: 10 добавлений и 4 удалений

Просмотреть файл

@ -105,7 +105,7 @@ int32_t DeviceInfoAndroid::GetDeviceName(
if (cid != NULL) { if (cid != NULL) {
jobject javaDeviceNameObj = env->CallObjectMethod(javaCmDevInfoObject, jobject javaDeviceNameObj = env->CallObjectMethod(javaCmDevInfoObject,
cid, deviceNumber); cid, deviceNumber);
if (javaDeviceNameObj == NULL) { if (javaDeviceNameObj == NULL || jniFrame.CheckForException()) {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
"%s: Failed to get device name for device %d.", "%s: Failed to get device name for device %d.",
__FUNCTION__, (int) deviceNumber); __FUNCTION__, (int) deviceNumber);
@ -200,7 +200,7 @@ int32_t DeviceInfoAndroid::CreateCapabilityMap(
// Call the java class and get an array with capabilities back. // Call the java class and get an array with capabilities back.
jobject javaCapabilitiesObj = env->CallObjectMethod(javaCmDevInfoObject, jobject javaCapabilitiesObj = env->CallObjectMethod(javaCmDevInfoObject,
cid, capureIdString); cid, capureIdString);
if (!javaCapabilitiesObj) { if (!javaCapabilitiesObj || jniFrame.CheckForException()) {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id,
"%s: Failed to call java GetCapabilityArray.", "%s: Failed to call java GetCapabilityArray.",
__FUNCTION__); __FUNCTION__);

Просмотреть файл

@ -154,7 +154,12 @@ int32_t VideoCaptureAndroid::SetAndroidObjects(void* javaVM,
env->CallStaticObjectMethod(g_javaCmDevInfoClass, env->CallStaticObjectMethod(g_javaCmDevInfoClass,
cid, (int) -1, cid, (int) -1,
javaContext); javaContext);
if (!javaCameraDeviceInfoObjLocal) { bool exceptionThrown = env->ExceptionCheck();
if (!javaCameraDeviceInfoObjLocal || exceptionThrown) {
if (exceptionThrown) {
env->ExceptionDescribe();
env->ExceptionClear();
}
EARLY_WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, -1, EARLY_WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, -1,
"%s: could not create Java Capture Device info object", "%s: could not create Java Capture Device info object",
__FUNCTION__); __FUNCTION__);
@ -329,7 +334,7 @@ int32_t VideoCaptureAndroid::Init(const int32_t id,
cid, (jint) id, cid, (jint) id,
(jlong) this, (jlong) this,
capureIdString); capureIdString);
if (!javaCameraObjLocal) { if (!javaCameraObjLocal || jniFrame.CheckForException()) {
WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id, WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceVideoCapture, _id,
"%s: could not create Java Capture object", __FUNCTION__); "%s: could not create Java Capture object", __FUNCTION__);
return -1; return -1;
@ -372,6 +377,7 @@ VideoCaptureAndroid::~VideoCaptureAndroid() {
"%s: Call DeleteVideoCaptureAndroid", __FUNCTION__); "%s: Call DeleteVideoCaptureAndroid", __FUNCTION__);
// Close the camera by calling the static destruct function. // Close the camera by calling the static destruct function.
env->CallStaticVoidMethod(g_javaCmClass, cid, _javaCaptureObj); env->CallStaticVoidMethod(g_javaCmClass, cid, _javaCaptureObj);
jniFrame.CheckForException();
// Delete global object ref to the camera. // Delete global object ref to the camera.
env->DeleteGlobalRef(_javaCaptureObj); env->DeleteGlobalRef(_javaCaptureObj);