The latest JPL from the anoncvs.
[p5sagit/p5-mst-13.2.git] / jpl / JNI / JNI.xs
index f482695..ea67a2e 100644 (file)
-/*
- * Copyright 1997, O'Reilly & Associate, Inc.
- *
- * This package may be copied under the same terms as Perl itself.
- */
-
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-#include <stdio.h>
-#include <jni.h>
-
-#ifndef PERL_VERSION
-#  include <patchlevel.h>
-#  define PERL_REVISION                5
-#  define PERL_VERSION         PATCHLEVEL
-#  define PERL_SUBVERSION      SUBVERSION
-#endif
-
-#if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))
-#  define PL_na                na
-#  define PL_sv_no     sv_no
-#  define PL_sv_undef  sv_undef
-#  define PL_dowarn    dowarn
-#endif
-
-#ifndef newSVpvn
-#  define newSVpvn(a,b)        newSVpv(a,b)
-#endif
-
-#ifndef pTHX
-#  define pTHX         void
-#  define pTHX_
-#  define aTHX
-#  define aTHX_
-#  define dTHX         extern int JNI___notused
-#endif
-
-#ifndef WIN32
-#  include <dlfcn.h>
-#endif
-
-#ifdef EMBEDDEDPERL
-extern JNIEnv* jplcurenv;
-extern int jpldebug;
-#else
-JNIEnv* jplcurenv;
-int jpldebug = 1;
-#endif
-
-#define SysRet jint
-
-#ifdef WIN32
-static void JNICALL call_my_exit(jint status)
-{
-    my_exit(status);
-}
-#else
-static void call_my_exit(jint status)
-{
-    my_exit(status);
-}
-#endif
-
-jvalue*
-makeargs(char *sig, SV** svp, int items)
-{
-    jvalue* jv = (jvalue*)safemalloc(sizeof(jvalue) * items);
-    int ix = 0;
-    char *s = sig;
-    JNIEnv* env = jplcurenv;
-    char *start;
-    STRLEN n_a;
-
-    if (jpldebug)
-       fprintf(stderr, "sig = %s, items = %d\n", sig, items);
-    if (*s++ != '(')
-       goto cleanup;
-
-    while (items--) {
-       SV *sv = *svp++;
-       start = s;
-       switch (*s++) {
-       case 'Z':
-           jv[ix++].z = (jboolean)(SvIV(sv) != 0);
-           break;
-       case 'B':
-           jv[ix++].b = (jbyte)SvIV(sv);
-           break;
-       case 'C':
-           jv[ix++].c = (jchar)SvIV(sv);
-           break;
-       case 'S':
-           jv[ix++].s = (jshort)SvIV(sv);
-           break;
-       case 'I':
-           jv[ix++].i = (jint)SvIV(sv);
-           break;
-       case 'J':
-           jv[ix++].j = (jlong)SvNV(sv);
-           break;
-       case 'F':
-           jv[ix++].f = (jfloat)SvNV(sv);
-           break;
-       case 'D':
-           jv[ix++].d = (jdouble)SvNV(sv);
-           break;
-       case '[':
-           switch (*s++) {
-           case 'Z':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jboolean* buf = (jboolean*)malloc(len * sizeof(jboolean));
-                       int i;
-                       SV** esv;
-
-                       jbooleanArray ja = (*env)->NewBooleanArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jboolean)SvIV(*esv);
-                       (*env)->SetBooleanArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jboolean);
-
-                   jbooleanArray ja = (*env)->NewBooleanArray(env, len);
-                   (*env)->SetBooleanArrayRegion(env, ja, 0, len, (jboolean*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'B':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jbyte* buf = (jbyte*)malloc(len * sizeof(jbyte));
-                       int i;
-                       SV** esv;
-
-                       jbyteArray ja = (*env)->NewByteArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jbyte)SvIV(*esv);
-                       (*env)->SetByteArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jbyte);
-
-                   jbyteArray ja = (*env)->NewByteArray(env, len);
-                   (*env)->SetByteArrayRegion(env, ja, 0, len, (jbyte*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'C':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jchar* buf = (jchar*)malloc(len * sizeof(jchar));
-                       int i;
-                       SV** esv;
-
-                       jcharArray ja = (*env)->NewCharArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jchar)SvIV(*esv);
-                       (*env)->SetCharArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jchar);
-
-                   jcharArray ja = (*env)->NewCharArray(env, len);
-                   (*env)->SetCharArrayRegion(env, ja, 0, len, (jchar*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'S':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jshort* buf = (jshort*)malloc(len * sizeof(jshort));
-                       int i;
-                       SV** esv;
-
-                       jshortArray ja = (*env)->NewShortArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jshort)SvIV(*esv);
-                       (*env)->SetShortArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jshort);
-
-                   jshortArray ja = (*env)->NewShortArray(env, len);
-                   (*env)->SetShortArrayRegion(env, ja, 0, len, (jshort*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'I':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jint* buf = (jint*)malloc(len * sizeof(jint));
-                       int i;
-                       SV** esv;
-
-                       jintArray ja = (*env)->NewIntArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jint)SvIV(*esv);
-                       (*env)->SetIntArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jint);
-
-                   jintArray ja = (*env)->NewIntArray(env, len);
-                   (*env)->SetIntArrayRegion(env, ja, 0, len, (jint*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'J':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jlong* buf = (jlong*)malloc(len * sizeof(jlong));
-                       int i;
-                       SV** esv;
-
-                       jlongArray ja = (*env)->NewLongArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jlong)SvNV(*esv);
-                       (*env)->SetLongArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jlong);
-
-                   jlongArray ja = (*env)->NewLongArray(env, len);
-                   (*env)->SetLongArrayRegion(env, ja, 0, len, (jlong*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'F':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jfloat* buf = (jfloat*)malloc(len * sizeof(jfloat));
-                       int i;
-                       SV** esv;
-
-                       jfloatArray ja = (*env)->NewFloatArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jfloat)SvNV(*esv);
-                       (*env)->SetFloatArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jfloat);
-
-                   jfloatArray ja = (*env)->NewFloatArray(env, len);
-                   (*env)->SetFloatArrayRegion(env, ja, 0, len, (jfloat*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'D':
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       jdouble* buf = (jdouble*)malloc(len * sizeof(jdouble));
-                       int i;
-                       SV** esv;
-
-                       jdoubleArray ja = (*env)->NewDoubleArray(env, len);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
-                           buf[i] = (jdouble)SvNV(*esv);
-                       (*env)->SetDoubleArrayRegion(env, ja, 0, len, buf);
-                       free((void*)buf);
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else if (SvPOK(sv)) {
-                   jsize len = sv_len(sv) / sizeof(jdouble);
-
-                   jdoubleArray ja = (*env)->NewDoubleArray(env, len);
-                   (*env)->SetDoubleArrayRegion(env, ja, 0, len, (jdouble*)SvPV(sv,n_a));
-                   jv[ix++].l = (jobject)ja;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           case 'L':
-               while (*s != ';') s++;
-               s++;
-               if (strnEQ(start, "[Ljava/lang/String;", 19)) {
-                   if (SvROK(sv)) {
-                       SV* rv = (SV*)SvRV(sv);
-                       if (SvOBJECT(rv))
-                           jv[ix++].l = (jobject)(void*)SvIV(rv);
-                       else if (SvTYPE(rv) == SVt_PVAV) {
-                           jsize len = av_len((AV*)rv) + 1;
-                           int i;
-                           SV** esv;
-                           static jclass jcl = 0;
-                           jobjectArray ja;
-
-                           if (!jcl)
-                               jcl = (*env)->FindClass(env, "java/lang/String");
-                           ja = (*env)->NewObjectArray(env, len, jcl, 0);
-                           for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
-                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
-                               (*env)->SetObjectArrayElement(env, ja, i, str);
-                           }
-                           jv[ix++].l = (jobject)ja;
-                       }
-                       else
-                           jv[ix++].l = (jobject)(void*)0;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-                   break;
-               }
-               /* FALL THROUGH */
-           default:
-               if (SvROK(sv)) {
-                   SV* rv = (SV*)SvRV(sv);
-                   if (SvOBJECT(rv))
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);
-                   else if (SvTYPE(rv) == SVt_PVAV) {
-                       jsize len = av_len((AV*)rv) + 1;
-                       int i;
-                       SV** esv;
-                      static jclass jcl = 0;
-                       jobjectArray ja;
-
-                       if (!jcl)
-                           jcl = (*env)->FindClass(env, "java/lang/Object");
-                       ja = (*env)->NewObjectArray(env, len, jcl, 0);
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
-                           if (SvROK(*esv) && (rv = SvRV(*esv)) && SvOBJECT(rv)) {
-                               (*env)->SetObjectArrayElement(env, ja, i, (jobject)(void*)SvIV(rv));
-                           }
-                           else {
-                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
-                               (*env)->SetObjectArrayElement(env, ja, i, str);
-                           }
-                       }
-                       jv[ix++].l = (jobject)ja;
-                   }
-                   else
-                       jv[ix++].l = (jobject)(void*)0;
-               }
-               else
-                   jv[ix++].l = (jobject)(void*)0;
-               break;
-           }
-           break;
-       case 'L':
-           if (!SvROK(sv) || strnEQ(s, "java/lang/String;", 17)) {
-               s += 17;
-               jv[ix++].l = (jobject)(*env)->NewStringUTF(env, (char*) SvPV(sv,n_a));
-               break;
-           }
-           while (*s != ';') s++;
-           s++;
-           if (SvROK(sv)) {
-               SV* rv = SvRV(sv);
-               jv[ix++].l = (jobject)(void*)SvIV(rv);
-           }
-           break;
-       case ')':
-           croak("too many arguments, signature: %s", sig);
-           goto cleanup;
-       default:
-           croak("panic: malformed signature: %s", s-1);
-           goto cleanup;
-       }
-
-    }
-    if (*s != ')') {
-       croak("not enough arguments, signature: %s", sig);
-       goto cleanup;
-    }
-    return jv;
-
-cleanup:
-    safefree((char*)jv);
-    return 0;
-}
-
-static int
-not_here(char *s)
-{
-    croak("%s not implemented on this architecture", s);
-    return -1;
-}
-
-static double
-constant(char *name, int arg)
-{
-    errno = 0;
-    switch (*name) {
-    case 'A':
-       break;
-    case 'B':
-       break;
-    case 'C':
-       break;
-    case 'D':
-       break;
-    case 'E':
-       break;
-    case 'F':
-       break;
-    case 'G':
-       break;
-    case 'H':
-       break;
-    case 'I':
-       break;
-    case 'J':
-       if (strEQ(name, "JNI_ABORT"))
-#ifdef JNI_ABORT
-           return JNI_ABORT;
-#else
-           goto not_there;
-#endif
-       if (strEQ(name, "JNI_COMMIT"))
-#ifdef JNI_COMMIT
-           return JNI_COMMIT;
-#else
-           goto not_there;
-#endif
-       if (strEQ(name, "JNI_ERR"))
-#ifdef JNI_ERR
-           return JNI_ERR;
-#else
-           goto not_there;
-#endif
-       if (strEQ(name, "JNI_FALSE"))
-#ifdef JNI_FALSE
-           return JNI_FALSE;
-#else
-           goto not_there;
-#endif
-       if (strEQ(name, "JNI_H"))
-#ifdef JNI_H
-#ifdef WIN32
-           return 1;
-#else
-           return JNI_H;
-#endif
-#else
-           goto not_there;
-#endif
-       if (strEQ(name, "JNI_OK"))
-#ifdef JNI_OK
-           return JNI_OK;
-#else
-           goto not_there;
-#endif
-       if (strEQ(name, "JNI_TRUE"))
-#ifdef JNI_TRUE
-           return JNI_TRUE;
-#else
-           goto not_there;
-#endif
-       break;
-    case 'K':
-       break;
-    case 'L':
-       break;
-    case 'M':
-       break;
-    case 'N':
-       break;
-    case 'O':
-       break;
-    case 'P':
-       break;
-    case 'Q':
-       break;
-    case 'R':
-       break;
-    case 'S':
-       break;
-    case 'T':
-       break;
-    case 'U':
-       break;
-    case 'V':
-       break;
-    case 'W':
-       break;
-    case 'X':
-       break;
-    case 'Y':
-       break;
-    case 'Z':
-       break;
-    }
-    errno = EINVAL;
-    return 0;
-
-not_there:
-    errno = ENOENT;
-    return 0;
-}
-
-#define FETCHENV jplcurenv
-#define RESTOREENV jplcurenv = env
-
-MODULE = JNI           PACKAGE = JNI           
-
-PROTOTYPES: ENABLE
-
-double
-constant(name,arg)
-       char *          name
-       int             arg
-
-jint
-GetVersion()
-       JNIEnv *                env = FETCHENV;
-    CODE:
-       {
-           RETVAL = (*env)->GetVersion(env);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jclass
-DefineClass(name, loader, buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jsize                   buf_len_ = NO_INIT;
-       const char *            name
-       jobject                 loader
-       const jbyte *           buf
-    CODE:
-       {
-#ifdef KAFFE
-           RETVAL = (*env)->DefineClass(env,  loader, buf, (jsize)buf_len_);
-#else
-           RETVAL = (*env)->DefineClass(env,  name, loader, buf, (jsize)buf_len_); 
-#endif
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jclass
-FindClass(name)
-       JNIEnv *                env = FETCHENV;
-       const char *            name
-    CODE:
-       {
-           RETVAL = (*env)->FindClass(env,  name);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jclass
-GetSuperclass(sub)
-       JNIEnv *                env = FETCHENV;
-       jclass                  sub
-    CODE:
-       {
-           RETVAL = (*env)->GetSuperclass(env,  sub);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-IsAssignableFrom(sub, sup)
-       JNIEnv *                env = FETCHENV;
-       jclass                  sub
-       jclass                  sup
-    CODE:
-       {
-           RETVAL = (*env)->IsAssignableFrom(env,  sub, sup);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-SysRet
-Throw(obj)
-       JNIEnv *                env = FETCHENV;
-       jthrowable              obj
-    CODE:
-       {
-           RETVAL = (*env)->Throw(env,  obj);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL    
-
-SysRet
-ThrowNew(clazz, msg)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       const char *            msg
-    CODE:
-       {
-           RETVAL = (*env)->ThrowNew(env,  clazz, msg);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jthrowable
-ExceptionOccurred()
-       JNIEnv *                env = FETCHENV;
-    CODE:
-       {
-           RETVAL = (*env)->ExceptionOccurred(env);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-ExceptionDescribe()
-       JNIEnv *                env = FETCHENV;
-    CODE:
-       {
-           (*env)->ExceptionDescribe(env);
-           RESTOREENV;
-       }
-
-void
-ExceptionClear()
-       JNIEnv *                env = FETCHENV;
-    CODE:
-       {
-           (*env)->ExceptionClear(env);
-           RESTOREENV;
-       }
-
-void
-FatalError(msg)
-       JNIEnv *                env = FETCHENV;
-       const char *            msg
-    CODE:
-       {
-           (*env)->FatalError(env,  msg);
-           RESTOREENV;
-       }
-
-jobject
-NewGlobalRef(lobj)
-       JNIEnv *                env = FETCHENV;
-       jobject                 lobj
-    CODE:
-       {
-           RETVAL = (*env)->NewGlobalRef(env, lobj);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-DeleteGlobalRef(gref)
-       JNIEnv *                env = FETCHENV;
-       jobject                 gref
-    CODE:
-       {
-           (*env)->DeleteGlobalRef(env, gref);
-           RESTOREENV;
-       }
-
-void
-DeleteLocalRef(obj)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-    CODE:
-       {
-           (*env)->DeleteLocalRef(env,  obj);
-           RESTOREENV;
-       }
-
-jboolean
-IsSameObject(obj1,obj2)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj1
-       jobject                 obj2
-    CODE:
-       {
-           RETVAL = (*env)->IsSameObject(env, obj1,obj2);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-AllocObject(clazz)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-    CODE:
-       {
-           RETVAL = (*env)->AllocObject(env, clazz);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-NewObject(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-NewObjectA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jclass
-GetObjectClass(obj)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-    CODE:
-       {
-           RETVAL = (*env)->GetObjectClass(env, obj);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-IsInstanceOf(obj,clazz)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-    CODE:
-       {
-           RETVAL = (*env)->IsInstanceOf(env, obj,clazz);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jmethodID
-GetMethodID(clazz,name,sig)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       const char *            name
-       const char *            sig
-    CODE:
-       {
-           RETVAL = (*env)->GetMethodID(env, clazz,name,sig);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-CallObjectMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-CallObjectMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-CallBooleanMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-CallBooleanMethodA(obj,methodID, args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID, args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-CallByteMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-CallByteMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-CallCharMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-CallCharMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-CallShortMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-CallShortMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-CallIntMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-CallIntMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-CallLongMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-CallLongMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-CallFloatMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-CallFloatMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-CallDoubleMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-CallDoubleMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-CallVoidMethod(obj,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           (*env)->CallVoidMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-
-void
-CallVoidMethodA(obj,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           (*env)->CallVoidMethodA(env, obj,methodID,args);
-           RESTOREENV;
-       }
-
-jobject
-CallNonvirtualObjectMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-CallNonvirtualObjectMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-CallNonvirtualBooleanMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-CallNonvirtualBooleanMethodA(obj,clazz,methodID, args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID, args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-CallNonvirtualByteMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-CallNonvirtualByteMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-CallNonvirtualCharMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-CallNonvirtualCharMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-CallNonvirtualShortMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-CallNonvirtualShortMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-CallNonvirtualIntMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-CallNonvirtualIntMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-CallNonvirtualLongMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-CallNonvirtualLongMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-CallNonvirtualFloatMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-CallNonvirtualFloatMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-CallNonvirtualDoubleMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-CallNonvirtualDoubleMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-CallNonvirtualVoidMethod(obj,clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-
-void
-CallNonvirtualVoidMethodA(obj,clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
-           RESTOREENV;
-       }
-
-jfieldID
-GetFieldID(clazz,name,sig)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       const char *            name
-       const char *            sig
-    CODE:
-       {
-           RETVAL = (*env)->GetFieldID(env, clazz,name,sig);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-GetObjectField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetObjectField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-GetBooleanField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetBooleanField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-GetByteField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetByteField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-GetCharField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetCharField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-GetShortField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetShortField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-GetIntField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetIntField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-GetLongField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetLongField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-GetFloatField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetFloatField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-GetDoubleField(obj,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetDoubleField(env, obj,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-SetObjectField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jobject                 val
-    CODE:
-       {
-           (*env)->SetObjectField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetBooleanField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jboolean                val
-    CODE:
-       {
-           (*env)->SetBooleanField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetByteField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jbyte                   val
-    CODE:
-       {
-           (*env)->SetByteField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetCharField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jchar                   val
-    CODE:
-       {
-           (*env)->SetCharField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetShortField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jshort                  val
-    CODE:
-       {
-           (*env)->SetShortField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetIntField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jint                    val
-    CODE:
-       {
-           (*env)->SetIntField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetLongField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jlong                   val
-    CODE:
-       {
-           (*env)->SetLongField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetFloatField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jfloat                  val
-    CODE:
-       {
-           (*env)->SetFloatField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-void
-SetDoubleField(obj,fieldID,val)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jdouble                 val
-    CODE:
-       {
-           (*env)->SetDoubleField(env, obj,fieldID,val);
-           RESTOREENV;
-       }
-
-jmethodID
-GetStaticMethodID(clazz,name,sig)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       const char *            name
-       const char *            sig
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticMethodID(env, clazz,name,sig);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-CallStaticObjectMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-CallStaticObjectMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-CallStaticBooleanMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-CallStaticBooleanMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-CallStaticByteMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-CallStaticByteMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-CallStaticCharMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-CallStaticCharMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-CallStaticShortMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-CallStaticShortMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-CallStaticIntMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-CallStaticIntMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-CallStaticLongMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-CallStaticLongMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-CallStaticFloatMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-CallStaticFloatMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-CallStaticDoubleMethod(clazz,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-CallStaticDoubleMethodA(clazz,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-CallStaticVoidMethod(cls,methodID,...)
-       JNIEnv *                env = FETCHENV;
-       jclass                  cls
-       jmethodID               methodID
-       char *                  sig = 0;
-       int                     argoff = $min_args;
-    CODE:
-       {
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
-           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);
-           RESTOREENV;
-       }
-
-void
-CallStaticVoidMethodA(cls,methodID,args)
-       JNIEnv *                env = FETCHENV;
-       jclass                  cls
-       jmethodID               methodID
-       char *                  sig = 0;
-       jvalue *                args
-    CODE:
-       {
-           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);
-           RESTOREENV;
-       }
-
-jfieldID
-GetStaticFieldID(clazz,name,sig)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       const char *            name
-       const char *            sig
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticFieldID(env, clazz,name,sig);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-GetStaticObjectField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticObjectField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean
-GetStaticBooleanField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticBooleanField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyte
-GetStaticByteField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticByteField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jchar
-GetStaticCharField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticCharField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshort
-GetStaticShortField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticShortField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jint
-GetStaticIntField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticIntField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlong
-GetStaticLongField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticLongField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloat
-GetStaticFloatField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticFloatField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdouble
-GetStaticDoubleField(clazz,fieldID)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-    CODE:
-       {
-           RETVAL = (*env)->GetStaticDoubleField(env, clazz,fieldID);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-SetStaticObjectField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jobject                 value
-    CODE:
-       {
-         (*env)->SetStaticObjectField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticBooleanField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jboolean                value
-    CODE:
-       {
-         (*env)->SetStaticBooleanField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticByteField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jbyte                   value
-    CODE:
-       {
-         (*env)->SetStaticByteField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticCharField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jchar                   value
-    CODE:
-       {
-         (*env)->SetStaticCharField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticShortField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jshort                  value
-    CODE:
-       {
-         (*env)->SetStaticShortField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticIntField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jint                    value
-    CODE:
-       {
-         (*env)->SetStaticIntField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticLongField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jlong                   value
-    CODE:
-       {
-         (*env)->SetStaticLongField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticFloatField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jfloat                  value
-    CODE:
-       {
-         (*env)->SetStaticFloatField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-void
-SetStaticDoubleField(clazz,fieldID,value)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       jfieldID                fieldID
-       char *                  sig = 0;
-       jdouble                 value
-    CODE:
-       {
-         (*env)->SetStaticDoubleField(env, clazz,fieldID,value);
-           RESTOREENV;
-       }
-
-jstring
-NewString(unicode)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jsize                   unicode_len_ = NO_INIT;
-       const jchar *           unicode
-    CODE:
-       {
-           RETVAL = (*env)->NewString(env, unicode, unicode_len_);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jsize
-GetStringLength(str)
-       JNIEnv *                env = FETCHENV;
-       jstring                 str
-    CODE:
-       {
-           RETVAL = (*env)->GetStringLength(env, str);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-const jchar *
-GetStringChars(str)
-       JNIEnv *                env = FETCHENV;
-       jstring                 str
-       jboolean                isCopy = NO_INIT;
-       jsize                   RETVAL_len_ = NO_INIT;
-    CODE:
-       {
-           RETVAL = (*env)->GetStringChars(env, str,&isCopy);
-           RETVAL_len_ = (*env)->GetStringLength(env, str);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-    CLEANUP:
-           (*env)->ReleaseStringChars(env, str,RETVAL);
-
-jstring
-NewStringUTF(utf)
-       JNIEnv *                env = FETCHENV;
-       const char *            utf
-    CODE:
-       {
-           RETVAL = (*env)->NewStringUTF(env, utf);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jsize
-GetStringUTFLength(str)
-       JNIEnv *                env = FETCHENV;
-       jstring                 str
-    CODE:
-       {
-           RETVAL = (*env)->GetStringUTFLength(env, str);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-const char *
-GetStringUTFChars(str)
-       JNIEnv *                env = FETCHENV;
-       jstring                 str
-       jboolean                isCopy = NO_INIT;
-    CODE:
-       {
-           RETVAL = (*env)->GetStringUTFChars(env, str,&isCopy);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-    CLEANUP:
-       (*env)->ReleaseStringUTFChars(env, str, RETVAL);
-
-
-jsize
-GetArrayLength(array)
-       JNIEnv *                env = FETCHENV;
-       jarray                  array
-    CODE:
-       {
-           RETVAL = (*env)->GetArrayLength(env, array);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobjectArray
-NewObjectArray(len,clazz,init)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-       jclass                  clazz
-       jobject                 init
-    CODE:
-       {
-           RETVAL = (*env)->NewObjectArray(env, len,clazz,init);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jobject
-GetObjectArrayElement(array,index)
-       JNIEnv *                env = FETCHENV;
-       jobjectArray            array
-       jsize                   index
-    CODE:
-       {
-           RETVAL = (*env)->GetObjectArrayElement(env, array,index);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-void
-SetObjectArrayElement(array,index,val)
-       JNIEnv *                env = FETCHENV;
-       jobjectArray            array
-       jsize                   index
-       jobject                 val
-    CODE:
-       {
-           (*env)->SetObjectArrayElement(env, array,index,val);
-           RESTOREENV;
-       }
-
-jbooleanArray
-NewBooleanArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewBooleanArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jbyteArray
-NewByteArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewByteArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jcharArray
-NewCharArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewCharArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jshortArray
-NewShortArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewShortArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jintArray
-NewIntArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewIntArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jlongArray
-NewLongArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewLongArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jfloatArray
-NewFloatArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewFloatArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jdoubleArray
-NewDoubleArray(len)
-       JNIEnv *                env = FETCHENV;
-       jsize                   len
-    CODE:
-       {
-           RETVAL = (*env)->NewDoubleArray(env, len);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-jboolean *
-GetBooleanArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jbooleanArray           array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetBooleanArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jboolean* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSViv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jboolean))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseBooleanArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jbyte *
-GetByteArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jbyteArray              array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetByteArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jbyte* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSViv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jbyte))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jchar *
-GetCharArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jcharArray              array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jchar* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSViv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jchar))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jshort *
-GetShortArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jshortArray             array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jshort* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSViv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jshort))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jint *
-GetIntArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jintArray               array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jint* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSViv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jint))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jlong *
-GetLongArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jlongArray              array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jlong* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSViv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jlong))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jfloat *
-GetFloatArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jfloatArray             array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jfloat* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSVnv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jfloat))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-jdouble *
-GetDoubleArrayElements(array)
-       JNIEnv *                env = FETCHENV;
-       jsize                   RETVAL_len_ = NO_INIT;
-       jdoubleArray            array
-       jboolean                isCopy = NO_INIT;
-    PPCODE:
-       {
-           RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy);
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);
-           if (GIMME == G_ARRAY) {
-               int i;
-               jdouble* r = RETVAL;
-               EXTEND(sp, RETVAL_len_);
-               for (i = RETVAL_len_; i; --i) {
-                   PUSHs(sv_2mortal(newSVnv(*r++)));
-               }
-           }
-           else {
-               if (RETVAL_len_) {
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
-                       (STRLEN)RETVAL_len_ * sizeof(jdouble))));
-               }
-               else
-                   PUSHs(&PL_sv_no);
-           }
-           (*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT);
-           RESTOREENV;
-       }
-
-void
-GetBooleanArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jbooleanArray           array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jboolean *              buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1);
-    CODE:
-       {
-           (*env)->GetBooleanArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jboolean));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetByteArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jbyteArray              array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jbyte *                 buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1);
-    CODE:
-       {
-           (*env)->GetByteArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jbyte));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetCharArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jcharArray              array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jchar *                 buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1);
-    CODE:
-       {
-           (*env)->GetCharArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jchar));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetShortArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jshortArray             array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jshort *                buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1);
-    CODE:
-       {
-           (*env)->GetShortArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jshort));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetIntArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jintArray               array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jint *                  buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1);
-    CODE:
-       {
-           (*env)->GetIntArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jint));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetLongArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jlongArray              array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jlong *                 buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1);
-    CODE:
-       {
-           (*env)->GetLongArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jlong));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetFloatArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jfloatArray             array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jfloat *                buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1);
-    CODE:
-       {
-           (*env)->GetFloatArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jfloat));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-GetDoubleArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       jdoubleArray            array
-       jsize                   start
-       jsize                   len
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
-       jdouble *               buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1);
-    CODE:
-       {
-           (*env)->GetDoubleArrayRegion(env, array,start,len,buf);
-           SvCUR_set(ST(3), len * sizeof(jdouble));
-           *SvEND(ST(3)) = '\0';
-           RESTOREENV;
-       }
-
-void
-SetBooleanArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jbooleanArray           array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jboolean *              buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetBooleanArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetByteArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jbyteArray              array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jbyte *                 buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetByteArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetCharArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jcharArray              array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jchar *                 buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetCharArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetShortArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jshortArray             array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jshort *                buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetShortArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetIntArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jintArray               array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jint *                  buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetIntArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetLongArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jlongArray              array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jlong *                 buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetLongArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetFloatArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jfloatArray             array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jfloat *                buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetFloatArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-void
-SetDoubleArrayRegion(array,start,len,buf)
-       JNIEnv *                env = FETCHENV;
-       STRLEN                  tmplen = NO_INIT;
-       jdoubleArray            array
-       jsize                   start
-       jsize                   len
-       jsize                   buf_len_ = NO_INIT;
-       jdouble *               buf
-    CODE:
-       {
-           if (buf_len_ < len)
-               croak("string is too short");
-           else if (buf_len_ > len && PL_dowarn)
-               warn("string is too long");
-           (*env)->SetDoubleArrayRegion(env, array,start,len,buf);
-           RESTOREENV;
-       }
-
-SysRet
-RegisterNatives(clazz,methods,nMethods)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-       JNINativeMethod *       methods
-       jint                    nMethods
-    CODE:
-       {
-           RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods);
-       }
-
-SysRet
-UnregisterNatives(clazz)
-       JNIEnv *                env = FETCHENV;
-       jclass                  clazz
-    CODE:
-       {
-           RETVAL = (*env)->UnregisterNatives(env, clazz);
-       }
-    OUTPUT:
-       RETVAL  
-   
-SysRet
-MonitorEnter(obj)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-    CODE:
-       {
-           RETVAL = (*env)->MonitorEnter(env, obj);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-SysRet
-MonitorExit(obj)
-       JNIEnv *                env = FETCHENV;
-       jobject                 obj
-    CODE:
-       {
-           RETVAL = (*env)->MonitorExit(env, obj);
-           RESTOREENV;
-       }
-    OUTPUT:
-       RETVAL
-
-JavaVM *
-GetJavaVM(...)
-       JNIEnv *                env = FETCHENV;
-    CODE:
-       {
-#ifdef JPL_DEBUG
-           jpldebug = 1;
-#else
-           jpldebug = 0;
-#endif
-           if (env) {  /* We're embedded. */
-               if ((*env)->GetJavaVM(env, &RETVAL) < 0)
-                   RETVAL = 0;
-           }
-           else {      /* We're embedding. */
-#ifdef KAFFE
-                JavaVMInitArgs vm_args;
-#else
-                JDK1_1InitArgs vm_args;
-#endif
-               char *lib;
-               if (jpldebug) {
-                   fprintf(stderr, "We're embedding Java in Perl.\n");
-               }
-
-               if (items--) {
-                   ++mark;
-                   lib = SvPV(*mark, PL_na);
-               }
-               else
-                   lib = 0;
-               if (jpldebug) {
-                   fprintf(stderr, "lib is %s.\n", lib);
-               }
-#ifdef WIN32
-        if (LoadLibrary("jvm.dll")) {
-            if (!LoadLibrary("javai.dll")) {
-                warn("Can't load javai.dll");
-            }
-        } else {
-            if (lib && !LoadLibrary(lib))
-                croak("Can't load javai.dll"); 
-        }
-#else
-               if (jpldebug) {
-                   fprintf(stderr, "Opening Java shared library.\n");
-                }
-#ifdef KAFFE
-               if (!dlopen("libkaffevm.so", RTLD_LAZY|RTLD_GLOBAL)) {
-#else
-               if (!dlopen("libjava.so", RTLD_LAZY|RTLD_GLOBAL)) {
-#endif
-                   if (lib && !dlopen(lib, RTLD_LAZY|RTLD_GLOBAL))
-                       croak("Can't load Java shared library.");
-               }
-#endif
-               /* Kaffe seems to get very upset if vm_args.version isn't set */
-#ifdef KAFFE
-               vm_args.version = JNI_VERSION_1_1;
-#endif
-               JNI_GetDefaultJavaVMInitArgs(&vm_args);
-               vm_args.exit = &call_my_exit;
-               if (jpldebug) {
-            fprintf(stderr, "items = %d\n", items);
-            fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));
-        }
-               while (items > 1) {
-                 char *s;
-                   ++mark;
-                   s = SvPV(*mark,PL_na);
-                   ++mark;
-                   if (jpldebug) {
-                fprintf(stderr, "*s = %s\n", s);
-                fprintf(stderr, "val = %s\n", SvPV(*mark, PL_na));
-            }
-                   items -= 2;
-                   if (strEQ(s, "checkSource"))
-                       vm_args.checkSource = (jint)SvIV(*mark);
-                   else if (strEQ(s, "nativeStackSize"))
-                       vm_args.nativeStackSize = (jint)SvIV(*mark);
-                   else if (strEQ(s, "javaStackSize"))
-                       vm_args.javaStackSize = (jint)SvIV(*mark);
-                   else if (strEQ(s, "minHeapSize"))
-                       vm_args.minHeapSize = (jint)SvIV(*mark);
-                   else if (strEQ(s, "maxHeapSize"))
-                       vm_args.maxHeapSize = (jint)SvIV(*mark);
-                   else if (strEQ(s, "verifyMode"))
-                       vm_args.verifyMode = (jint)SvIV(*mark);
-                   else if (strEQ(s, "classpath"))
-                       vm_args.classpath = savepv(SvPV(*mark,PL_na));
-                   else if (strEQ(s, "enableClassGC"))
-                       vm_args.enableClassGC = (jint)SvIV(*mark);
-                   else if (strEQ(s, "enableVerboseGC"))
-                       vm_args.enableVerboseGC = (jint)SvIV(*mark);
-                   else if (strEQ(s, "disableAsyncGC"))
-                       vm_args.disableAsyncGC = (jint)SvIV(*mark);
-#ifdef KAFFE
-                   else if (strEQ(s, "libraryhome"))
-                       vm_args.libraryhome = savepv(SvPV(*mark,PL_na));
-                   else if (strEQ(s, "classhome"))
-                       vm_args.classhome = savepv(SvPV(*mark,PL_na));
-                   else if (strEQ(s, "enableVerboseJIT"))
-                       vm_args.enableVerboseJIT = (jint)SvIV(*mark); 
-                   else if (strEQ(s, "enableVerboseClassloading"))
-                       vm_args.enableVerboseClassloading = (jint)SvIV(*mark); 
-                   else if (strEQ(s, "enableVerboseCall"))
-                       vm_args.enableVerboseCall = (jint)SvIV(*mark); 
-                   else if (strEQ(s, "allocHeapSize"))
-                       vm_args.allocHeapSize = (jint)SvIV(*mark); 
-#else
-                   else if (strEQ(s, "verbose"))
-                       vm_args.verbose = (jint)SvIV(*mark); 
-                   else if (strEQ(s, "debugging"))
-                       vm_args.debugging = (jboolean)SvIV(*mark);
-                   else if (strEQ(s, "debugPort"))
-                       vm_args.debugPort = (jint)SvIV(*mark); 
-#endif
-                   else
-                       croak("unrecognized option: %s", s);
-               }
-
-               if (jpldebug) {
-                   fprintf(stderr, "Creating Java VM...\n");
-                   fprintf(stderr, "Working CLASSPATH: %s\n", 
-                       vm_args.classpath);
-               }
-               if (JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args) < 0) {
-                  croak("Unable to create instance of JVM");
-                }
-               if (jpldebug) {
-                   fprintf(stderr, "Created Java VM.\n");
-               }
-
-           }
-       }
-
+/*\r
+ * Copyright 1997, O'Reilly & Associate, Inc.\r
+ *\r
+ * This package may be copied under the same terms as Perl itself.\r
+ */\r
+\r
+#include "EXTERN.h"\r
+#include "perl.h"\r
+#include "XSUB.h"\r
+\r
+#include <stdio.h>\r
+#include <jni.h>\r
+\r
+#ifndef PERL_VERSION\r
+#  include <patchlevel.h>\r
+#  define PERL_REVISION                5\r
+#  define PERL_VERSION         PATCHLEVEL\r
+#  define PERL_SUBVERSION      SUBVERSION\r
+#endif\r
+\r
+#if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))\r
+#  define PL_na                na\r
+#  define PL_sv_no     sv_no\r
+#  define PL_sv_undef  sv_undef\r
+#  define PL_dowarn    dowarn\r
+#endif\r
+\r
+#ifndef newSVpvn\r
+#  define newSVpvn(a,b)        newSVpv(a,b)\r
+#endif\r
+\r
+#ifndef pTHX\r
+#  define pTHX         void\r
+#  define pTHX_\r
+#  define aTHX\r
+#  define aTHX_\r
+#  define dTHX         extern int JNI___notused\r
+#endif\r
+\r
+#ifndef WIN32\r
+#  include <dlfcn.h>\r
+#endif\r
+\r
+#ifdef EMBEDDEDPERL\r
+extern JNIEnv* jplcurenv;\r
+extern int jpldebug;\r
+#else\r
+JNIEnv* jplcurenv;\r
+int jpldebug = 1;\r
+#endif\r
+\r
+#define SysRet jint\r
+\r
+#ifdef WIN32\r
+static void JNICALL call_my_exit(jint status)\r
+{\r
+    my_exit(status);\r
+}\r
+#else\r
+static void call_my_exit(jint status)\r
+{\r
+    my_exit(status);\r
+}\r
+#endif\r
+\r
+jvalue*\r
+makeargs(char *sig, SV** svp, int items)\r
+{\r
+    jvalue* jv = (jvalue*)safemalloc(sizeof(jvalue) * items);\r
+    int ix = 0;\r
+    char *s = sig;\r
+    JNIEnv* env = jplcurenv;\r
+    char *start;\r
+    STRLEN n_a;\r
+\r
+    if (jpldebug)\r
+       fprintf(stderr, "sig = %s, items = %d\n", sig, items);\r
+    if (*s++ != '(')\r
+       goto cleanup;\r
+\r
+    while (items--) {\r
+       SV *sv = *svp++;\r
+       start = s;\r
+       switch (*s++) {\r
+       case 'Z':\r
+           jv[ix++].z = (jboolean)(SvIV(sv) != 0);\r
+           break;\r
+       case 'B':\r
+           jv[ix++].b = (jbyte)SvIV(sv);\r
+           break;\r
+       case 'C':\r
+           jv[ix++].c = (jchar)SvIV(sv);\r
+           break;\r
+       case 'S':\r
+           jv[ix++].s = (jshort)SvIV(sv);\r
+           break;\r
+       case 'I':\r
+           jv[ix++].i = (jint)SvIV(sv);\r
+           break;\r
+       case 'J':\r
+           jv[ix++].j = (jlong)SvNV(sv);\r
+           break;\r
+       case 'F':\r
+           jv[ix++].f = (jfloat)SvNV(sv);\r
+           break;\r
+       case 'D':\r
+           jv[ix++].d = (jdouble)SvNV(sv);\r
+           break;\r
+       case '[':\r
+           switch (*s++) {\r
+           case 'Z':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jboolean* buf = (jboolean*)malloc(len * sizeof(jboolean));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jbooleanArray ja = (*env)->NewBooleanArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jboolean)SvIV(*esv);\r
+                       (*env)->SetBooleanArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jboolean);\r
+\r
+                   jbooleanArray ja = (*env)->NewBooleanArray(env, len);\r
+                   (*env)->SetBooleanArrayRegion(env, ja, 0, len, (jboolean*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'B':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jbyte* buf = (jbyte*)malloc(len * sizeof(jbyte));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jbyteArray ja = (*env)->NewByteArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jbyte)SvIV(*esv);\r
+                       (*env)->SetByteArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jbyte);\r
+\r
+                   jbyteArray ja = (*env)->NewByteArray(env, len);\r
+                   (*env)->SetByteArrayRegion(env, ja, 0, len, (jbyte*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'C':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jchar* buf = (jchar*)malloc(len * sizeof(jchar));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jcharArray ja = (*env)->NewCharArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jchar)SvIV(*esv);\r
+                       (*env)->SetCharArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jchar);\r
+\r
+                   jcharArray ja = (*env)->NewCharArray(env, len);\r
+                   (*env)->SetCharArrayRegion(env, ja, 0, len, (jchar*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'S':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jshort* buf = (jshort*)malloc(len * sizeof(jshort));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jshortArray ja = (*env)->NewShortArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jshort)SvIV(*esv);\r
+                       (*env)->SetShortArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jshort);\r
+\r
+                   jshortArray ja = (*env)->NewShortArray(env, len);\r
+                   (*env)->SetShortArrayRegion(env, ja, 0, len, (jshort*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'I':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jint* buf = (jint*)malloc(len * sizeof(jint));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jintArray ja = (*env)->NewIntArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jint)SvIV(*esv);\r
+                       (*env)->SetIntArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jint);\r
+\r
+                   jintArray ja = (*env)->NewIntArray(env, len);\r
+                   (*env)->SetIntArrayRegion(env, ja, 0, len, (jint*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'J':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jlong* buf = (jlong*)malloc(len * sizeof(jlong));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jlongArray ja = (*env)->NewLongArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jlong)SvNV(*esv);\r
+                       (*env)->SetLongArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jlong);\r
+\r
+                   jlongArray ja = (*env)->NewLongArray(env, len);\r
+                   (*env)->SetLongArrayRegion(env, ja, 0, len, (jlong*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'F':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jfloat* buf = (jfloat*)malloc(len * sizeof(jfloat));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jfloatArray ja = (*env)->NewFloatArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jfloat)SvNV(*esv);\r
+                       (*env)->SetFloatArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jfloat);\r
+\r
+                   jfloatArray ja = (*env)->NewFloatArray(env, len);\r
+                   (*env)->SetFloatArrayRegion(env, ja, 0, len, (jfloat*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'D':\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       jdouble* buf = (jdouble*)malloc(len * sizeof(jdouble));\r
+                       int i;\r
+                       SV** esv;\r
+\r
+                       jdoubleArray ja = (*env)->NewDoubleArray(env, len);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
+                           buf[i] = (jdouble)SvNV(*esv);\r
+                       (*env)->SetDoubleArrayRegion(env, ja, 0, len, buf);\r
+                       free((void*)buf);\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else if (SvPOK(sv)) {\r
+                   jsize len = sv_len(sv) / sizeof(jdouble);\r
+\r
+                   jdoubleArray ja = (*env)->NewDoubleArray(env, len);\r
+                   (*env)->SetDoubleArrayRegion(env, ja, 0, len, (jdouble*)SvPV(sv,n_a));\r
+                   jv[ix++].l = (jobject)ja;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           case 'L':\r
+               while (*s != ';') s++;\r
+               s++;\r
+               if (strnEQ(start, "[Ljava/lang/String;", 19)) {\r
+                   if (SvROK(sv)) {\r
+                       SV* rv = (SV*)SvRV(sv);\r
+                       if (SvOBJECT(rv))\r
+                           jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                       else if (SvTYPE(rv) == SVt_PVAV) {\r
+                           jsize len = av_len((AV*)rv) + 1;\r
+                           int i;\r
+                           SV** esv;\r
+                           static jclass jcl = 0;\r
+                           jobjectArray ja;\r
+\r
+                           if (!jcl)\r
+                               jcl = (*env)->FindClass(env, "java/lang/String");\r
+                           ja = (*env)->NewObjectArray(env, len, jcl, 0);\r
+                           for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {\r
+                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));\r
+                               (*env)->SetObjectArrayElement(env, ja, i, str);\r
+                           }\r
+                           jv[ix++].l = (jobject)ja;\r
+                       }\r
+                       else\r
+                           jv[ix++].l = (jobject)(void*)0;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+                   break;\r
+               }\r
+               /* FALL THROUGH */\r
+           default:\r
+               if (SvROK(sv)) {\r
+                   SV* rv = (SV*)SvRV(sv);\r
+                   if (SvOBJECT(rv))\r
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+                   else if (SvTYPE(rv) == SVt_PVAV) {\r
+                       jsize len = av_len((AV*)rv) + 1;\r
+                       int i;\r
+                       SV** esv;\r
+                      static jclass jcl = 0;\r
+                       jobjectArray ja;\r
+\r
+                       if (!jcl)\r
+                           jcl = (*env)->FindClass(env, "java/lang/Object");\r
+                       ja = (*env)->NewObjectArray(env, len, jcl, 0);\r
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {\r
+                           if (SvROK(*esv) && (rv = SvRV(*esv)) && SvOBJECT(rv)) {\r
+                               (*env)->SetObjectArrayElement(env, ja, i, (jobject)(void*)SvIV(rv));\r
+                           }\r
+                           else {\r
+                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));\r
+                               (*env)->SetObjectArrayElement(env, ja, i, str);\r
+                           }\r
+                       }\r
+                       jv[ix++].l = (jobject)ja;\r
+                   }\r
+                   else\r
+                       jv[ix++].l = (jobject)(void*)0;\r
+               }\r
+               else\r
+                   jv[ix++].l = (jobject)(void*)0;\r
+               break;\r
+           }\r
+           break;\r
+       case 'L':\r
+           if (!SvROK(sv) || strnEQ(s, "java/lang/String;", 17)) {\r
+               s += 17;\r
+               jv[ix++].l = (jobject)(*env)->NewStringUTF(env, (char*) SvPV(sv,n_a));\r
+               break;\r
+           }\r
+           while (*s != ';') s++;\r
+           s++;\r
+           if (SvROK(sv)) {\r
+               SV* rv = SvRV(sv);\r
+               jv[ix++].l = (jobject)(void*)SvIV(rv);\r
+           }\r
+           break;\r
+       case ')':\r
+           croak("too many arguments, signature: %s", sig);\r
+           goto cleanup;\r
+       default:\r
+           croak("panic: malformed signature: %s", s-1);\r
+           goto cleanup;\r
+       }\r
+\r
+    }\r
+    if (*s != ')') {\r
+       croak("not enough arguments, signature: %s", sig);\r
+       goto cleanup;\r
+    }\r
+    return jv;\r
+\r
+cleanup:\r
+    safefree((char*)jv);\r
+    return 0;\r
+}\r
+\r
+static int\r
+not_here(char *s)\r
+{\r
+    croak("%s not implemented on this architecture", s);\r
+    return -1;\r
+}\r
+\r
+static double\r
+constant(char *name, int arg)\r
+{\r
+    errno = 0;\r
+    switch (*name) {\r
+    case 'A':\r
+       break;\r
+    case 'B':\r
+       break;\r
+    case 'C':\r
+       break;\r
+    case 'D':\r
+       break;\r
+    case 'E':\r
+       break;\r
+    case 'F':\r
+       break;\r
+    case 'G':\r
+       break;\r
+    case 'H':\r
+       break;\r
+    case 'I':\r
+       break;\r
+    case 'J':\r
+       if (strEQ(name, "JNI_ABORT"))\r
+#ifdef JNI_ABORT\r
+           return JNI_ABORT;\r
+#else\r
+           goto not_there;\r
+#endif\r
+       if (strEQ(name, "JNI_COMMIT"))\r
+#ifdef JNI_COMMIT\r
+           return JNI_COMMIT;\r
+#else\r
+           goto not_there;\r
+#endif\r
+       if (strEQ(name, "JNI_ERR"))\r
+#ifdef JNI_ERR\r
+           return JNI_ERR;\r
+#else\r
+           goto not_there;\r
+#endif\r
+       if (strEQ(name, "JNI_FALSE"))\r
+#ifdef JNI_FALSE\r
+           return JNI_FALSE;\r
+#else\r
+           goto not_there;\r
+#endif\r
+       if (strEQ(name, "JNI_H"))\r
+#ifdef JNI_H\r
+#ifdef WIN32\r
+           return 1;\r
+#else\r
+           return JNI_H;\r
+#endif\r
+#else\r
+           goto not_there;\r
+#endif\r
+       if (strEQ(name, "JNI_OK"))\r
+#ifdef JNI_OK\r
+           return JNI_OK;\r
+#else\r
+           goto not_there;\r
+#endif\r
+       if (strEQ(name, "JNI_TRUE"))\r
+#ifdef JNI_TRUE\r
+           return JNI_TRUE;\r
+#else\r
+           goto not_there;\r
+#endif\r
+       break;\r
+    case 'K':\r
+       break;\r
+    case 'L':\r
+       break;\r
+    case 'M':\r
+       break;\r
+    case 'N':\r
+       break;\r
+    case 'O':\r
+       break;\r
+    case 'P':\r
+       break;\r
+    case 'Q':\r
+       break;\r
+    case 'R':\r
+       break;\r
+    case 'S':\r
+       break;\r
+    case 'T':\r
+       break;\r
+    case 'U':\r
+       break;\r
+    case 'V':\r
+       break;\r
+    case 'W':\r
+       break;\r
+    case 'X':\r
+       break;\r
+    case 'Y':\r
+       break;\r
+    case 'Z':\r
+       break;\r
+    }\r
+    errno = EINVAL;\r
+    return 0;\r
+\r
+not_there:\r
+    errno = ENOENT;\r
+    return 0;\r
+}\r
+\r
+#define FETCHENV jplcurenv\r
+#define RESTOREENV jplcurenv = env\r
+\r
+MODULE = JNI           PACKAGE = JNI           \r
+\r
+PROTOTYPES: ENABLE\r
+\r
+double\r
+constant(name,arg)\r
+       char *          name\r
+       int             arg\r
+\r
+jint\r
+GetVersion()\r
+       JNIEnv *                env = FETCHENV;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetVersion(env);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jclass\r
+DefineClass(name, loader, buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jsize                   buf_len_ = NO_INIT;\r
+       const char *            name\r
+       jobject                 loader\r
+       const jbyte *           buf\r
+    CODE:\r
+       {\r
+#ifdef KAFFE\r
+           RETVAL = (*env)->DefineClass(env,  loader, buf, (jsize)buf_len_);\r
+#else\r
+           RETVAL = (*env)->DefineClass(env,  name, loader, buf, (jsize)buf_len_); \r
+#endif\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jclass\r
+FindClass(name)\r
+       JNIEnv *                env = FETCHENV;\r
+       const char *            name\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->FindClass(env,  name);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jclass\r
+GetSuperclass(sub)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  sub\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetSuperclass(env,  sub);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+IsAssignableFrom(sub, sup)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  sub\r
+       jclass                  sup\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->IsAssignableFrom(env,  sub, sup);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+SysRet\r
+Throw(obj)\r
+       JNIEnv *                env = FETCHENV;\r
+       jthrowable              obj\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->Throw(env,  obj);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL    \r
+\r
+SysRet\r
+ThrowNew(clazz, msg)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       const char *            msg\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->ThrowNew(env,  clazz, msg);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jthrowable\r
+ExceptionOccurred()\r
+       JNIEnv *                env = FETCHENV;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->ExceptionOccurred(env);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+ExceptionDescribe()\r
+       JNIEnv *                env = FETCHENV;\r
+    CODE:\r
+       {\r
+           (*env)->ExceptionDescribe(env);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+ExceptionClear()\r
+       JNIEnv *                env = FETCHENV;\r
+    CODE:\r
+       {\r
+           (*env)->ExceptionClear(env);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+FatalError(msg)\r
+       JNIEnv *                env = FETCHENV;\r
+       const char *            msg\r
+    CODE:\r
+       {\r
+           (*env)->FatalError(env,  msg);\r
+           RESTOREENV;\r
+       }\r
+\r
+jobject\r
+NewGlobalRef(lobj)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 lobj\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewGlobalRef(env, lobj);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+DeleteGlobalRef(gref)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 gref\r
+    CODE:\r
+       {\r
+           (*env)->DeleteGlobalRef(env, gref);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+DeleteLocalRef(obj)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+    CODE:\r
+       {\r
+           (*env)->DeleteLocalRef(env,  obj);\r
+           RESTOREENV;\r
+       }\r
+\r
+jboolean\r
+IsSameObject(obj1,obj2)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj1\r
+       jobject                 obj2\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->IsSameObject(env, obj1,obj2);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+AllocObject(clazz)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->AllocObject(env, clazz);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+NewObject(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+NewObjectA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jclass\r
+GetObjectClass(obj)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetObjectClass(env, obj);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+IsInstanceOf(obj,clazz)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->IsInstanceOf(env, obj,clazz);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jmethodID\r
+GetMethodID(clazz,name,sig)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       const char *            name\r
+       const char *            sig\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetMethodID(env, clazz,name,sig);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+CallObjectMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+CallObjectMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+CallBooleanMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+CallBooleanMethodA(obj,methodID, args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID, args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+CallByteMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+CallByteMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+CallCharMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+CallCharMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+CallShortMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+CallShortMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+CallIntMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+CallIntMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+CallLongMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+CallLongMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+CallFloatMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+CallFloatMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+CallDoubleMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+CallDoubleMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+CallVoidMethod(obj,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           (*env)->CallVoidMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+CallVoidMethodA(obj,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           (*env)->CallVoidMethodA(env, obj,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+\r
+jobject\r
+CallNonvirtualObjectMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+CallNonvirtualObjectMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+CallNonvirtualBooleanMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+CallNonvirtualBooleanMethodA(obj,clazz,methodID, args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID, args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+CallNonvirtualByteMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+CallNonvirtualByteMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+CallNonvirtualCharMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+CallNonvirtualCharMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+CallNonvirtualShortMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+CallNonvirtualShortMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+CallNonvirtualIntMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+CallNonvirtualIntMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+CallNonvirtualLongMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+CallNonvirtualLongMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+CallNonvirtualFloatMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+CallNonvirtualFloatMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+CallNonvirtualDoubleMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+CallNonvirtualDoubleMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+CallNonvirtualVoidMethod(obj,clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+CallNonvirtualVoidMethodA(obj,clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+\r
+jfieldID\r
+GetFieldID(clazz,name,sig)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       const char *            name\r
+       const char *            sig\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetFieldID(env, clazz,name,sig);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+GetObjectField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetObjectField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+GetBooleanField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetBooleanField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+GetByteField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetByteField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+GetCharField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetCharField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+GetShortField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetShortField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+GetIntField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetIntField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+GetLongField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetLongField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+GetFloatField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetFloatField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+GetDoubleField(obj,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetDoubleField(env, obj,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+SetObjectField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jobject                 val\r
+    CODE:\r
+       {\r
+           (*env)->SetObjectField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetBooleanField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jboolean                val\r
+    CODE:\r
+       {\r
+           (*env)->SetBooleanField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetByteField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jbyte                   val\r
+    CODE:\r
+       {\r
+           (*env)->SetByteField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetCharField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jchar                   val\r
+    CODE:\r
+       {\r
+           (*env)->SetCharField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetShortField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jshort                  val\r
+    CODE:\r
+       {\r
+           (*env)->SetShortField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetIntField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jint                    val\r
+    CODE:\r
+       {\r
+           (*env)->SetIntField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetLongField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jlong                   val\r
+    CODE:\r
+       {\r
+           (*env)->SetLongField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetFloatField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jfloat                  val\r
+    CODE:\r
+       {\r
+           (*env)->SetFloatField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetDoubleField(obj,fieldID,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jdouble                 val\r
+    CODE:\r
+       {\r
+           (*env)->SetDoubleField(env, obj,fieldID,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+jmethodID\r
+GetStaticMethodID(clazz,name,sig)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       const char *            name\r
+       const char *            sig\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticMethodID(env, clazz,name,sig);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+CallStaticObjectMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+CallStaticObjectMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+CallStaticBooleanMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+CallStaticBooleanMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+CallStaticByteMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+CallStaticByteMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+CallStaticCharMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+CallStaticCharMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+CallStaticShortMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+CallStaticShortMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+CallStaticIntMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+CallStaticIntMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+CallStaticLongMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+CallStaticLongMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+CallStaticFloatMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+CallStaticFloatMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+CallStaticDoubleMethod(clazz,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+CallStaticDoubleMethodA(clazz,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+CallStaticVoidMethod(cls,methodID,...)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  cls\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       int                     argoff = $min_args;\r
+    CODE:\r
+       {\r
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
+           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+CallStaticVoidMethodA(cls,methodID,args)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  cls\r
+       jmethodID               methodID\r
+       char *                  sig = 0;\r
+       jvalue *                args\r
+    CODE:\r
+       {\r
+           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);\r
+           RESTOREENV;\r
+       }\r
+\r
+jfieldID\r
+GetStaticFieldID(clazz,name,sig)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       const char *            name\r
+       const char *            sig\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticFieldID(env, clazz,name,sig);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+GetStaticObjectField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticObjectField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean\r
+GetStaticBooleanField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticBooleanField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyte\r
+GetStaticByteField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticByteField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jchar\r
+GetStaticCharField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticCharField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshort\r
+GetStaticShortField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticShortField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jint\r
+GetStaticIntField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticIntField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlong\r
+GetStaticLongField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticLongField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloat\r
+GetStaticFloatField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticFloatField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdouble\r
+GetStaticDoubleField(clazz,fieldID)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStaticDoubleField(env, clazz,fieldID);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+SetStaticObjectField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jobject                 value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticObjectField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticBooleanField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jboolean                value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticBooleanField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticByteField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jbyte                   value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticByteField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticCharField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jchar                   value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticCharField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticShortField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jshort                  value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticShortField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticIntField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jint                    value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticIntField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticLongField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jlong                   value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticLongField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticFloatField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jfloat                  value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticFloatField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetStaticDoubleField(clazz,fieldID,value)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       jfieldID                fieldID\r
+       char *                  sig = 0;\r
+       jdouble                 value\r
+    CODE:\r
+       {\r
+         (*env)->SetStaticDoubleField(env, clazz,fieldID,value);\r
+           RESTOREENV;\r
+       }\r
+\r
+jstring\r
+NewString(unicode)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jsize                   unicode_len_ = NO_INIT;\r
+       const jchar *           unicode\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewString(env, unicode, unicode_len_);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jsize\r
+GetStringLength(str)\r
+       JNIEnv *                env = FETCHENV;\r
+       jstring                 str\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStringLength(env, str);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+const jchar *\r
+GetStringChars(str)\r
+       JNIEnv *                env = FETCHENV;\r
+       jstring                 str\r
+       jboolean                isCopy = NO_INIT;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStringChars(env, str,&isCopy);\r
+           RETVAL_len_ = (*env)->GetStringLength(env, str);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+    CLEANUP:\r
+           (*env)->ReleaseStringChars(env, str,RETVAL);\r
+\r
+jstring\r
+NewStringUTF(utf)\r
+       JNIEnv *                env = FETCHENV;\r
+       const char *            utf\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewStringUTF(env, utf);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jsize\r
+GetStringUTFLength(str)\r
+       JNIEnv *                env = FETCHENV;\r
+       jstring                 str\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStringUTFLength(env, str);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+const char *\r
+GetStringUTFChars(str)\r
+       JNIEnv *                env = FETCHENV;\r
+       jstring                 str\r
+       jboolean                isCopy = NO_INIT;\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetStringUTFChars(env, str,&isCopy);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+    CLEANUP:\r
+       (*env)->ReleaseStringUTFChars(env, str, RETVAL);\r
+\r
+\r
+jsize\r
+GetArrayLength(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jarray                  array\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetArrayLength(env, array);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobjectArray\r
+NewObjectArray(len,clazz,init)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+       jclass                  clazz\r
+       jobject                 init\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewObjectArray(env, len,clazz,init);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jobject\r
+GetObjectArrayElement(array,index)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobjectArray            array\r
+       jsize                   index\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->GetObjectArrayElement(env, array,index);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+void\r
+SetObjectArrayElement(array,index,val)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobjectArray            array\r
+       jsize                   index\r
+       jobject                 val\r
+    CODE:\r
+       {\r
+           (*env)->SetObjectArrayElement(env, array,index,val);\r
+           RESTOREENV;\r
+       }\r
+\r
+jbooleanArray\r
+NewBooleanArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewBooleanArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jbyteArray\r
+NewByteArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewByteArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jcharArray\r
+NewCharArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewCharArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jshortArray\r
+NewShortArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewShortArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jintArray\r
+NewIntArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewIntArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jlongArray\r
+NewLongArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewLongArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jfloatArray\r
+NewFloatArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewFloatArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jdoubleArray\r
+NewDoubleArray(len)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   len\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->NewDoubleArray(env, len);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+jboolean *\r
+GetBooleanArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jbooleanArray           array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetBooleanArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jboolean* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSViv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jboolean))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseBooleanArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jbyte *\r
+GetByteArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jbyteArray              array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetByteArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jbyte* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSViv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jbyte))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jchar *\r
+GetCharArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jcharArray              array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jchar* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSViv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jchar))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jshort *\r
+GetShortArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jshortArray             array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jshort* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSViv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jshort))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jint *\r
+GetIntArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jintArray               array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jint* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSViv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jint))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jlong *\r
+GetLongArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jlongArray              array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jlong* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSViv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jlong))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jfloat *\r
+GetFloatArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jfloatArray             array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jfloat* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSVnv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jfloat))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+jdouble *\r
+GetDoubleArrayElements(array)\r
+       JNIEnv *                env = FETCHENV;\r
+       jsize                   RETVAL_len_ = NO_INIT;\r
+       jdoubleArray            array\r
+       jboolean                isCopy = NO_INIT;\r
+    PPCODE:\r
+       {\r
+           RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy);\r
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
+           if (GIMME == G_ARRAY) {\r
+               int i;\r
+               jdouble* r = RETVAL;\r
+               EXTEND(sp, RETVAL_len_);\r
+               for (i = RETVAL_len_; i; --i) {\r
+                   PUSHs(sv_2mortal(newSVnv(*r++)));\r
+               }\r
+           }\r
+           else {\r
+               if (RETVAL_len_) {\r
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
+                       (STRLEN)RETVAL_len_ * sizeof(jdouble))));\r
+               }\r
+               else\r
+                   PUSHs(&PL_sv_no);\r
+           }\r
+           (*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetBooleanArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jbooleanArray           array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jboolean *              buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetBooleanArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jboolean));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetByteArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jbyteArray              array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jbyte *                 buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetByteArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jbyte));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetCharArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jcharArray              array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jchar *                 buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetCharArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jchar));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetShortArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jshortArray             array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jshort *                buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetShortArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jshort));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetIntArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jintArray               array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jint *                  buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetIntArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jint));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetLongArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jlongArray              array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jlong *                 buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetLongArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jlong));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetFloatArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jfloatArray             array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jfloat *                buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetFloatArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jfloat));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+GetDoubleArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       jdoubleArray            array\r
+       jsize                   start\r
+       jsize                   len\r
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
+       jdouble *               buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1);\r
+    CODE:\r
+       {\r
+           (*env)->GetDoubleArrayRegion(env, array,start,len,buf);\r
+           SvCUR_set(ST(3), len * sizeof(jdouble));\r
+           *SvEND(ST(3)) = '\0';\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetBooleanArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jbooleanArray           array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jboolean *              buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetBooleanArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetByteArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jbyteArray              array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jbyte *                 buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetByteArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetCharArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jcharArray              array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jchar *                 buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetCharArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetShortArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jshortArray             array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jshort *                buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetShortArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetIntArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jintArray               array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jint *                  buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetIntArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetLongArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jlongArray              array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jlong *                 buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetLongArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetFloatArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jfloatArray             array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jfloat *                buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetFloatArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+void\r
+SetDoubleArrayRegion(array,start,len,buf)\r
+       JNIEnv *                env = FETCHENV;\r
+       STRLEN                  tmplen = NO_INIT;\r
+       jdoubleArray            array\r
+       jsize                   start\r
+       jsize                   len\r
+       jsize                   buf_len_ = NO_INIT;\r
+       jdouble *               buf\r
+    CODE:\r
+       {\r
+           if (buf_len_ < len)\r
+               croak("string is too short");\r
+           else if (buf_len_ > len && PL_dowarn)\r
+               warn("string is too long");\r
+           (*env)->SetDoubleArrayRegion(env, array,start,len,buf);\r
+           RESTOREENV;\r
+       }\r
+\r
+SysRet\r
+RegisterNatives(clazz,methods,nMethods)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+       JNINativeMethod *       methods\r
+       jint                    nMethods\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods);\r
+       }\r
+\r
+SysRet\r
+UnregisterNatives(clazz)\r
+       JNIEnv *                env = FETCHENV;\r
+       jclass                  clazz\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->UnregisterNatives(env, clazz);\r
+       }\r
+    OUTPUT:\r
+       RETVAL  \r
+   \r
+SysRet\r
+MonitorEnter(obj)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->MonitorEnter(env, obj);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+SysRet\r
+MonitorExit(obj)\r
+       JNIEnv *                env = FETCHENV;\r
+       jobject                 obj\r
+    CODE:\r
+       {\r
+           RETVAL = (*env)->MonitorExit(env, obj);\r
+           RESTOREENV;\r
+       }\r
+    OUTPUT:\r
+       RETVAL\r
+\r
+JavaVM *\r
+GetJavaVM(...)\r
+       JNIEnv *                env = FETCHENV;\r
+    CODE:\r
+       {\r
+#ifdef JPL_DEBUG\r
+           jpldebug = 1;\r
+#else\r
+           jpldebug = 0;\r
+#endif\r
+           if (env) {  /* We're embedded. */\r
+               if ((*env)->GetJavaVM(env, &RETVAL) < 0)\r
+                   RETVAL = 0;\r
+           }\r
+           else {      /* We're embedding. */\r
+#ifdef KAFFE\r
+                JavaVMInitArgs vm_args;\r
+#else\r
+                JDK1_1InitArgs vm_args;\r
+#endif\r
+               char *lib;\r
+               if (jpldebug) {\r
+                   fprintf(stderr, "We're embedding Java in Perl.\n");\r
+               }\r
+\r
+               if (items--) {\r
+                   ++mark;\r
+                   lib = SvPV(*mark, PL_na);\r
+               }\r
+               else\r
+                   lib = 0;\r
+               if (jpldebug) {\r
+                   fprintf(stderr, "lib is %s.\n", lib);\r
+               }\r
+#ifdef WIN32\r
+        if (LoadLibrary("jvm.dll")) {\r
+            if (!LoadLibrary("javai.dll")) {\r
+                warn("Can't load javai.dll");\r
+            }\r
+        } else {\r
+            if (lib && !LoadLibrary(lib))\r
+                croak("Can't load javai.dll"); \r
+        }\r
+#else\r
+               if (jpldebug) {\r
+                   fprintf(stderr, "Opening Java shared library.\n");\r
+                }\r
+#ifdef KAFFE\r
+               if (!dlopen("libkaffevm.so", RTLD_LAZY|RTLD_GLOBAL)) {\r
+#else\r
+               if (!dlopen("libjava.so", RTLD_LAZY|RTLD_GLOBAL)) {\r
+#endif\r
+                   if (lib && !dlopen(lib, RTLD_LAZY|RTLD_GLOBAL))\r
+                       croak("Can't load Java shared library.");\r
+               }\r
+#endif\r
+               /* Kaffe seems to get very upset if vm_args.version isn't set */\r
+#ifdef KAFFE\r
+               vm_args.version = JNI_VERSION_1_1;\r
+#endif\r
+               JNI_GetDefaultJavaVMInitArgs(&vm_args);\r
+               vm_args.exit = &call_my_exit;\r
+               if (jpldebug) {\r
+            fprintf(stderr, "items = %d\n", items);\r
+            fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));\r
+        }\r
+               while (items > 1) {\r
+                 char *s;\r
+                   ++mark;\r
+                   s = SvPV(*mark,PL_na);\r
+                   ++mark;\r
+                   if (jpldebug) {\r
+                fprintf(stderr, "*s = %s\n", s);\r
+                fprintf(stderr, "val = %s\n", SvPV(*mark, PL_na));\r
+            }\r
+                   items -= 2;\r
+                   if (strEQ(s, "checkSource"))\r
+                       vm_args.checkSource = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "nativeStackSize"))\r
+                       vm_args.nativeStackSize = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "javaStackSize"))\r
+                       vm_args.javaStackSize = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "minHeapSize"))\r
+                       vm_args.minHeapSize = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "maxHeapSize"))\r
+                       vm_args.maxHeapSize = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "verifyMode"))\r
+                       vm_args.verifyMode = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "classpath"))\r
+                       vm_args.classpath = savepv(SvPV(*mark,PL_na));\r
+                   else if (strEQ(s, "enableClassGC"))\r
+                       vm_args.enableClassGC = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "enableVerboseGC"))\r
+                       vm_args.enableVerboseGC = (jint)SvIV(*mark);\r
+                   else if (strEQ(s, "disableAsyncGC"))\r
+                       vm_args.disableAsyncGC = (jint)SvIV(*mark);\r
+#ifdef KAFFE\r
+                   else if (strEQ(s, "libraryhome"))\r
+                       vm_args.libraryhome = savepv(SvPV(*mark,PL_na));\r
+                   else if (strEQ(s, "classhome"))\r
+                       vm_args.classhome = savepv(SvPV(*mark,PL_na));\r
+                   else if (strEQ(s, "enableVerboseJIT"))\r
+                       vm_args.enableVerboseJIT = (jint)SvIV(*mark); \r
+                   else if (strEQ(s, "enableVerboseClassloading"))\r
+                       vm_args.enableVerboseClassloading = (jint)SvIV(*mark); \r
+                   else if (strEQ(s, "enableVerboseCall"))\r
+                       vm_args.enableVerboseCall = (jint)SvIV(*mark); \r
+                   else if (strEQ(s, "allocHeapSize"))\r
+                       vm_args.allocHeapSize = (jint)SvIV(*mark); \r
+#else\r
+                   else if (strEQ(s, "verbose"))\r
+                       vm_args.verbose = (jint)SvIV(*mark); \r
+                   else if (strEQ(s, "debugging"))\r
+                       vm_args.debugging = (jboolean)SvIV(*mark);\r
+                   else if (strEQ(s, "debugPort"))\r
+                       vm_args.debugPort = (jint)SvIV(*mark); \r
+#endif\r
+                   else\r
+                       croak("unrecognized option: %s", s);\r
+               }\r
+\r
+               if (jpldebug) {\r
+                   fprintf(stderr, "Creating Java VM...\n");\r
+                   fprintf(stderr, "Working CLASSPATH: %s\n", \r
+                       vm_args.classpath);\r
+               }\r
+               if (JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args) < 0) {\r
+                  croak("Unable to create instance of JVM");\r
+                }\r
+               if (jpldebug) {\r
+                   fprintf(stderr, "Created Java VM.\n");\r
+               }\r
+\r
+           }\r
+       }\r
+\r