JNIEXPORT jobject JNICALL awt_GetComponent(JNIEnv* env, void* platformInfo) { Window window = (Window)platformInfo; jobject peer = NULL; jobject target = NULL; AWT_LOCK(); if (window != None) { peer = JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "windowToXWindow", "(J)Lsun/awt/X11/XBaseWindow;", (jlong)window).l; } if ((peer != NULL) && (JNU_IsInstanceOfByName(env, peer, "sun/awt/X11/XWindow") == 1)) { target = (*env)->GetObjectField(env, peer, targetID); } if (target == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return (jobject)NULL; } AWT_UNLOCK(); return target; }
// This function is called instead of ExceptionOccurred. It throws // std::bad_alloc if a java.lang.OutOfMemoryError is currently pending // on the calling thread. jthrowable safe_ExceptionOccurred(JNIEnv *env) throw (std::bad_alloc) { jthrowable xcp = env->ExceptionOccurred(); if (xcp != NULL) { env->ExceptionClear(); // if we don't do this, isInstanceOf will fail jint isOutofmem = JNU_IsInstanceOfByName(env, xcp, "java/lang/OutOfMemoryError"); if (isOutofmem > 0) { env->DeleteLocalRef(xcp); throw std::bad_alloc(); } else { env->ExceptionClear(); // rethrow exception env->Throw(xcp); return xcp; } } return NULL; }