-/* Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation
This file is part of libgcj.
#ifndef __GCJ_JNI_H__
#define __GCJ_JNI_H__
+#include <gcj/libgcj-config.h>
+
+/* We include <stdio.h> for compatibility with Sun's <jni.h>. */
+#include <stdio.h>
+
#include <stdarg.h>
#define _Jv_va_list va_list
-#ifdef __cplusplus
+#ifdef __GCJ_JNI_IMPL__
-/* This is wrong, because it pollutes the name-space too much! */
+/* If __GCJ_JNI_IMPL__ is defined, then we assume that we're building
+ libgcj itself, and we include headers which taint the namespace
+ more than is acceptable for the ordinary JNI user. */
#include <gcj/javaprims.h>
+#include <gcj/array.h>
+#include <gnu/gcj/runtime/JNIWeakRef.h>
+
+typedef gnu::gcj::runtime::JNIWeakRef *jweak;
typedef struct _Jv_JNIEnv JNIEnv;
typedef struct _Jv_JavaVM JavaVM;
#define JNI_TRUE true
#define JNI_FALSE false
-#else /* __cplusplus */
+#else /* __GCJ_JNI_IMPL__ */
+# ifdef __GNUC__
+
+/* If we're using gcc, we can use a platform-independent scheme to get
+ the right integer types. */
typedef int jbyte __attribute__((__mode__(__QI__)));
typedef int jshort __attribute__((__mode__(__HI__)));
typedef int jint __attribute__((__mode__(__SI__)));
typedef double jdouble;
typedef jint jsize;
+# else /* __GNUC__ */
+
+# ifdef JV_HAVE_INTTYPES_H
+
+/* If <inttypes.h> is available, we use it. */
+
+# include <inttypes.h>
+
+typedef int8_t jbyte;
+typedef int16_t jshort;
+typedef int32_t jint;
+typedef int64_t jlong;
+typedef float jfloat;
+typedef double jdouble;
+typedef jint jsize;
+typedef int8_t jboolean;
+typedef uint16_t jchar;
+
+# else /* JV_HAVE_INTTYPES_H */
+
+/* For now, we require either gcc or <inttypes.h>. If we did more
+ work at configure time we could get around this, but right now it
+ doesn't seem worth it. */
+# error jni.h not ported to this platform
+
+# endif /* JV_HAVE_INTTYPES_H */
+
+# endif /* __GNUC__ */
+
+# ifdef __cplusplus
+
+/* Define dummy classes and then define the JNI types as pointers. */
+struct __jobject {};
+struct __jclass : __jobject {};
+struct __jstring : __jobject {};
+struct __jthrowable : __jobject {};
+struct __jweak : __jobject {};
+struct __jarray : __jobject {};
+struct __jobjectArray : __jarray {};
+struct __jbyteArray : __jarray {};
+struct __jshortArray : __jarray {};
+struct __jintArray : __jarray {};
+struct __jlongArray : __jarray {};
+struct __jbooleanArray : __jarray {};
+struct __jcharArray : __jarray {};
+struct __jfloatArray : __jarray {};
+struct __jdoubleArray : __jarray {};
+
+typedef __jobject *jobject;
+typedef __jclass *jclass;
+typedef __jstring *jstring;
+typedef __jthrowable *jthrowable;
+typedef __jweak *jweak;
+typedef __jarray *jarray;
+typedef __jobjectArray *jobjectArray;
+typedef __jbyteArray *jbyteArray;
+typedef __jshortArray *jshortArray;
+typedef __jintArray *jintArray;
+typedef __jlongArray *jlongArray;
+typedef __jbooleanArray *jbooleanArray;
+typedef __jcharArray *jcharArray;
+typedef __jfloatArray *jfloatArray;
+typedef __jdoubleArray *jdoubleArray;
+
+#define JNI_TRUE true
+#define JNI_FALSE false
+
+typedef struct _Jv_JNIEnv JNIEnv;
+typedef struct _Jv_JavaVM JavaVM;
+
+# else /* __cplusplus */
+
+/* For C, simply define the class types as generic pointers. */
typedef void *jobject;
typedef jobject jclass;
typedef jobject jstring;
-typedef jobject jarray;
typedef jobject jthrowable;
+typedef jobject jweak;
+typedef jobject jarray;
typedef jobject jobjectArray;
typedef jobject jbyteArray;
typedef jobject jshortArray;
typedef jobject jfloatArray;
typedef jobject jdoubleArray;
-/* Dummy defines. */
-typedef void *jfieldID;
-typedef void *jmethodID;
+#define JNI_TRUE 1
+#define JNI_FALSE 0
typedef const struct JNINativeInterface *JNIEnv;
typedef const struct JNIInvokeInterface *JavaVM;
-#define JNI_TRUE 1
-#define JNI_FALSE 0
+# endif /* __cplusplus */
-#endif /* __cplusplus */
+/* Dummy defines. */
+typedef void *jfieldID;
+typedef void *jmethodID;
-/* FIXME: this is wrong. */
-typedef jobject jweak;
+#endif /* __GCJ_JNI_IMPL__ */
/* Version numbers. */
#define JNI_VERSION_1_1 0x00010001
#define JNI_VERSION_1_2 0x00010002
+#define JNI_VERSION_1_4 0x00010004
/* Used when releasing array elements. */
#define JNI_COMMIT 1
#define JNI_EDETACHED -2
#define JNI_EVERSION -3
+/* Linkage and calling conventions. This will need updating when we
+ support Windows DLLs. */
+#define JNIIMPORT
+#define JNIEXPORT
+#define JNICALL
+
#ifdef __cplusplus
extern "C"
{
jobject (*NewGlobalRef) (JNIEnv *, jobject);
void (*DeleteGlobalRef) (JNIEnv *, jobject);
- void (*DeleteLocalRef) (JNIEnv *, jobject);;
+ void (*DeleteLocalRef) (JNIEnv *, jobject);
jboolean (*IsSameObject) (JNIEnv *, jobject, jobject);
jobject (*NewLocalRef) (JNIEnv *, jobject);
jfieldID, jdouble);
jstring (*NewString) (JNIEnv *, const jchar *, jsize);
- jint (*GetStringLength) (JNIEnv *, jstring);
+ jsize (*GetStringLength) (JNIEnv *, jstring);
const jchar * (*GetStringChars) (JNIEnv *, jstring, jboolean *);
void (*ReleaseStringChars) (JNIEnv *, jstring, const jchar *);
jstring (*NewStringUTF) (JNIEnv *, const char *);
void (*GetBooleanArrayRegion) (JNIEnv *, jbooleanArray,
jsize, jsize, jboolean *);
- void (*GetByteArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*GetCharArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*GetShortArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*GetIntArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*GetLongArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*GetFloatArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*GetDoubleArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
+ void (*GetByteArrayRegion) (JNIEnv *, jbyteArray,
+ jsize, jsize, jbyte *);
+ void (*GetCharArrayRegion) (JNIEnv *, jcharArray,
+ jsize, jsize, jchar *);
+ void (*GetShortArrayRegion) (JNIEnv *, jshortArray,
+ jsize, jsize, jshort *);
+ void (*GetIntArrayRegion) (JNIEnv *, jintArray,
+ jsize, jsize, jint *);
+ void (*GetLongArrayRegion) (JNIEnv *, jlongArray,
+ jsize, jsize, jlong *);
+ void (*GetFloatArrayRegion) (JNIEnv *, jfloatArray,
+ jsize, jsize, jfloat *);
+ void (*GetDoubleArrayRegion) (JNIEnv *, jdoubleArray,
+ jsize, jsize, jdouble *);
void (*SetBooleanArrayRegion) (JNIEnv *, jbooleanArray,
jsize, jsize, jboolean *);
- void (*SetByteArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*SetCharArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*SetShortArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*SetIntArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*SetLongArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*SetFloatArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
- void (*SetDoubleArrayRegion) (JNIEnv *, jbooleanArray,
- jsize, jsize, jboolean *);
+ void (*SetByteArrayRegion) (JNIEnv *, jbyteArray,
+ jsize, jsize, jbyte *);
+ void (*SetCharArrayRegion) (JNIEnv *, jcharArray,
+ jsize, jsize, jchar *);
+ void (*SetShortArrayRegion) (JNIEnv *, jshortArray,
+ jsize, jsize, jshort *);
+ void (*SetIntArrayRegion) (JNIEnv *, jintArray,
+ jsize, jsize, jint *);
+ void (*SetLongArrayRegion) (JNIEnv *, jlongArray,
+ jsize, jsize, jlong *);
+ void (*SetFloatArrayRegion) (JNIEnv *, jfloatArray,
+ jsize, jsize, jfloat *);
+ void (*SetDoubleArrayRegion) (JNIEnv *, jdoubleArray,
+ jsize, jsize, jdouble *);
jint (*RegisterNatives) (JNIEnv *, jclass,
const JNINativeMethod *, jint);
void (*DeleteWeakGlobalRef) (JNIEnv *, jweak);
jboolean (*ExceptionCheck) (JNIEnv *);
+
+ jobject (*NewDirectByteBuffer) (JNIEnv *, void *, jlong);
+ void * (*GetDirectBufferAddress) (JNIEnv *, jobject);
+ jlong (*GetDirectBufferCapacity) (JNIEnv *, jobject);
};
#ifdef __cplusplus
/* The method table. */
struct JNINativeInterface *p;
- /* FIXME: this is really ugly. */
+ /* This is ugly, but we must live with it. */
#ifndef __GCJ_JNI_IMPL__
private:
#endif
void GetBooleanArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
{ p->GetBooleanArrayRegion (this, val0, val1, val2, val3); }
- void GetByteArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetByteArrayRegion (jbyteArray val0, jsize val1, jsize val2, jbyte * val3)
{ p->GetByteArrayRegion (this, val0, val1, val2, val3); }
- void GetCharArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetCharArrayRegion (jcharArray val0, jsize val1, jsize val2, jchar * val3)
{ p->GetCharArrayRegion (this, val0, val1, val2, val3); }
- void GetShortArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetShortArrayRegion (jshortArray val0, jsize val1, jsize val2, jshort * val3)
{ p->GetShortArrayRegion (this, val0, val1, val2, val3); }
- void GetIntArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetIntArrayRegion (jintArray val0, jsize val1, jsize val2, jint * val3)
{ p->GetIntArrayRegion (this, val0, val1, val2, val3); }
- void GetLongArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetLongArrayRegion (jlongArray val0, jsize val1, jsize val2, jlong * val3)
{ p->GetLongArrayRegion (this, val0, val1, val2, val3); }
- void GetFloatArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetFloatArrayRegion (jfloatArray val0, jsize val1, jsize val2, jfloat * val3)
{ p->GetFloatArrayRegion (this, val0, val1, val2, val3); }
- void GetDoubleArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void GetDoubleArrayRegion (jdoubleArray val0, jsize val1, jsize val2, jdouble * val3)
{ p->GetDoubleArrayRegion (this, val0, val1, val2, val3); }
void SetBooleanArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
{ p->SetBooleanArrayRegion (this, val0, val1, val2, val3); }
- void SetByteArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetByteArrayRegion (jbyteArray val0, jsize val1, jsize val2, jbyte * val3)
{ p->SetByteArrayRegion (this, val0, val1, val2, val3); }
- void SetCharArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetCharArrayRegion (jcharArray val0, jsize val1, jsize val2, jchar * val3)
{ p->SetCharArrayRegion (this, val0, val1, val2, val3); }
- void SetShortArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetShortArrayRegion (jshortArray val0, jsize val1, jsize val2, jshort * val3)
{ p->SetShortArrayRegion (this, val0, val1, val2, val3); }
- void SetIntArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetIntArrayRegion (jintArray val0, jsize val1, jsize val2, jint * val3)
{ p->SetIntArrayRegion (this, val0, val1, val2, val3); }
- void SetLongArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetLongArrayRegion (jlongArray val0, jsize val1, jsize val2, jlong * val3)
{ p->SetLongArrayRegion (this, val0, val1, val2, val3); }
- void SetFloatArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetFloatArrayRegion (jfloatArray val0, jsize val1, jsize val2, jfloat * val3)
{ p->SetFloatArrayRegion (this, val0, val1, val2, val3); }
- void SetDoubleArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
+ void SetDoubleArrayRegion (jdoubleArray val0, jsize val1, jsize val2, jdouble * val3)
{ p->SetDoubleArrayRegion (this, val0, val1, val2, val3); }
jint RegisterNatives (jclass cl0, const JNINativeMethod * val1, jint val2)
jboolean ExceptionCheck ()
{ return p->ExceptionCheck (this); }
+
+ jobject NewDirectByteBuffer (void *addr, jlong capacity)
+ { return p->NewDirectByteBuffer (this, addr, capacity); }
+
+ void *GetDirectBufferAddress (jobject buf)
+ { return p->GetDirectBufferAddress (this, buf); }
+
+ jlong GetDirectBufferCapacity (jobject buf)
+ { return p->GetDirectBufferCapacity (this, buf); }
};
#endif /* __cplusplus */
jint (*AttachCurrentThread) (JavaVM *, void **, void *);
jint (*DetachCurrentThread) (JavaVM *);
jint (*GetEnv) (JavaVM *, void **, jint);
+ jint (*AttachCurrentThreadAsDaemon) (JavaVM *, void **, void *);
};
#ifdef __cplusplus
jint GetEnv (void **penv, jint version)
{ return functions->GetEnv (this, penv, version); }
+
+ jint AttachCurrentThreadAsDaemon (void **penv, void *args)
+ { return functions->AttachCurrentThreadAsDaemon (this, penv, args); }
};
#endif /* __cplusplus */