/* This file was generated from java/net/PlainDatagramSocketImpl.java and is
 * licensed under the same terms. The copyright and license information for
 * java/net/PlainDatagramSocketImpl.java follows.
 *
 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class java_net_PlainDatagramSocketImpl */

#ifndef _Included_java_net_PlainDatagramSocketImpl
#define _Included_java_net_PlainDatagramSocketImpl
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    bind0
 * Signature: (ILjava/net/InetAddress;)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_bind0
  (JNIEnv *, jobject, jint, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    send
 * Signature: (Ljava/net/DatagramPacket;)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_send
  (JNIEnv *, jobject, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    peek
 * Signature: (Ljava/net/InetAddress;)I
 */
JNIEXPORT jint JNICALL PlainDatagramSocketImpl_peek
  (JNIEnv *, jobject, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    peekData
 * Signature: (Ljava/net/DatagramPacket;)I
 */
JNIEXPORT jint JNICALL PlainDatagramSocketImpl_peekData
  (JNIEnv *, jobject, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    receive0
 * Signature: (Ljava/net/DatagramPacket;)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_receive0
  (JNIEnv *, jobject, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    setTimeToLive
 * Signature: (I)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_setTimeToLive
  (JNIEnv *, jobject, jint);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    getTimeToLive
 * Signature: ()I
 */
JNIEXPORT jint JNICALL PlainDatagramSocketImpl_getTimeToLive
  (JNIEnv *, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    setTTL
 * Signature: (B)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_setTTL
  (JNIEnv *, jobject, jbyte);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    getTTL
 * Signature: ()B
 */
JNIEXPORT jbyte JNICALL PlainDatagramSocketImpl_getTTL
  (JNIEnv *, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    join
 * Signature: (Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_join
  (JNIEnv *, jobject, jobject, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    leave
 * Signature: (Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_leave
  (JNIEnv *, jobject, jobject, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    datagramSocketCreate
 * Signature: ()V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_datagramSocketCreate
  (JNIEnv *, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    datagramSocketClose
 * Signature: ()V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_datagramSocketClose
  (JNIEnv *, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    socketSetOption
 * Signature: (ILjava/lang/Object;)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_socketSetOption
  (JNIEnv *, jobject, jint, jobject);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    socketGetOption
 * Signature: (I)Ljava/lang/Object;
 */
JNIEXPORT jobject JNICALL PlainDatagramSocketImpl_socketGetOption
  (JNIEnv *, jobject, jint);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    connect0
 * Signature: (Ljava/net/InetAddress;I)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_connect0
  (JNIEnv *, jobject, jobject, jint);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    disconnect0
 * Signature: (I)V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_disconnect0
  (JNIEnv *, jobject, jint);

/*
 * Class:     java_net_PlainDatagramSocketImpl
 * Method:    init
 * Signature: ()V
 */
JNIEXPORT void JNICALL PlainDatagramSocketImpl_init
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
