From: Elliott Hughes Date: Wed, 7 Oct 2009 23:33:23 +0000 (-0700) Subject: JNI Delete* and Release* _are_ allowed while an exception is pending. X-Git-Tag: android-x86-2.2~591^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=685130aef232bb87a69369093c603f256db4d32c;p=android-x86%2Fdalvik.git JNI Delete* and Release* _are_ allowed while an exception is pending. See "Exceptions" in our own documentation: http://android.git.kernel.org/?p=platform/dalvik.git;a=blob_plain;f=docs/jni-tips.html;hb=HEAD This is also true of the RI, though the spec sometimes implies otherwise. Here's the canonical reference: http://java.sun.com/docs/books/jni/html/design.html#2193 --- diff --git a/libcore/xml/src/main/native/org_apache_harmony_xml_ExpatParser.cpp b/libcore/xml/src/main/native/org_apache_harmony_xml_ExpatParser.cpp index 15f1d28d7..9192b1af6 100644 --- a/libcore/xml/src/main/native/org_apache_harmony_xml_ExpatParser.cpp +++ b/libcore/xml/src/main/native/org_apache_harmony_xml_ExpatParser.cpp @@ -790,18 +790,7 @@ static void processingInstruction(void* data, const char* target, env->CallVoidMethod(javaParser, processingInstructionMethod, javaTarget, javaInstructionData); - // We have to temporarily clear an exception before we can release local - // references. - jthrowable exception = env->ExceptionOccurred(); - if (exception != NULL) { - env->ExceptionClear(); - } - env->DeleteLocalRef(javaInstructionData); - - if (exception != NULL) { - env->Throw(exception); - } } /** @@ -998,16 +987,7 @@ static void appendString(JNIEnv* env, jobject object, jint pointer, jstring xml, jniThrowExpatException(env, XML_GetErrorCode(parser)); } - // We have to temporarily clear an exception before we can release local - // references. - jthrowable exception = env->ExceptionOccurred(); - if (exception) { - env->ExceptionClear(); - env->ReleaseStringChars(xml, characters); - env->Throw(exception); - } else { - env->ReleaseStringChars(xml, characters); - } + env->ReleaseStringChars(xml, characters); context->object = NULL; context->env = NULL; @@ -1036,16 +1016,7 @@ static void appendCharacters(JNIEnv* env, jobject object, jint pointer, jniThrowExpatException(env, XML_GetErrorCode(parser)); } - // We have to temporarily clear an exception before we can release local - // references. - jthrowable exception = env->ExceptionOccurred(); - if (exception) { - env->ExceptionClear(); - env->ReleaseCharArrayElements(xml, characters, JNI_ABORT); - env->Throw(exception); - } else { - env->ReleaseCharArrayElements(xml, characters, JNI_ABORT); - } + env->ReleaseCharArrayElements(xml, characters, JNI_ABORT); context->object = NULL; context->env = NULL; @@ -1074,16 +1045,7 @@ static void appendBytes(JNIEnv* env, jobject object, jint pointer, jniThrowExpatException(env, XML_GetErrorCode(parser)); } - // We have to temporarily clear an exception before we can release local - // references. - jthrowable exception = env->ExceptionOccurred(); - if (exception) { - env->ExceptionClear(); - env->ReleaseByteArrayElements(xml, bytes, JNI_ABORT); - env->Throw(exception); - } else { - env->ReleaseByteArrayElements(xml, bytes, JNI_ABORT); - } + env->ReleaseByteArrayElements(xml, bytes, JNI_ABORT); context->object = NULL; context->env = NULL;