home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / jpl / JNI / JNI.xs < prev    next >
Text File  |  1999-09-14  |  83KB  |  4,142 lines

  1. /*
  2.  * Copyright 1997, O'Reilly & Associate, Inc.
  3.  *
  4.  * This package may be copied under the same terms as Perl itself.
  5.  */
  6.  
  7. #include "EXTERN.h"
  8. #include "perl.h"
  9. #include "XSUB.h"
  10.  
  11. #include <stdio.h>
  12. #include <jni.h>
  13.  
  14. #ifndef PERL_VERSION
  15. #  include <patchlevel.h>
  16. #  define PERL_REVISION        5
  17. #  define PERL_VERSION        PATCHLEVEL
  18. #  define PERL_SUBVERSION    SUBVERSION
  19. #endif
  20.  
  21. #if PERL_REVISION == 5 && (PERL_VERSION < 4 || \
  22.                (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))
  23. #  define PL_na        na
  24. #  define PL_sv_no    sv_no
  25. #  define PL_sv_undef    sv_undef
  26. #  define PL_dowarn    dowarn
  27. #endif
  28.  
  29. #ifndef newSVpvn
  30. #  define newSVpvn(a,b)    newSVpv(a,b)
  31. #endif
  32.  
  33. #ifndef pTHX
  34. #  define pTHX        void
  35. #  define pTHX_
  36. #  define aTHX
  37. #  define aTHX_
  38. #  define dTHX        extern int JNI___notused
  39. #endif
  40.  
  41. #ifndef WIN32
  42. #  include <dlfcn.h>
  43. #endif
  44.  
  45. #ifdef EMBEDDEDPERL
  46. extern JNIEnv* jplcurenv;
  47. extern int jpldebug;
  48. #else
  49. JNIEnv* jplcurenv;
  50. int jpldebug = 1;
  51. #endif
  52.  
  53. #define SysRet jint
  54.  
  55. #ifdef WIN32
  56. static void JNICALL call_my_exit(jint status)
  57. {
  58.     my_exit(status);
  59. }
  60. #else
  61. static void call_my_exit(jint status)
  62. {
  63.     my_exit(status);
  64. }
  65. #endif
  66.  
  67. jvalue*
  68. makeargs(char *sig, SV** svp, int items)
  69. {
  70.     jvalue* jv = (jvalue*)safemalloc(sizeof(jvalue) * items);
  71.     int ix = 0;
  72.     char *s = sig;
  73.     JNIEnv* env = jplcurenv;
  74.     char *start;
  75.     STRLEN n_a;
  76.  
  77.     if (jpldebug)
  78.     fprintf(stderr, "sig = %s, items = %d\n", sig, items);
  79.     if (*s++ != '(')
  80.     goto cleanup;
  81.  
  82.     while (items--) {
  83.     SV *sv = *svp++;
  84.     start = s;
  85.     switch (*s++) {
  86.     case 'Z':
  87.         jv[ix++].z = (jboolean)(SvIV(sv) != 0);
  88.         break;
  89.     case 'B':
  90.         jv[ix++].b = (jbyte)SvIV(sv);
  91.         break;
  92.     case 'C':
  93.         jv[ix++].c = (jchar)SvIV(sv);
  94.         break;
  95.     case 'S':
  96.         jv[ix++].s = (jshort)SvIV(sv);
  97.         break;
  98.     case 'I':
  99.         jv[ix++].i = (jint)SvIV(sv);
  100.         break;
  101.     case 'J':
  102.         jv[ix++].j = (jlong)SvNV(sv);
  103.         break;
  104.     case 'F':
  105.         jv[ix++].f = (jfloat)SvNV(sv);
  106.         break;
  107.     case 'D':
  108.         jv[ix++].d = (jdouble)SvNV(sv);
  109.         break;
  110.     case '[':
  111.         switch (*s++) {
  112.         case 'Z':
  113.         if (SvROK(sv)) {
  114.             SV* rv = (SV*)SvRV(sv);
  115.             if (SvOBJECT(rv))
  116.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  117.             else if (SvTYPE(rv) == SVt_PVAV) {
  118.             jsize len = av_len((AV*)rv) + 1;
  119.             jboolean* buf = (jboolean*)malloc(len * sizeof(jboolean));
  120.             int i;
  121.             SV** esv;
  122.  
  123. #ifdef WIN32
  124.             jbooleanArray ja = env->NewBooleanArray(len);
  125. #else
  126.             jbooleanArray ja = (*env)->NewBooleanArray(env, len);
  127. #endif
  128.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  129.                 buf[i] = (jboolean)SvIV(*esv);
  130. #ifdef WIN32
  131.             env->SetBooleanArrayRegion(ja, 0, len, buf);
  132. #else
  133.             (*env)->SetBooleanArrayRegion(env, ja, 0, len, buf);
  134. #endif
  135.             free((void*)buf);
  136.             jv[ix++].l = (jobject)ja;
  137.             }
  138.             else
  139.             jv[ix++].l = (jobject)(void*)0;
  140.         }
  141.         else if (SvPOK(sv)) {
  142.             jsize len = sv_len(sv) / sizeof(jboolean);
  143.  
  144. #ifdef WIN32
  145.             jbooleanArray ja = env->NewBooleanArray(len);
  146. #else
  147.             jbooleanArray ja = (*env)->NewBooleanArray(env, len);
  148. #endif
  149. #ifdef WIN32
  150.             env->SetBooleanArrayRegion(ja, 0, len, (jboolean*)SvPV(sv,n_a));
  151. #else
  152.             (*env)->SetBooleanArrayRegion(env, ja, 0, len, (jboolean*)SvPV(sv,n_a));
  153. #endif
  154.             jv[ix++].l = (jobject)ja;
  155.         }
  156.         else
  157.             jv[ix++].l = (jobject)(void*)0;
  158.         break;
  159.         case 'B':
  160.         if (SvROK(sv)) {
  161.             SV* rv = (SV*)SvRV(sv);
  162.             if (SvOBJECT(rv))
  163.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  164.             else if (SvTYPE(rv) == SVt_PVAV) {
  165.             jsize len = av_len((AV*)rv) + 1;
  166.             jbyte* buf = (jbyte*)malloc(len * sizeof(jbyte));
  167.             int i;
  168.             SV** esv;
  169.  
  170. #ifdef WIN32
  171.             jbyteArray ja = env->NewByteArray(len);
  172. #else
  173.             jbyteArray ja = (*env)->NewByteArray(env, len);
  174. #endif
  175.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  176.                 buf[i] = (jbyte)SvIV(*esv);
  177. #ifdef WIN32
  178.             env->SetByteArrayRegion(ja, 0, len, buf);
  179. #else
  180.             (*env)->SetByteArrayRegion(env, ja, 0, len, buf);
  181. #endif
  182.             free((void*)buf);
  183.             jv[ix++].l = (jobject)ja;
  184.             }
  185.             else
  186.             jv[ix++].l = (jobject)(void*)0;
  187.         }
  188.         else if (SvPOK(sv)) {
  189.             jsize len = sv_len(sv) / sizeof(jbyte);
  190.  
  191. #ifdef WIN32
  192.             jbyteArray ja = env->NewByteArray(len);
  193. #else
  194.             jbyteArray ja = (*env)->NewByteArray(env, len);
  195. #endif
  196. #ifdef WIN32
  197.             env->SetByteArrayRegion(ja, 0, len, (jbyte*)SvPV(sv,n_a));
  198. #else
  199.             (*env)->SetByteArrayRegion(env, ja, 0, len, (jbyte*)SvPV(sv,n_a));
  200. #endif
  201.             jv[ix++].l = (jobject)ja;
  202.         }
  203.         else
  204.             jv[ix++].l = (jobject)(void*)0;
  205.         break;
  206.         case 'C':
  207.         if (SvROK(sv)) {
  208.             SV* rv = (SV*)SvRV(sv);
  209.             if (SvOBJECT(rv))
  210.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  211.             else if (SvTYPE(rv) == SVt_PVAV) {
  212.             jsize len = av_len((AV*)rv) + 1;
  213.             jchar* buf = (jchar*)malloc(len * sizeof(jchar));
  214.             int i;
  215.             SV** esv;
  216.  
  217. #ifdef WIN32
  218.             jcharArray ja = env->NewCharArray(len);
  219. #else
  220.             jcharArray ja = (*env)->NewCharArray(env, len);
  221. #endif
  222.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  223.                 buf[i] = (jchar)SvIV(*esv);
  224. #ifdef WIN32
  225.             env->SetCharArrayRegion(ja, 0, len, buf);
  226. #else
  227.             (*env)->SetCharArrayRegion(env, ja, 0, len, buf);
  228. #endif
  229.             free((void*)buf);
  230.             jv[ix++].l = (jobject)ja;
  231.             }
  232.             else
  233.             jv[ix++].l = (jobject)(void*)0;
  234.         }
  235.         else if (SvPOK(sv)) {
  236.             jsize len = sv_len(sv) / sizeof(jchar);
  237.  
  238. #ifdef WIN32
  239.             jcharArray ja = env->NewCharArray(len);
  240. #else
  241.             jcharArray ja = (*env)->NewCharArray(env, len);
  242. #endif
  243. #ifdef WIN32
  244.             env->SetCharArrayRegion(ja, 0, len, (jchar*)SvPV(sv,n_a));
  245. #else
  246.             (*env)->SetCharArrayRegion(env, ja, 0, len, (jchar*)SvPV(sv,n_a));
  247. #endif
  248.             jv[ix++].l = (jobject)ja;
  249.         }
  250.         else
  251.             jv[ix++].l = (jobject)(void*)0;
  252.         break;
  253.         case 'S':
  254.         if (SvROK(sv)) {
  255.             SV* rv = (SV*)SvRV(sv);
  256.             if (SvOBJECT(rv))
  257.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  258.             else if (SvTYPE(rv) == SVt_PVAV) {
  259.             jsize len = av_len((AV*)rv) + 1;
  260.             jshort* buf = (jshort*)malloc(len * sizeof(jshort));
  261.             int i;
  262.             SV** esv;
  263.  
  264. #ifdef WIN32
  265.             jshortArray ja = env->NewShortArray(len);
  266. #else
  267.             jshortArray ja = (*env)->NewShortArray(env, len);
  268. #endif
  269.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  270.                 buf[i] = (jshort)SvIV(*esv);
  271. #ifdef WIN32
  272.             env->SetShortArrayRegion(ja, 0, len, buf);
  273. #else
  274.             (*env)->SetShortArrayRegion(env, ja, 0, len, buf);
  275. #endif
  276.             free((void*)buf);
  277.             jv[ix++].l = (jobject)ja;
  278.             }
  279.             else
  280.             jv[ix++].l = (jobject)(void*)0;
  281.         }
  282.         else if (SvPOK(sv)) {
  283.             jsize len = sv_len(sv) / sizeof(jshort);
  284.  
  285. #ifdef WIN32
  286.             jshortArray ja = env->NewShortArray(len);
  287. #else
  288.             jshortArray ja = (*env)->NewShortArray(env, len);
  289. #endif
  290. #ifdef WIN32
  291.             env->SetShortArrayRegion(ja, 0, len, (jshort*)SvPV(sv,n_a));
  292. #else
  293.             (*env)->SetShortArrayRegion(env, ja, 0, len, (jshort*)SvPV(sv,n_a));
  294. #endif
  295.             jv[ix++].l = (jobject)ja;
  296.         }
  297.         else
  298.             jv[ix++].l = (jobject)(void*)0;
  299.         break;
  300.         case 'I':
  301.         if (SvROK(sv)) {
  302.             SV* rv = (SV*)SvRV(sv);
  303.             if (SvOBJECT(rv))
  304.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  305.             else if (SvTYPE(rv) == SVt_PVAV) {
  306.             jsize len = av_len((AV*)rv) + 1;
  307.             jint* buf = (jint*)malloc(len * sizeof(jint));
  308.             int i;
  309.             SV** esv;
  310.  
  311. #ifdef WIN32
  312.             jintArray ja = env->NewIntArray(len);
  313. #else
  314.             jintArray ja = (*env)->NewIntArray(env, len);
  315. #endif
  316.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  317.                 buf[i] = (jint)SvIV(*esv);
  318. #ifdef WIN32
  319.             env->SetIntArrayRegion(ja, 0, len, buf);
  320. #else
  321.             (*env)->SetIntArrayRegion(env, ja, 0, len, buf);
  322. #endif
  323.             free((void*)buf);
  324.             jv[ix++].l = (jobject)ja;
  325.             }
  326.             else
  327.             jv[ix++].l = (jobject)(void*)0;
  328.         }
  329.         else if (SvPOK(sv)) {
  330.             jsize len = sv_len(sv) / sizeof(jint);
  331.  
  332. #ifdef WIN32
  333.             jintArray ja = env->NewIntArray(len);
  334. #else
  335.             jintArray ja = (*env)->NewIntArray(env, len);
  336. #endif
  337. #ifdef WIN32
  338.             env->SetIntArrayRegion(ja, 0, len, (jint*)SvPV(sv,n_a));
  339. #else
  340.             (*env)->SetIntArrayRegion(env, ja, 0, len, (jint*)SvPV(sv,n_a));
  341. #endif
  342.             jv[ix++].l = (jobject)ja;
  343.         }
  344.         else
  345.             jv[ix++].l = (jobject)(void*)0;
  346.         break;
  347.         case 'J':
  348.         if (SvROK(sv)) {
  349.             SV* rv = (SV*)SvRV(sv);
  350.             if (SvOBJECT(rv))
  351.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  352.             else if (SvTYPE(rv) == SVt_PVAV) {
  353.             jsize len = av_len((AV*)rv) + 1;
  354.             jlong* buf = (jlong*)malloc(len * sizeof(jlong));
  355.             int i;
  356.             SV** esv;
  357.  
  358. #ifdef WIN32
  359.             jlongArray ja = env->NewLongArray(len);
  360. #else
  361.             jlongArray ja = (*env)->NewLongArray(env, len);
  362. #endif
  363.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  364.                 buf[i] = (jlong)SvNV(*esv);
  365. #ifdef WIN32
  366.             env->SetLongArrayRegion(ja, 0, len, buf);
  367. #else
  368.             (*env)->SetLongArrayRegion(env, ja, 0, len, buf);
  369. #endif
  370.             free((void*)buf);
  371.             jv[ix++].l = (jobject)ja;
  372.             }
  373.             else
  374.             jv[ix++].l = (jobject)(void*)0;
  375.         }
  376.         else if (SvPOK(sv)) {
  377.             jsize len = sv_len(sv) / sizeof(jlong);
  378.  
  379. #ifdef WIN32
  380.             jlongArray ja = env->NewLongArray(len);
  381. #else
  382.             jlongArray ja = (*env)->NewLongArray(env, len);
  383. #endif
  384. #ifdef WIN32
  385.             env->SetLongArrayRegion(ja, 0, len, (jlong*)SvPV(sv,n_a));
  386. #else
  387.             (*env)->SetLongArrayRegion(env, ja, 0, len, (jlong*)SvPV(sv,n_a));
  388. #endif
  389.             jv[ix++].l = (jobject)ja;
  390.         }
  391.         else
  392.             jv[ix++].l = (jobject)(void*)0;
  393.         break;
  394.         case 'F':
  395.         if (SvROK(sv)) {
  396.             SV* rv = (SV*)SvRV(sv);
  397.             if (SvOBJECT(rv))
  398.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  399.             else if (SvTYPE(rv) == SVt_PVAV) {
  400.             jsize len = av_len((AV*)rv) + 1;
  401.             jfloat* buf = (jfloat*)malloc(len * sizeof(jfloat));
  402.             int i;
  403.             SV** esv;
  404.  
  405. #ifdef WIN32
  406.             jfloatArray ja = env->NewFloatArray(len);
  407. #else
  408.             jfloatArray ja = (*env)->NewFloatArray(env, len);
  409. #endif
  410.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  411.                 buf[i] = (jfloat)SvNV(*esv);
  412. #ifdef WIN32
  413.             env->SetFloatArrayRegion(ja, 0, len, buf);
  414. #else
  415.             (*env)->SetFloatArrayRegion(env, ja, 0, len, buf);
  416. #endif
  417.             free((void*)buf);
  418.             jv[ix++].l = (jobject)ja;
  419.             }
  420.             else
  421.             jv[ix++].l = (jobject)(void*)0;
  422.         }
  423.         else if (SvPOK(sv)) {
  424.             jsize len = sv_len(sv) / sizeof(jfloat);
  425.  
  426. #ifdef WIN32
  427.             jfloatArray ja = env->NewFloatArray(len);
  428. #else
  429.             jfloatArray ja = (*env)->NewFloatArray(env, len);
  430. #endif
  431. #ifdef WIN32
  432.             env->SetFloatArrayRegion(ja, 0, len, (jfloat*)SvPV(sv,n_a));
  433. #else
  434.             (*env)->SetFloatArrayRegion(env, ja, 0, len, (jfloat*)SvPV(sv,n_a));
  435. #endif
  436.             jv[ix++].l = (jobject)ja;
  437.         }
  438.         else
  439.             jv[ix++].l = (jobject)(void*)0;
  440.         break;
  441.         case 'D':
  442.         if (SvROK(sv)) {
  443.             SV* rv = (SV*)SvRV(sv);
  444.             if (SvOBJECT(rv))
  445.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  446.             else if (SvTYPE(rv) == SVt_PVAV) {
  447.             jsize len = av_len((AV*)rv) + 1;
  448.             jdouble* buf = (jdouble*)malloc(len * sizeof(jdouble));
  449.             int i;
  450.             SV** esv;
  451.  
  452. #ifdef WIN32
  453.             jdoubleArray ja = env->NewDoubleArray(len);
  454. #else
  455.             jdoubleArray ja = (*env)->NewDoubleArray(env, len);
  456. #endif
  457.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
  458.                 buf[i] = (jdouble)SvNV(*esv);
  459. #ifdef WIN32
  460.             env->SetDoubleArrayRegion(ja, 0, len, buf);
  461. #else
  462.             (*env)->SetDoubleArrayRegion(env, ja, 0, len, buf);
  463. #endif
  464.             free((void*)buf);
  465.             jv[ix++].l = (jobject)ja;
  466.             }
  467.             else
  468.             jv[ix++].l = (jobject)(void*)0;
  469.         }
  470.         else if (SvPOK(sv)) {
  471.             jsize len = sv_len(sv) / sizeof(jdouble);
  472.  
  473. #ifdef WIN32
  474.             jdoubleArray ja = env->NewDoubleArray(len);
  475. #else
  476.             jdoubleArray ja = (*env)->NewDoubleArray(env, len);
  477. #endif
  478. #ifdef WIN32
  479.             env->SetDoubleArrayRegion(ja, 0, len, (jdouble*)SvPV(sv,n_a));
  480. #else
  481.             (*env)->SetDoubleArrayRegion(env, ja, 0, len, (jdouble*)SvPV(sv,n_a));
  482. #endif
  483.             jv[ix++].l = (jobject)ja;
  484.         }
  485.         else
  486.             jv[ix++].l = (jobject)(void*)0;
  487.         break;
  488.         case 'L':
  489.         while (*s != ';') s++;
  490.         s++;
  491.         if (strnEQ(start, "[Ljava/lang/String;", 19)) {
  492.             if (SvROK(sv)) {
  493.             SV* rv = (SV*)SvRV(sv);
  494.             if (SvOBJECT(rv))
  495.                 jv[ix++].l = (jobject)(void*)SvIV(rv);
  496.             else if (SvTYPE(rv) == SVt_PVAV) {
  497.                 jsize len = av_len((AV*)rv) + 1;
  498.                 int i;
  499.                 SV** esv;
  500.                 static jclass jcl = 0;
  501.                 jobjectArray ja;
  502.  
  503.                 if (!jcl)
  504. #ifdef WIN32
  505.                 jcl = env->FindClass("java/lang/String");
  506. #else
  507.                 jcl = (*env)->FindClass(env, "java/lang/String");
  508. #endif
  509. #ifdef WIN32
  510.                 ja = env->NewObjectArray(len, jcl, 0);
  511. #else
  512.                 ja = (*env)->NewObjectArray(env, len, jcl, 0);
  513. #endif
  514.                 for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
  515. #ifdef WIN32
  516.                 jobject str = (jobject)env->NewStringUTF(SvPV(*esv,n_a));
  517. #else
  518.                 jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
  519. #endif
  520. #ifdef WIN32
  521.                 env->SetObjectArrayElement(ja, i, str);
  522. #else
  523.                 (*env)->SetObjectArrayElement(env, ja, i, str);
  524. #endif
  525.                 }
  526.                 jv[ix++].l = (jobject)ja;
  527.             }
  528.             else
  529.                 jv[ix++].l = (jobject)(void*)0;
  530.             }
  531.             else
  532.             jv[ix++].l = (jobject)(void*)0;
  533.             break;
  534.         }
  535.         /* FALL THROUGH */
  536.         default:
  537.         if (SvROK(sv)) {
  538.             SV* rv = (SV*)SvRV(sv);
  539.             if (SvOBJECT(rv))
  540.             jv[ix++].l = (jobject)(void*)SvIV(rv);
  541.             else if (SvTYPE(rv) == SVt_PVAV) {
  542.             jsize len = av_len((AV*)rv) + 1;
  543.             int i;
  544.             SV** esv;
  545.                static jclass jcl = 0;
  546.             jobjectArray ja;
  547.  
  548.             if (!jcl)
  549. #ifdef WIN32
  550.                 jcl = env->FindClass("java/lang/Object");
  551. #else
  552.                 jcl = (*env)->FindClass(env, "java/lang/Object");
  553. #endif
  554. #ifdef WIN32
  555.             ja = env->NewObjectArray(len, jcl, 0);
  556. #else
  557.             ja = (*env)->NewObjectArray(env, len, jcl, 0);
  558. #endif
  559.             for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
  560.                 if (SvROK(*esv) && (rv = SvRV(*esv)) && SvOBJECT(rv)) {
  561. #ifdef WIN32
  562.                 env->SetObjectArrayElement(ja, i, (jobject)(void*)SvIV(rv));
  563. #else
  564.                 (*env)->SetObjectArrayElement(env, ja, i, (jobject)(void*)SvIV(rv));
  565. #endif
  566.                 }
  567.                 else {
  568. #ifdef WIN32
  569.                 jobject str = (jobject)env->NewStringUTF(SvPV(*esv,n_a));
  570. #else
  571.                 jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
  572. #endif
  573. #ifdef WIN32
  574.                 env->SetObjectArrayElement(ja, i, str);
  575. #else
  576.                 (*env)->SetObjectArrayElement(env, ja, i, str);
  577. #endif
  578.                 }
  579.             }
  580.             jv[ix++].l = (jobject)ja;
  581.             }
  582.             else
  583.             jv[ix++].l = (jobject)(void*)0;
  584.         }
  585.         else
  586.             jv[ix++].l = (jobject)(void*)0;
  587.         break;
  588.         }
  589.         break;
  590.     case 'L':
  591.         if (!SvROK(sv) || strnEQ(s, "java/lang/String;", 17)) {
  592.         s += 17;
  593. #ifdef WIN32
  594.         jv[ix++].l = (jobject)env->NewStringUTF((char*) SvPV(sv,n_a));
  595. #else
  596.         jv[ix++].l = (jobject)(*env)->NewStringUTF(env, (char*) SvPV(sv,n_a));
  597. #endif
  598.         break;
  599.         }
  600.         while (*s != ';') s++;
  601.         s++;
  602.         if (SvROK(sv)) {
  603.         SV* rv = SvRV(sv);
  604.         jv[ix++].l = (jobject)(void*)SvIV(rv);
  605.         }
  606.         break;
  607.     case ')':
  608.         croak("too many arguments, signature: %s", sig);
  609.         goto cleanup;
  610.     default:
  611.         croak("panic: malformed signature: %s", s-1);
  612.         goto cleanup;
  613.     }
  614.  
  615.     }
  616.     if (*s != ')') {
  617.     croak("not enough arguments, signature: %s", sig);
  618.     goto cleanup;
  619.     }
  620.     return jv;
  621.  
  622. cleanup:
  623.     safefree((char*)jv);
  624.     return 0;
  625. }
  626.  
  627. static int
  628. not_here(char *s)
  629. {
  630.     croak("%s not implemented on this architecture", s);
  631.     return -1;
  632. }
  633.  
  634. static double
  635. constant(char *name, int arg)
  636. {
  637.     errno = 0;
  638.     switch (*name) {
  639.     case 'A':
  640.     break;
  641.     case 'B':
  642.     break;
  643.     case 'C':
  644.     break;
  645.     case 'D':
  646.     break;
  647.     case 'E':
  648.     break;
  649.     case 'F':
  650.     break;
  651.     case 'G':
  652.     break;
  653.     case 'H':
  654.     break;
  655.     case 'I':
  656.     break;
  657.     case 'J':
  658.     if (strEQ(name, "JNI_ABORT"))
  659. #ifdef JNI_ABORT
  660.         return JNI_ABORT;
  661. #else
  662.         goto not_there;
  663. #endif
  664.     if (strEQ(name, "JNI_COMMIT"))
  665. #ifdef JNI_COMMIT
  666.         return JNI_COMMIT;
  667. #else
  668.         goto not_there;
  669. #endif
  670.     if (strEQ(name, "JNI_ERR"))
  671. #ifdef JNI_ERR
  672.         return JNI_ERR;
  673. #else
  674.         goto not_there;
  675. #endif
  676.     if (strEQ(name, "JNI_FALSE"))
  677. #ifdef JNI_FALSE
  678.         return JNI_FALSE;
  679. #else
  680.         goto not_there;
  681. #endif
  682.     if (strEQ(name, "JNI_H"))
  683. #ifdef JNI_H
  684. #ifdef WIN32
  685.         return 1;
  686. #else
  687.         return JNI_H;
  688. #endif
  689. #else
  690.         goto not_there;
  691. #endif
  692.     if (strEQ(name, "JNI_OK"))
  693. #ifdef JNI_OK
  694.         return JNI_OK;
  695. #else
  696.         goto not_there;
  697. #endif
  698.     if (strEQ(name, "JNI_TRUE"))
  699. #ifdef JNI_TRUE
  700.         return JNI_TRUE;
  701. #else
  702.         goto not_there;
  703. #endif
  704.     break;
  705.     case 'K':
  706.     break;
  707.     case 'L':
  708.     break;
  709.     case 'M':
  710.     break;
  711.     case 'N':
  712.     break;
  713.     case 'O':
  714.     break;
  715.     case 'P':
  716.     break;
  717.     case 'Q':
  718.     break;
  719.     case 'R':
  720.     break;
  721.     case 'S':
  722.     break;
  723.     case 'T':
  724.     break;
  725.     case 'U':
  726.     break;
  727.     case 'V':
  728.     break;
  729.     case 'W':
  730.     break;
  731.     case 'X':
  732.     break;
  733.     case 'Y':
  734.     break;
  735.     case 'Z':
  736.     break;
  737.     }
  738.     errno = EINVAL;
  739.     return 0;
  740.  
  741. not_there:
  742.     errno = ENOENT;
  743.     return 0;
  744. }
  745.  
  746. #define FETCHENV jplcurenv
  747. #define RESTOREENV jplcurenv = env
  748.  
  749. MODULE = JNI        PACKAGE = JNI        
  750.  
  751. PROTOTYPES: ENABLE
  752.  
  753. double
  754. constant(name,arg)
  755.     char *        name
  756.     int        arg
  757.  
  758. jint
  759. GetVersion()
  760.     JNIEnv *        env = FETCHENV;
  761.     CODE:
  762.     {
  763. #ifdef WIN32
  764.         RETVAL = env->GetVersion();
  765. #else
  766.         RETVAL = (*env)->GetVersion(env);
  767. #endif
  768.         RESTOREENV;
  769.     }
  770.     OUTPUT:
  771.     RETVAL
  772.  
  773. jclass
  774. DefineClass(name, loader, buf)
  775.     JNIEnv *        env = FETCHENV;
  776.     STRLEN            tmplen = NO_INIT;
  777.     jsize            buf_len_ = NO_INIT;
  778.     const char *        name
  779.     jobject            loader
  780.     const jbyte *        buf
  781.     CODE:
  782.     {
  783. #ifdef KAFFE
  784. #ifdef WIN32
  785.         RETVAL = env->DefineClass( loader, buf, (jsize)buf_len_);
  786. #else
  787.         RETVAL = (*env)->DefineClass(env,  loader, buf, (jsize)buf_len_);
  788. #endif
  789. #else
  790. #ifdef WIN32
  791.         RETVAL = env->DefineClass( name, loader, buf, (jsize)buf_len_); 
  792. #else
  793.         RETVAL = (*env)->DefineClass(env,  name, loader, buf, (jsize)buf_len_); 
  794. #endif
  795. #endif
  796.         RESTOREENV;
  797.     }
  798.     OUTPUT:
  799.     RETVAL
  800.  
  801. jclass
  802. FindClass(name)
  803.     JNIEnv *        env = FETCHENV;
  804.     const char *        name
  805.     CODE:
  806.     {
  807. #ifdef WIN32
  808.         RETVAL = env->FindClass( name);
  809. #else
  810.         RETVAL = (*env)->FindClass(env,  name);
  811. #endif
  812.         RESTOREENV;
  813.     }
  814.     OUTPUT:
  815.     RETVAL
  816.  
  817. jclass
  818. GetSuperclass(sub)
  819.     JNIEnv *        env = FETCHENV;
  820.     jclass            sub
  821.     CODE:
  822.     {
  823. #ifdef WIN32
  824.         RETVAL = env->GetSuperclass( sub);
  825. #else
  826.         RETVAL = (*env)->GetSuperclass(env,  sub);
  827. #endif
  828.         RESTOREENV;
  829.     }
  830.     OUTPUT:
  831.     RETVAL
  832.  
  833. jboolean
  834. IsAssignableFrom(sub, sup)
  835.     JNIEnv *        env = FETCHENV;
  836.     jclass            sub
  837.     jclass            sup
  838.     CODE:
  839.     {
  840. #ifdef WIN32
  841.         RETVAL = env->IsAssignableFrom( sub, sup);
  842. #else
  843.         RETVAL = (*env)->IsAssignableFrom(env,  sub, sup);
  844. #endif
  845.         RESTOREENV;
  846.     }
  847.     OUTPUT:
  848.     RETVAL
  849.  
  850. SysRet
  851. Throw(obj)
  852.     JNIEnv *        env = FETCHENV;
  853.     jthrowable        obj
  854.     CODE:
  855.     {
  856. #ifdef WIN32
  857.         RETVAL = env->Throw( obj);
  858. #else
  859.         RETVAL = (*env)->Throw(env,  obj);
  860. #endif
  861.         RESTOREENV;
  862.     }
  863.     OUTPUT:
  864.     RETVAL    
  865.  
  866. SysRet
  867. ThrowNew(clazz, msg)
  868.     JNIEnv *        env = FETCHENV;
  869.     jclass            clazz
  870.     const char *        msg
  871.     CODE:
  872.     {
  873. #ifdef WIN32
  874.         RETVAL = env->ThrowNew( clazz, msg);
  875. #else
  876.         RETVAL = (*env)->ThrowNew(env,  clazz, msg);
  877. #endif
  878.         RESTOREENV;
  879.     }
  880.     OUTPUT:
  881.     RETVAL
  882.  
  883. jthrowable
  884. ExceptionOccurred()
  885.     JNIEnv *        env = FETCHENV;
  886.     CODE:
  887.     {
  888. #ifdef WIN32
  889.         RETVAL = env->ExceptionOccurred();
  890. #else
  891.         RETVAL = (*env)->ExceptionOccurred(env);
  892. #endif
  893.         RESTOREENV;
  894.     }
  895.     OUTPUT:
  896.     RETVAL
  897.  
  898. void
  899. ExceptionDescribe()
  900.     JNIEnv *        env = FETCHENV;
  901.     CODE:
  902.     {
  903. #ifdef WIN32
  904.         env->ExceptionDescribe();
  905. #else
  906.         (*env)->ExceptionDescribe(env);
  907. #endif
  908.         RESTOREENV;
  909.     }
  910.  
  911. void
  912. ExceptionClear()
  913.     JNIEnv *        env = FETCHENV;
  914.     CODE:
  915.     {
  916. #ifdef WIN32
  917.         env->ExceptionClear();
  918. #else
  919.         (*env)->ExceptionClear(env);
  920. #endif
  921.         RESTOREENV;
  922.     }
  923.  
  924. void
  925. FatalError(msg)
  926.     JNIEnv *        env = FETCHENV;
  927.     const char *        msg
  928.     CODE:
  929.     {
  930. #ifdef WIN32
  931.         env->FatalError( msg);
  932. #else
  933.         (*env)->FatalError(env,  msg);
  934. #endif
  935.         RESTOREENV;
  936.     }
  937.  
  938. jobject
  939. NewGlobalRef(lobj)
  940.     JNIEnv *        env = FETCHENV;
  941.     jobject            lobj
  942.     CODE:
  943.     {
  944. #ifdef WIN32
  945.         RETVAL = env->NewGlobalRef(lobj);
  946. #else
  947.         RETVAL = (*env)->NewGlobalRef(env, lobj);
  948. #endif
  949.         RESTOREENV;
  950.     }
  951.     OUTPUT:
  952.     RETVAL
  953.  
  954. void
  955. DeleteGlobalRef(gref)
  956.     JNIEnv *        env = FETCHENV;
  957.     jobject            gref
  958.     CODE:
  959.     {
  960. #ifdef WIN32
  961.         env->DeleteGlobalRef(gref);
  962. #else
  963.         (*env)->DeleteGlobalRef(env, gref);
  964. #endif
  965.         RESTOREENV;
  966.     }
  967.  
  968. void
  969. DeleteLocalRef(obj)
  970.     JNIEnv *        env = FETCHENV;
  971.     jobject            obj
  972.     CODE:
  973.     {
  974. #ifdef WIN32
  975.         env->DeleteLocalRef( obj);
  976. #else
  977.         (*env)->DeleteLocalRef(env,  obj);
  978. #endif
  979.         RESTOREENV;
  980.     }
  981.  
  982. jboolean
  983. IsSameObject(obj1,obj2)
  984.     JNIEnv *        env = FETCHENV;
  985.     jobject            obj1
  986.     jobject            obj2
  987.     CODE:
  988.     {
  989. #ifdef WIN32
  990.         RETVAL = env->IsSameObject(obj1,obj2);
  991. #else
  992.         RETVAL = (*env)->IsSameObject(env, obj1,obj2);
  993. #endif
  994.         RESTOREENV;
  995.     }
  996.     OUTPUT:
  997.     RETVAL
  998.  
  999. jobject
  1000. AllocObject(clazz)
  1001.     JNIEnv *        env = FETCHENV;
  1002.     jclass            clazz
  1003.     CODE:
  1004.     {
  1005. #ifdef WIN32
  1006.         RETVAL = env->AllocObject(clazz);
  1007. #else
  1008.         RETVAL = (*env)->AllocObject(env, clazz);
  1009. #endif
  1010.         RESTOREENV;
  1011.     }
  1012.     OUTPUT:
  1013.     RETVAL
  1014.  
  1015. jobject
  1016. NewObject(clazz,methodID,...)
  1017.     JNIEnv *        env = FETCHENV;
  1018.     jclass            clazz
  1019.     jmethodID        methodID
  1020.     char *            sig = 0;
  1021.     int            argoff = $min_args;
  1022.     CODE:
  1023.     {
  1024.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1025. #ifdef WIN32
  1026.         RETVAL = env->NewObjectA(clazz,methodID,args);
  1027. #else
  1028.         RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
  1029. #endif
  1030.         RESTOREENV;
  1031.     }
  1032.     OUTPUT:
  1033.     RETVAL
  1034.  
  1035. jobject
  1036. NewObjectA(clazz,methodID,args)
  1037.     JNIEnv *        env = FETCHENV;
  1038.     jclass            clazz
  1039.     jmethodID        methodID
  1040.     char *            sig = 0;
  1041.     jvalue *        args
  1042.     CODE:
  1043.     {
  1044. #ifdef WIN32
  1045.         RETVAL = env->NewObjectA(clazz,methodID,args);
  1046. #else
  1047.         RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
  1048. #endif
  1049.         RESTOREENV;
  1050.     }
  1051.     OUTPUT:
  1052.     RETVAL
  1053.  
  1054. jclass
  1055. GetObjectClass(obj)
  1056.     JNIEnv *        env = FETCHENV;
  1057.     jobject            obj
  1058.     CODE:
  1059.     {
  1060. #ifdef WIN32
  1061.         RETVAL = env->GetObjectClass(obj);
  1062. #else
  1063.         RETVAL = (*env)->GetObjectClass(env, obj);
  1064. #endif
  1065.         RESTOREENV;
  1066.     }
  1067.     OUTPUT:
  1068.     RETVAL
  1069.  
  1070. jboolean
  1071. IsInstanceOf(obj,clazz)
  1072.     JNIEnv *        env = FETCHENV;
  1073.     jobject            obj
  1074.     jclass            clazz
  1075.     CODE:
  1076.     {
  1077. #ifdef WIN32
  1078.         RETVAL = env->IsInstanceOf(obj,clazz);
  1079. #else
  1080.         RETVAL = (*env)->IsInstanceOf(env, obj,clazz);
  1081. #endif
  1082.         RESTOREENV;
  1083.     }
  1084.     OUTPUT:
  1085.     RETVAL
  1086.  
  1087. jmethodID
  1088. GetMethodID(clazz,name,sig)
  1089.     JNIEnv *        env = FETCHENV;
  1090.     jclass            clazz
  1091.     const char *        name
  1092.     const char *        sig
  1093.     CODE:
  1094.     {
  1095. #ifdef WIN32
  1096.         RETVAL = env->GetMethodID(clazz,name,sig);
  1097. #else
  1098.         RETVAL = (*env)->GetMethodID(env, clazz,name,sig);
  1099. #endif
  1100.         RESTOREENV;
  1101.     }
  1102.     OUTPUT:
  1103.     RETVAL
  1104.  
  1105. jobject
  1106. CallObjectMethod(obj,methodID,...)
  1107.     JNIEnv *        env = FETCHENV;
  1108.     jobject            obj
  1109.     jmethodID        methodID
  1110.     char *            sig = 0;
  1111.     int            argoff = $min_args;
  1112.     CODE:
  1113.     {
  1114.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1115. #ifdef WIN32
  1116.         RETVAL = env->CallObjectMethodA(obj,methodID,args);
  1117. #else
  1118.         RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
  1119. #endif
  1120.         RESTOREENV;
  1121.     }
  1122.     OUTPUT:
  1123.     RETVAL
  1124.  
  1125. jobject
  1126. CallObjectMethodA(obj,methodID,args)
  1127.     JNIEnv *        env = FETCHENV;
  1128.     jobject            obj
  1129.     jmethodID        methodID
  1130.     char *            sig = 0;
  1131.     jvalue *        args
  1132.     CODE:
  1133.     {
  1134. #ifdef WIN32
  1135.         RETVAL = env->CallObjectMethodA(obj,methodID,args);
  1136. #else
  1137.         RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
  1138. #endif
  1139.         RESTOREENV;
  1140.     }
  1141.     OUTPUT:
  1142.     RETVAL
  1143.  
  1144. jboolean
  1145. CallBooleanMethod(obj,methodID,...)
  1146.     JNIEnv *        env = FETCHENV;
  1147.     jobject            obj
  1148.     jmethodID        methodID
  1149.     char *            sig = 0;
  1150.     int            argoff = $min_args;
  1151.     CODE:
  1152.     {
  1153.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1154. #ifdef WIN32
  1155.         RETVAL = env->CallBooleanMethodA(obj,methodID,args);
  1156. #else
  1157.         RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID,args);
  1158. #endif
  1159.         RESTOREENV;
  1160.     }
  1161.     OUTPUT:
  1162.     RETVAL
  1163.  
  1164. jboolean
  1165. CallBooleanMethodA(obj,methodID, args)
  1166.     JNIEnv *        env = FETCHENV;
  1167.     jobject            obj
  1168.     jmethodID        methodID
  1169.     char *            sig = 0;
  1170.     jvalue *        args
  1171.     CODE:
  1172.     {
  1173. #ifdef WIN32
  1174.         RETVAL = env->CallBooleanMethodA(obj,methodID, args);
  1175. #else
  1176.         RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID, args);
  1177. #endif
  1178.         RESTOREENV;
  1179.     }
  1180.     OUTPUT:
  1181.     RETVAL
  1182.  
  1183. jbyte
  1184. CallByteMethod(obj,methodID,...)
  1185.     JNIEnv *        env = FETCHENV;
  1186.     jobject            obj
  1187.     jmethodID        methodID
  1188.     char *            sig = 0;
  1189.     int            argoff = $min_args;
  1190.     CODE:
  1191.     {
  1192.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1193. #ifdef WIN32
  1194.         RETVAL = env->CallByteMethodA(obj,methodID,args);
  1195. #else
  1196.         RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
  1197. #endif
  1198.         RESTOREENV;
  1199.     }
  1200.     OUTPUT:
  1201.     RETVAL
  1202.  
  1203. jbyte
  1204. CallByteMethodA(obj,methodID,args)
  1205.     JNIEnv *        env = FETCHENV;
  1206.     jobject            obj
  1207.     jmethodID        methodID
  1208.     char *            sig = 0;
  1209.     jvalue *        args
  1210.     CODE:
  1211.     {
  1212. #ifdef WIN32
  1213.         RETVAL = env->CallByteMethodA(obj,methodID,args);
  1214. #else
  1215.         RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
  1216. #endif
  1217.         RESTOREENV;
  1218.     }
  1219.     OUTPUT:
  1220.     RETVAL
  1221.  
  1222. jchar
  1223. CallCharMethod(obj,methodID,...)
  1224.     JNIEnv *        env = FETCHENV;
  1225.     jobject            obj
  1226.     jmethodID        methodID
  1227.     char *            sig = 0;
  1228.     int            argoff = $min_args;
  1229.     CODE:
  1230.     {
  1231.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1232. #ifdef WIN32
  1233.         RETVAL = env->CallCharMethodA(obj,methodID,args);
  1234. #else
  1235.         RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
  1236. #endif
  1237.         RESTOREENV;
  1238.     }
  1239.     OUTPUT:
  1240.     RETVAL
  1241.  
  1242. jchar
  1243. CallCharMethodA(obj,methodID,args)
  1244.     JNIEnv *        env = FETCHENV;
  1245.     jobject            obj
  1246.     jmethodID        methodID
  1247.     char *            sig = 0;
  1248.     jvalue *        args
  1249.     CODE:
  1250.     {
  1251. #ifdef WIN32
  1252.         RETVAL = env->CallCharMethodA(obj,methodID,args);
  1253. #else
  1254.         RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
  1255. #endif
  1256.         RESTOREENV;
  1257.     }
  1258.     OUTPUT:
  1259.     RETVAL
  1260.  
  1261. jshort
  1262. CallShortMethod(obj,methodID,...)
  1263.     JNIEnv *        env = FETCHENV;
  1264.     jobject            obj
  1265.     jmethodID        methodID
  1266.     char *            sig = 0;
  1267.     int            argoff = $min_args;
  1268.     CODE:
  1269.     {
  1270.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1271. #ifdef WIN32
  1272.         RETVAL = env->CallShortMethodA(obj,methodID,args);
  1273. #else
  1274.         RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
  1275. #endif
  1276.         RESTOREENV;
  1277.     }
  1278.     OUTPUT:
  1279.     RETVAL
  1280.  
  1281. jshort
  1282. CallShortMethodA(obj,methodID,args)
  1283.     JNIEnv *        env = FETCHENV;
  1284.     jobject            obj
  1285.     jmethodID        methodID
  1286.     char *            sig = 0;
  1287.     jvalue *        args
  1288.     CODE:
  1289.     {
  1290. #ifdef WIN32
  1291.         RETVAL = env->CallShortMethodA(obj,methodID,args);
  1292. #else
  1293.         RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
  1294. #endif
  1295.         RESTOREENV;
  1296.     }
  1297.     OUTPUT:
  1298.     RETVAL
  1299.  
  1300. jint
  1301. CallIntMethod(obj,methodID,...)
  1302.     JNIEnv *        env = FETCHENV;
  1303.     jobject            obj
  1304.     jmethodID        methodID
  1305.     char *            sig = 0;
  1306.     int            argoff = $min_args;
  1307.     CODE:
  1308.     {
  1309.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1310. #ifdef WIN32
  1311.         RETVAL = env->CallIntMethodA(obj,methodID,args);
  1312. #else
  1313.         RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
  1314. #endif
  1315.         RESTOREENV;
  1316.     }
  1317.     OUTPUT:
  1318.     RETVAL
  1319.  
  1320. jint
  1321. CallIntMethodA(obj,methodID,args)
  1322.     JNIEnv *        env = FETCHENV;
  1323.     jobject            obj
  1324.     jmethodID        methodID
  1325.     char *            sig = 0;
  1326.     jvalue *        args
  1327.     CODE:
  1328.     {
  1329. #ifdef WIN32
  1330.         RETVAL = env->CallIntMethodA(obj,methodID,args);
  1331. #else
  1332.         RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
  1333. #endif
  1334.         RESTOREENV;
  1335.     }
  1336.     OUTPUT:
  1337.     RETVAL
  1338.  
  1339. jlong
  1340. CallLongMethod(obj,methodID,...)
  1341.     JNIEnv *        env = FETCHENV;
  1342.     jobject            obj
  1343.     jmethodID        methodID
  1344.     char *            sig = 0;
  1345.     int            argoff = $min_args;
  1346.     CODE:
  1347.     {
  1348.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1349. #ifdef WIN32
  1350.         RETVAL = env->CallLongMethodA(obj,methodID,args);
  1351. #else
  1352.         RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
  1353. #endif
  1354.         RESTOREENV;
  1355.     }
  1356.     OUTPUT:
  1357.     RETVAL
  1358.  
  1359. jlong
  1360. CallLongMethodA(obj,methodID,args)
  1361.     JNIEnv *        env = FETCHENV;
  1362.     jobject            obj
  1363.     jmethodID        methodID
  1364.     char *            sig = 0;
  1365.     jvalue *        args
  1366.     CODE:
  1367.     {
  1368. #ifdef WIN32
  1369.         RETVAL = env->CallLongMethodA(obj,methodID,args);
  1370. #else
  1371.         RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
  1372. #endif
  1373.         RESTOREENV;
  1374.     }
  1375.     OUTPUT:
  1376.     RETVAL
  1377.  
  1378. jfloat
  1379. CallFloatMethod(obj,methodID,...)
  1380.     JNIEnv *        env = FETCHENV;
  1381.     jobject            obj
  1382.     jmethodID        methodID
  1383.     char *            sig = 0;
  1384.     int            argoff = $min_args;
  1385.     CODE:
  1386.     {
  1387.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1388. #ifdef WIN32
  1389.         RETVAL = env->CallFloatMethodA(obj,methodID,args);
  1390. #else
  1391.         RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
  1392. #endif
  1393.         RESTOREENV;
  1394.     }
  1395.     OUTPUT:
  1396.     RETVAL
  1397.  
  1398. jfloat
  1399. CallFloatMethodA(obj,methodID,args)
  1400.     JNIEnv *        env = FETCHENV;
  1401.     jobject            obj
  1402.     jmethodID        methodID
  1403.     char *            sig = 0;
  1404.     jvalue *        args
  1405.     CODE:
  1406.     {
  1407. #ifdef WIN32
  1408.         RETVAL = env->CallFloatMethodA(obj,methodID,args);
  1409. #else
  1410.         RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
  1411. #endif
  1412.         RESTOREENV;
  1413.     }
  1414.     OUTPUT:
  1415.     RETVAL
  1416.  
  1417. jdouble
  1418. CallDoubleMethod(obj,methodID,...)
  1419.     JNIEnv *        env = FETCHENV;
  1420.     jobject            obj
  1421.     jmethodID        methodID
  1422.     char *            sig = 0;
  1423.     int            argoff = $min_args;
  1424.     CODE:
  1425.     {
  1426.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1427. #ifdef WIN32
  1428.         RETVAL = env->CallDoubleMethodA(obj,methodID,args);
  1429. #else
  1430.         RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
  1431. #endif
  1432.         RESTOREENV;
  1433.     }
  1434.     OUTPUT:
  1435.     RETVAL
  1436.  
  1437. jdouble
  1438. CallDoubleMethodA(obj,methodID,args)
  1439.     JNIEnv *        env = FETCHENV;
  1440.     jobject            obj
  1441.     jmethodID        methodID
  1442.     char *            sig = 0;
  1443.     jvalue *        args
  1444.     CODE:
  1445.     {
  1446. #ifdef WIN32
  1447.         RETVAL = env->CallDoubleMethodA(obj,methodID,args);
  1448. #else
  1449.         RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
  1450. #endif
  1451.         RESTOREENV;
  1452.     }
  1453.     OUTPUT:
  1454.     RETVAL
  1455.  
  1456. void
  1457. CallVoidMethod(obj,methodID,...)
  1458.     JNIEnv *        env = FETCHENV;
  1459.     jobject            obj
  1460.     jmethodID        methodID
  1461.     char *            sig = 0;
  1462.     int            argoff = $min_args;
  1463.     CODE:
  1464.     {
  1465.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1466. #ifdef WIN32
  1467.         env->CallVoidMethodA(obj,methodID,args);
  1468. #else
  1469.         (*env)->CallVoidMethodA(env, obj,methodID,args);
  1470. #endif
  1471.         RESTOREENV;
  1472.     }
  1473.  
  1474. void
  1475. CallVoidMethodA(obj,methodID,args)
  1476.     JNIEnv *        env = FETCHENV;
  1477.     jobject            obj
  1478.     jmethodID        methodID
  1479.     char *            sig = 0;
  1480.     jvalue *        args
  1481.     CODE:
  1482.     {
  1483. #ifdef WIN32
  1484.         env->CallVoidMethodA(obj,methodID,args);
  1485. #else
  1486.         (*env)->CallVoidMethodA(env, obj,methodID,args);
  1487. #endif
  1488.         RESTOREENV;
  1489.     }
  1490.  
  1491. jobject
  1492. CallNonvirtualObjectMethod(obj,clazz,methodID,...)
  1493.     JNIEnv *        env = FETCHENV;
  1494.     jobject            obj
  1495.     jclass            clazz
  1496.     jmethodID        methodID
  1497.     char *            sig = 0;
  1498.     int            argoff = $min_args;
  1499.     CODE:
  1500.     {
  1501.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1502. #ifdef WIN32
  1503.         RETVAL = env->CallNonvirtualObjectMethodA(obj,clazz,methodID,args);
  1504. #else
  1505.         RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
  1506. #endif
  1507.         RESTOREENV;
  1508.     }
  1509.     OUTPUT:
  1510.     RETVAL
  1511.  
  1512. jobject
  1513. CallNonvirtualObjectMethodA(obj,clazz,methodID,args)
  1514.     JNIEnv *        env = FETCHENV;
  1515.     jobject            obj
  1516.     jclass            clazz
  1517.     jmethodID        methodID
  1518.     char *            sig = 0;
  1519.     jvalue *        args
  1520.     CODE:
  1521.     {
  1522. #ifdef WIN32
  1523.         RETVAL = env->CallNonvirtualObjectMethodA(obj,clazz,methodID,args);
  1524. #else
  1525.         RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
  1526. #endif
  1527.         RESTOREENV;
  1528.     }
  1529.     OUTPUT:
  1530.     RETVAL
  1531.  
  1532. jboolean
  1533. CallNonvirtualBooleanMethod(obj,clazz,methodID,...)
  1534.     JNIEnv *        env = FETCHENV;
  1535.     jobject            obj
  1536.     jclass            clazz
  1537.     jmethodID        methodID
  1538.     char *            sig = 0;
  1539.     int            argoff = $min_args;
  1540.     CODE:
  1541.     {
  1542.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1543. #ifdef WIN32
  1544.         RETVAL = env->CallNonvirtualBooleanMethodA(obj,clazz,methodID,args);
  1545. #else
  1546.         RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID,args);
  1547. #endif
  1548.         RESTOREENV;
  1549.     }
  1550.     OUTPUT:
  1551.     RETVAL
  1552.  
  1553. jboolean
  1554. CallNonvirtualBooleanMethodA(obj,clazz,methodID, args)
  1555.     JNIEnv *        env = FETCHENV;
  1556.     jobject            obj
  1557.     jclass            clazz
  1558.     jmethodID        methodID
  1559.     char *            sig = 0;
  1560.     jvalue *        args
  1561.     CODE:
  1562.     {
  1563. #ifdef WIN32
  1564.         RETVAL = env->CallNonvirtualBooleanMethodA(obj,clazz,methodID, args);
  1565. #else
  1566.         RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID, args);
  1567. #endif
  1568.         RESTOREENV;
  1569.     }
  1570.     OUTPUT:
  1571.     RETVAL
  1572.  
  1573. jbyte
  1574. CallNonvirtualByteMethod(obj,clazz,methodID,...)
  1575.     JNIEnv *        env = FETCHENV;
  1576.     jobject            obj
  1577.     jclass            clazz
  1578.     jmethodID        methodID
  1579.     char *            sig = 0;
  1580.     int            argoff = $min_args;
  1581.     CODE:
  1582.     {
  1583.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1584. #ifdef WIN32
  1585.         RETVAL = env->CallNonvirtualByteMethodA(obj,clazz,methodID,args);
  1586. #else
  1587.         RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
  1588. #endif
  1589.         RESTOREENV;
  1590.     }
  1591.     OUTPUT:
  1592.     RETVAL
  1593.  
  1594. jbyte
  1595. CallNonvirtualByteMethodA(obj,clazz,methodID,args)
  1596.     JNIEnv *        env = FETCHENV;
  1597.     jobject            obj
  1598.     jclass            clazz
  1599.     jmethodID        methodID
  1600.     char *            sig = 0;
  1601.     jvalue *        args
  1602.     CODE:
  1603.     {
  1604. #ifdef WIN32
  1605.         RETVAL = env->CallNonvirtualByteMethodA(obj,clazz,methodID,args);
  1606. #else
  1607.         RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
  1608. #endif
  1609.         RESTOREENV;
  1610.     }
  1611.     OUTPUT:
  1612.     RETVAL
  1613.  
  1614. jchar
  1615. CallNonvirtualCharMethod(obj,clazz,methodID,...)
  1616.     JNIEnv *        env = FETCHENV;
  1617.     jobject            obj
  1618.     jclass            clazz
  1619.     jmethodID        methodID
  1620.     char *            sig = 0;
  1621.     int            argoff = $min_args;
  1622.     CODE:
  1623.     {
  1624.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1625. #ifdef WIN32
  1626.         RETVAL = env->CallNonvirtualCharMethodA(obj,clazz,methodID,args);
  1627. #else
  1628.         RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
  1629. #endif
  1630.         RESTOREENV;
  1631.     }
  1632.     OUTPUT:
  1633.     RETVAL
  1634.  
  1635. jchar
  1636. CallNonvirtualCharMethodA(obj,clazz,methodID,args)
  1637.     JNIEnv *        env = FETCHENV;
  1638.     jobject            obj
  1639.     jclass            clazz
  1640.     jmethodID        methodID
  1641.     char *            sig = 0;
  1642.     jvalue *        args
  1643.     CODE:
  1644.     {
  1645. #ifdef WIN32
  1646.         RETVAL = env->CallNonvirtualCharMethodA(obj,clazz,methodID,args);
  1647. #else
  1648.         RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
  1649. #endif
  1650.         RESTOREENV;
  1651.     }
  1652.     OUTPUT:
  1653.     RETVAL
  1654.  
  1655. jshort
  1656. CallNonvirtualShortMethod(obj,clazz,methodID,...)
  1657.     JNIEnv *        env = FETCHENV;
  1658.     jobject            obj
  1659.     jclass            clazz
  1660.     jmethodID        methodID
  1661.     char *            sig = 0;
  1662.     int            argoff = $min_args;
  1663.     CODE:
  1664.     {
  1665.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1666. #ifdef WIN32
  1667.         RETVAL = env->CallNonvirtualShortMethodA(obj,clazz,methodID,args);
  1668. #else
  1669.         RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
  1670. #endif
  1671.         RESTOREENV;
  1672.     }
  1673.     OUTPUT:
  1674.     RETVAL
  1675.  
  1676. jshort
  1677. CallNonvirtualShortMethodA(obj,clazz,methodID,args)
  1678.     JNIEnv *        env = FETCHENV;
  1679.     jobject            obj
  1680.     jclass            clazz
  1681.     jmethodID        methodID
  1682.     char *            sig = 0;
  1683.     jvalue *        args
  1684.     CODE:
  1685.     {
  1686. #ifdef WIN32
  1687.         RETVAL = env->CallNonvirtualShortMethodA(obj,clazz,methodID,args);
  1688. #else
  1689.         RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
  1690. #endif
  1691.         RESTOREENV;
  1692.     }
  1693.     OUTPUT:
  1694.     RETVAL
  1695.  
  1696. jint
  1697. CallNonvirtualIntMethod(obj,clazz,methodID,...)
  1698.     JNIEnv *        env = FETCHENV;
  1699.     jobject            obj
  1700.     jclass            clazz
  1701.     jmethodID        methodID
  1702.     char *            sig = 0;
  1703.     int            argoff = $min_args;
  1704.     CODE:
  1705.     {
  1706.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1707. #ifdef WIN32
  1708.         RETVAL = env->CallNonvirtualIntMethodA(obj,clazz,methodID,args);
  1709. #else
  1710.         RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
  1711. #endif
  1712.         RESTOREENV;
  1713.     }
  1714.     OUTPUT:
  1715.     RETVAL
  1716.  
  1717. jint
  1718. CallNonvirtualIntMethodA(obj,clazz,methodID,args)
  1719.     JNIEnv *        env = FETCHENV;
  1720.     jobject            obj
  1721.     jclass            clazz
  1722.     jmethodID        methodID
  1723.     char *            sig = 0;
  1724.     jvalue *        args
  1725.     CODE:
  1726.     {
  1727. #ifdef WIN32
  1728.         RETVAL = env->CallNonvirtualIntMethodA(obj,clazz,methodID,args);
  1729. #else
  1730.         RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
  1731. #endif
  1732.         RESTOREENV;
  1733.     }
  1734.     OUTPUT:
  1735.     RETVAL
  1736.  
  1737. jlong
  1738. CallNonvirtualLongMethod(obj,clazz,methodID,...)
  1739.     JNIEnv *        env = FETCHENV;
  1740.     jobject            obj
  1741.     jclass            clazz
  1742.     jmethodID        methodID
  1743.     char *            sig = 0;
  1744.     int            argoff = $min_args;
  1745.     CODE:
  1746.     {
  1747.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1748. #ifdef WIN32
  1749.         RETVAL = env->CallNonvirtualLongMethodA(obj,clazz,methodID,args);
  1750. #else
  1751.         RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
  1752. #endif
  1753.         RESTOREENV;
  1754.     }
  1755.     OUTPUT:
  1756.     RETVAL
  1757.  
  1758. jlong
  1759. CallNonvirtualLongMethodA(obj,clazz,methodID,args)
  1760.     JNIEnv *        env = FETCHENV;
  1761.     jobject            obj
  1762.     jclass            clazz
  1763.     jmethodID        methodID
  1764.     char *            sig = 0;
  1765.     jvalue *        args
  1766.     CODE:
  1767.     {
  1768. #ifdef WIN32
  1769.         RETVAL = env->CallNonvirtualLongMethodA(obj,clazz,methodID,args);
  1770. #else
  1771.         RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
  1772. #endif
  1773.         RESTOREENV;
  1774.     }
  1775.     OUTPUT:
  1776.     RETVAL
  1777.  
  1778. jfloat
  1779. CallNonvirtualFloatMethod(obj,clazz,methodID,...)
  1780.     JNIEnv *        env = FETCHENV;
  1781.     jobject            obj
  1782.     jclass            clazz
  1783.     jmethodID        methodID
  1784.     char *            sig = 0;
  1785.     int            argoff = $min_args;
  1786.     CODE:
  1787.     {
  1788.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1789. #ifdef WIN32
  1790.         RETVAL = env->CallNonvirtualFloatMethodA(obj,clazz,methodID,args);
  1791. #else
  1792.         RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
  1793. #endif
  1794.         RESTOREENV;
  1795.     }
  1796.     OUTPUT:
  1797.     RETVAL
  1798.  
  1799. jfloat
  1800. CallNonvirtualFloatMethodA(obj,clazz,methodID,args)
  1801.     JNIEnv *        env = FETCHENV;
  1802.     jobject            obj
  1803.     jclass            clazz
  1804.     jmethodID        methodID
  1805.     char *            sig = 0;
  1806.     jvalue *        args
  1807.     CODE:
  1808.     {
  1809. #ifdef WIN32
  1810.         RETVAL = env->CallNonvirtualFloatMethodA(obj,clazz,methodID,args);
  1811. #else
  1812.         RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
  1813. #endif
  1814.         RESTOREENV;
  1815.     }
  1816.     OUTPUT:
  1817.     RETVAL
  1818.  
  1819. jdouble
  1820. CallNonvirtualDoubleMethod(obj,clazz,methodID,...)
  1821.     JNIEnv *        env = FETCHENV;
  1822.     jobject            obj
  1823.     jclass            clazz
  1824.     jmethodID        methodID
  1825.     char *            sig = 0;
  1826.     int            argoff = $min_args;
  1827.     CODE:
  1828.     {
  1829.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1830. #ifdef WIN32
  1831.         RETVAL = env->CallNonvirtualDoubleMethodA(obj,clazz,methodID,args);
  1832. #else
  1833.         RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
  1834. #endif
  1835.         RESTOREENV;
  1836.     }
  1837.     OUTPUT:
  1838.     RETVAL
  1839.  
  1840. jdouble
  1841. CallNonvirtualDoubleMethodA(obj,clazz,methodID,args)
  1842.     JNIEnv *        env = FETCHENV;
  1843.     jobject            obj
  1844.     jclass            clazz
  1845.     jmethodID        methodID
  1846.     char *            sig = 0;
  1847.     jvalue *        args
  1848.     CODE:
  1849.     {
  1850. #ifdef WIN32
  1851.         RETVAL = env->CallNonvirtualDoubleMethodA(obj,clazz,methodID,args);
  1852. #else
  1853.         RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
  1854. #endif
  1855.         RESTOREENV;
  1856.     }
  1857.     OUTPUT:
  1858.     RETVAL
  1859.  
  1860. void
  1861. CallNonvirtualVoidMethod(obj,clazz,methodID,...)
  1862.     JNIEnv *        env = FETCHENV;
  1863.     jobject            obj
  1864.     jclass            clazz
  1865.     jmethodID        methodID
  1866.     char *            sig = 0;
  1867.     int            argoff = $min_args;
  1868.     CODE:
  1869.     {
  1870.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  1871. #ifdef WIN32
  1872.         env->CallNonvirtualVoidMethodA(obj,clazz,methodID,args);
  1873. #else
  1874.         (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
  1875. #endif
  1876.         RESTOREENV;
  1877.     }
  1878.  
  1879. void
  1880. CallNonvirtualVoidMethodA(obj,clazz,methodID,args)
  1881.     JNIEnv *        env = FETCHENV;
  1882.     jobject            obj
  1883.     jclass            clazz
  1884.     jmethodID        methodID
  1885.     char *            sig = 0;
  1886.     jvalue *        args
  1887.     CODE:
  1888.     {
  1889. #ifdef WIN32
  1890.         env->CallNonvirtualVoidMethodA(obj,clazz,methodID,args);
  1891. #else
  1892.         (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
  1893. #endif
  1894.         RESTOREENV;
  1895.     }
  1896.  
  1897. jfieldID
  1898. GetFieldID(clazz,name,sig)
  1899.     JNIEnv *        env = FETCHENV;
  1900.     jclass            clazz
  1901.     const char *        name
  1902.     const char *        sig
  1903.     CODE:
  1904.     {
  1905. #ifdef WIN32
  1906.         RETVAL = env->GetFieldID(clazz,name,sig);
  1907. #else
  1908.         RETVAL = (*env)->GetFieldID(env, clazz,name,sig);
  1909. #endif
  1910.         RESTOREENV;
  1911.     }
  1912.     OUTPUT:
  1913.     RETVAL
  1914.  
  1915. jobject
  1916. GetObjectField(obj,fieldID)
  1917.     JNIEnv *        env = FETCHENV;
  1918.     jobject            obj
  1919.     jfieldID        fieldID
  1920.     char *            sig = 0;
  1921.     CODE:
  1922.     {
  1923. #ifdef WIN32
  1924.         RETVAL = env->GetObjectField(obj,fieldID);
  1925. #else
  1926.         RETVAL = (*env)->GetObjectField(env, obj,fieldID);
  1927. #endif
  1928.         RESTOREENV;
  1929.     }
  1930.     OUTPUT:
  1931.     RETVAL
  1932.  
  1933. jboolean
  1934. GetBooleanField(obj,fieldID)
  1935.     JNIEnv *        env = FETCHENV;
  1936.     jobject            obj
  1937.     jfieldID        fieldID
  1938.     char *            sig = 0;
  1939.     CODE:
  1940.     {
  1941. #ifdef WIN32
  1942.         RETVAL = env->GetBooleanField(obj,fieldID);
  1943. #else
  1944.         RETVAL = (*env)->GetBooleanField(env, obj,fieldID);
  1945. #endif
  1946.         RESTOREENV;
  1947.     }
  1948.     OUTPUT:
  1949.     RETVAL
  1950.  
  1951. jbyte
  1952. GetByteField(obj,fieldID)
  1953.     JNIEnv *        env = FETCHENV;
  1954.     jobject            obj
  1955.     jfieldID        fieldID
  1956.     char *            sig = 0;
  1957.     CODE:
  1958.     {
  1959. #ifdef WIN32
  1960.         RETVAL = env->GetByteField(obj,fieldID);
  1961. #else
  1962.         RETVAL = (*env)->GetByteField(env, obj,fieldID);
  1963. #endif
  1964.         RESTOREENV;
  1965.     }
  1966.     OUTPUT:
  1967.     RETVAL
  1968.  
  1969. jchar
  1970. GetCharField(obj,fieldID)
  1971.     JNIEnv *        env = FETCHENV;
  1972.     jobject            obj
  1973.     jfieldID        fieldID
  1974.     char *            sig = 0;
  1975.     CODE:
  1976.     {
  1977. #ifdef WIN32
  1978.         RETVAL = env->GetCharField(obj,fieldID);
  1979. #else
  1980.         RETVAL = (*env)->GetCharField(env, obj,fieldID);
  1981. #endif
  1982.         RESTOREENV;
  1983.     }
  1984.     OUTPUT:
  1985.     RETVAL
  1986.  
  1987. jshort
  1988. GetShortField(obj,fieldID)
  1989.     JNIEnv *        env = FETCHENV;
  1990.     jobject            obj
  1991.     jfieldID        fieldID
  1992.     char *            sig = 0;
  1993.     CODE:
  1994.     {
  1995. #ifdef WIN32
  1996.         RETVAL = env->GetShortField(obj,fieldID);
  1997. #else
  1998.         RETVAL = (*env)->GetShortField(env, obj,fieldID);
  1999. #endif
  2000.         RESTOREENV;
  2001.     }
  2002.     OUTPUT:
  2003.     RETVAL
  2004.  
  2005. jint
  2006. GetIntField(obj,fieldID)
  2007.     JNIEnv *        env = FETCHENV;
  2008.     jobject            obj
  2009.     jfieldID        fieldID
  2010.     char *            sig = 0;
  2011.     CODE:
  2012.     {
  2013. #ifdef WIN32
  2014.         RETVAL = env->GetIntField(obj,fieldID);
  2015. #else
  2016.         RETVAL = (*env)->GetIntField(env, obj,fieldID);
  2017. #endif
  2018.         RESTOREENV;
  2019.     }
  2020.     OUTPUT:
  2021.     RETVAL
  2022.  
  2023. jlong
  2024. GetLongField(obj,fieldID)
  2025.     JNIEnv *        env = FETCHENV;
  2026.     jobject            obj
  2027.     jfieldID        fieldID
  2028.     char *            sig = 0;
  2029.     CODE:
  2030.     {
  2031. #ifdef WIN32
  2032.         RETVAL = env->GetLongField(obj,fieldID);
  2033. #else
  2034.         RETVAL = (*env)->GetLongField(env, obj,fieldID);
  2035. #endif
  2036.         RESTOREENV;
  2037.     }
  2038.     OUTPUT:
  2039.     RETVAL
  2040.  
  2041. jfloat
  2042. GetFloatField(obj,fieldID)
  2043.     JNIEnv *        env = FETCHENV;
  2044.     jobject            obj
  2045.     jfieldID        fieldID
  2046.     char *            sig = 0;
  2047.     CODE:
  2048.     {
  2049. #ifdef WIN32
  2050.         RETVAL = env->GetFloatField(obj,fieldID);
  2051. #else
  2052.         RETVAL = (*env)->GetFloatField(env, obj,fieldID);
  2053. #endif
  2054.         RESTOREENV;
  2055.     }
  2056.     OUTPUT:
  2057.     RETVAL
  2058.  
  2059. jdouble
  2060. GetDoubleField(obj,fieldID)
  2061.     JNIEnv *        env = FETCHENV;
  2062.     jobject            obj
  2063.     jfieldID        fieldID
  2064.     char *            sig = 0;
  2065.     CODE:
  2066.     {
  2067. #ifdef WIN32
  2068.         RETVAL = env->GetDoubleField(obj,fieldID);
  2069. #else
  2070.         RETVAL = (*env)->GetDoubleField(env, obj,fieldID);
  2071. #endif
  2072.         RESTOREENV;
  2073.     }
  2074.     OUTPUT:
  2075.     RETVAL
  2076.  
  2077. void
  2078. SetObjectField(obj,fieldID,val)
  2079.     JNIEnv *        env = FETCHENV;
  2080.     jobject            obj
  2081.     jfieldID        fieldID
  2082.     char *            sig = 0;
  2083.     jobject            val
  2084.     CODE:
  2085.     {
  2086. #ifdef WIN32
  2087.         env->SetObjectField(obj,fieldID,val);
  2088. #else
  2089.         (*env)->SetObjectField(env, obj,fieldID,val);
  2090. #endif
  2091.         RESTOREENV;
  2092.     }
  2093.  
  2094. void
  2095. SetBooleanField(obj,fieldID,val)
  2096.     JNIEnv *        env = FETCHENV;
  2097.     jobject            obj
  2098.     jfieldID        fieldID
  2099.     char *            sig = 0;
  2100.     jboolean        val
  2101.     CODE:
  2102.     {
  2103. #ifdef WIN32
  2104.         env->SetBooleanField(obj,fieldID,val);
  2105. #else
  2106.         (*env)->SetBooleanField(env, obj,fieldID,val);
  2107. #endif
  2108.         RESTOREENV;
  2109.     }
  2110.  
  2111. void
  2112. SetByteField(obj,fieldID,val)
  2113.     JNIEnv *        env = FETCHENV;
  2114.     jobject            obj
  2115.     jfieldID        fieldID
  2116.     char *            sig = 0;
  2117.     jbyte            val
  2118.     CODE:
  2119.     {
  2120. #ifdef WIN32
  2121.         env->SetByteField(obj,fieldID,val);
  2122. #else
  2123.         (*env)->SetByteField(env, obj,fieldID,val);
  2124. #endif
  2125.         RESTOREENV;
  2126.     }
  2127.  
  2128. void
  2129. SetCharField(obj,fieldID,val)
  2130.     JNIEnv *        env = FETCHENV;
  2131.     jobject            obj
  2132.     jfieldID        fieldID
  2133.     char *            sig = 0;
  2134.     jchar            val
  2135.     CODE:
  2136.     {
  2137. #ifdef WIN32
  2138.         env->SetCharField(obj,fieldID,val);
  2139. #else
  2140.         (*env)->SetCharField(env, obj,fieldID,val);
  2141. #endif
  2142.         RESTOREENV;
  2143.     }
  2144.  
  2145. void
  2146. SetShortField(obj,fieldID,val)
  2147.     JNIEnv *        env = FETCHENV;
  2148.     jobject            obj
  2149.     jfieldID        fieldID
  2150.     char *            sig = 0;
  2151.     jshort            val
  2152.     CODE:
  2153.     {
  2154. #ifdef WIN32
  2155.         env->SetShortField(obj,fieldID,val);
  2156. #else
  2157.         (*env)->SetShortField(env, obj,fieldID,val);
  2158. #endif
  2159.         RESTOREENV;
  2160.     }
  2161.  
  2162. void
  2163. SetIntField(obj,fieldID,val)
  2164.     JNIEnv *        env = FETCHENV;
  2165.     jobject            obj
  2166.     jfieldID        fieldID
  2167.     char *            sig = 0;
  2168.     jint            val
  2169.     CODE:
  2170.     {
  2171. #ifdef WIN32
  2172.         env->SetIntField(obj,fieldID,val);
  2173. #else
  2174.         (*env)->SetIntField(env, obj,fieldID,val);
  2175. #endif
  2176.         RESTOREENV;
  2177.     }
  2178.  
  2179. void
  2180. SetLongField(obj,fieldID,val)
  2181.     JNIEnv *        env = FETCHENV;
  2182.     jobject            obj
  2183.     jfieldID        fieldID
  2184.     char *            sig = 0;
  2185.     jlong            val
  2186.     CODE:
  2187.     {
  2188. #ifdef WIN32
  2189.         env->SetLongField(obj,fieldID,val);
  2190. #else
  2191.         (*env)->SetLongField(env, obj,fieldID,val);
  2192. #endif
  2193.         RESTOREENV;
  2194.     }
  2195.  
  2196. void
  2197. SetFloatField(obj,fieldID,val)
  2198.     JNIEnv *        env = FETCHENV;
  2199.     jobject            obj
  2200.     jfieldID        fieldID
  2201.     char *            sig = 0;
  2202.     jfloat            val
  2203.     CODE:
  2204.     {
  2205. #ifdef WIN32
  2206.         env->SetFloatField(obj,fieldID,val);
  2207. #else
  2208.         (*env)->SetFloatField(env, obj,fieldID,val);
  2209. #endif
  2210.         RESTOREENV;
  2211.     }
  2212.  
  2213. void
  2214. SetDoubleField(obj,fieldID,val)
  2215.     JNIEnv *        env = FETCHENV;
  2216.     jobject            obj
  2217.     jfieldID        fieldID
  2218.     char *            sig = 0;
  2219.     jdouble            val
  2220.     CODE:
  2221.     {
  2222. #ifdef WIN32
  2223.         env->SetDoubleField(obj,fieldID,val);
  2224. #else
  2225.         (*env)->SetDoubleField(env, obj,fieldID,val);
  2226. #endif
  2227.         RESTOREENV;
  2228.     }
  2229.  
  2230. jmethodID
  2231. GetStaticMethodID(clazz,name,sig)
  2232.     JNIEnv *        env = FETCHENV;
  2233.     jclass            clazz
  2234.     const char *        name
  2235.     const char *        sig
  2236.     CODE:
  2237.     {
  2238. #ifdef WIN32
  2239.         RETVAL = env->GetStaticMethodID(clazz,name,sig);
  2240. #else
  2241.         RETVAL = (*env)->GetStaticMethodID(env, clazz,name,sig);
  2242. #endif
  2243.         RESTOREENV;
  2244.     }
  2245.     OUTPUT:
  2246.     RETVAL
  2247.  
  2248. jobject
  2249. CallStaticObjectMethod(clazz,methodID,...)
  2250.     JNIEnv *        env = FETCHENV;
  2251.     jclass            clazz
  2252.     jmethodID        methodID
  2253.     char *            sig = 0;
  2254.     int            argoff = $min_args;
  2255.     CODE:
  2256.     {
  2257.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2258. #ifdef WIN32
  2259.         RETVAL = env->CallStaticObjectMethodA(clazz,methodID,args);
  2260. #else
  2261.         RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
  2262. #endif
  2263.         RESTOREENV;
  2264.     }
  2265.     OUTPUT:
  2266.     RETVAL
  2267.  
  2268. jobject
  2269. CallStaticObjectMethodA(clazz,methodID,args)
  2270.     JNIEnv *        env = FETCHENV;
  2271.     jclass            clazz
  2272.     jmethodID        methodID
  2273.     char *            sig = 0;
  2274.     jvalue *        args
  2275.     CODE:
  2276.     {
  2277. #ifdef WIN32
  2278.         RETVAL = env->CallStaticObjectMethodA(clazz,methodID,args);
  2279. #else
  2280.         RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
  2281. #endif
  2282.         RESTOREENV;
  2283.     }
  2284.     OUTPUT:
  2285.     RETVAL
  2286.  
  2287. jboolean
  2288. CallStaticBooleanMethod(clazz,methodID,...)
  2289.     JNIEnv *        env = FETCHENV;
  2290.     jclass            clazz
  2291.     jmethodID        methodID
  2292.     char *            sig = 0;
  2293.     int            argoff = $min_args;
  2294.     CODE:
  2295.     {
  2296.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2297. #ifdef WIN32
  2298.         RETVAL = env->CallStaticBooleanMethodA(clazz,methodID,args);
  2299. #else
  2300.         RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
  2301. #endif
  2302.         RESTOREENV;
  2303.     }
  2304.     OUTPUT:
  2305.     RETVAL
  2306.  
  2307. jboolean
  2308. CallStaticBooleanMethodA(clazz,methodID,args)
  2309.     JNIEnv *        env = FETCHENV;
  2310.     jclass            clazz
  2311.     jmethodID        methodID
  2312.     char *            sig = 0;
  2313.     jvalue *        args
  2314.     CODE:
  2315.     {
  2316. #ifdef WIN32
  2317.         RETVAL = env->CallStaticBooleanMethodA(clazz,methodID,args);
  2318. #else
  2319.         RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
  2320. #endif
  2321.         RESTOREENV;
  2322.     }
  2323.     OUTPUT:
  2324.     RETVAL
  2325.  
  2326. jbyte
  2327. CallStaticByteMethod(clazz,methodID,...)
  2328.     JNIEnv *        env = FETCHENV;
  2329.     jclass            clazz
  2330.     jmethodID        methodID
  2331.     char *            sig = 0;
  2332.     int            argoff = $min_args;
  2333.     CODE:
  2334.     {
  2335.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2336. #ifdef WIN32
  2337.         RETVAL = env->CallStaticByteMethodA(clazz,methodID,args);
  2338. #else
  2339.         RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
  2340. #endif
  2341.         RESTOREENV;
  2342.     }
  2343.     OUTPUT:
  2344.     RETVAL
  2345.  
  2346. jbyte
  2347. CallStaticByteMethodA(clazz,methodID,args)
  2348.     JNIEnv *        env = FETCHENV;
  2349.     jclass            clazz
  2350.     jmethodID        methodID
  2351.     char *            sig = 0;
  2352.     jvalue *        args
  2353.     CODE:
  2354.     {
  2355. #ifdef WIN32
  2356.         RETVAL = env->CallStaticByteMethodA(clazz,methodID,args);
  2357. #else
  2358.         RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
  2359. #endif
  2360.         RESTOREENV;
  2361.     }
  2362.     OUTPUT:
  2363.     RETVAL
  2364.  
  2365. jchar
  2366. CallStaticCharMethod(clazz,methodID,...)
  2367.     JNIEnv *        env = FETCHENV;
  2368.     jclass            clazz
  2369.     jmethodID        methodID
  2370.     char *            sig = 0;
  2371.     int            argoff = $min_args;
  2372.     CODE:
  2373.     {
  2374.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2375. #ifdef WIN32
  2376.         RETVAL = env->CallStaticCharMethodA(clazz,methodID,args);
  2377. #else
  2378.         RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
  2379. #endif
  2380.         RESTOREENV;
  2381.     }
  2382.     OUTPUT:
  2383.     RETVAL
  2384.  
  2385. jchar
  2386. CallStaticCharMethodA(clazz,methodID,args)
  2387.     JNIEnv *        env = FETCHENV;
  2388.     jclass            clazz
  2389.     jmethodID        methodID
  2390.     char *            sig = 0;
  2391.     jvalue *        args
  2392.     CODE:
  2393.     {
  2394. #ifdef WIN32
  2395.         RETVAL = env->CallStaticCharMethodA(clazz,methodID,args);
  2396. #else
  2397.         RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
  2398. #endif
  2399.         RESTOREENV;
  2400.     }
  2401.     OUTPUT:
  2402.     RETVAL
  2403.  
  2404. jshort
  2405. CallStaticShortMethod(clazz,methodID,...)
  2406.     JNIEnv *        env = FETCHENV;
  2407.     jclass            clazz
  2408.     jmethodID        methodID
  2409.     char *            sig = 0;
  2410.     int            argoff = $min_args;
  2411.     CODE:
  2412.     {
  2413.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2414. #ifdef WIN32
  2415.         RETVAL = env->CallStaticShortMethodA(clazz,methodID,args);
  2416. #else
  2417.         RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
  2418. #endif
  2419.         RESTOREENV;
  2420.     }
  2421.     OUTPUT:
  2422.     RETVAL
  2423.  
  2424. jshort
  2425. CallStaticShortMethodA(clazz,methodID,args)
  2426.     JNIEnv *        env = FETCHENV;
  2427.     jclass            clazz
  2428.     jmethodID        methodID
  2429.     char *            sig = 0;
  2430.     jvalue *        args
  2431.     CODE:
  2432.     {
  2433. #ifdef WIN32
  2434.         RETVAL = env->CallStaticShortMethodA(clazz,methodID,args);
  2435. #else
  2436.         RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
  2437. #endif
  2438.         RESTOREENV;
  2439.     }
  2440.     OUTPUT:
  2441.     RETVAL
  2442.  
  2443. jint
  2444. CallStaticIntMethod(clazz,methodID,...)
  2445.     JNIEnv *        env = FETCHENV;
  2446.     jclass            clazz
  2447.     jmethodID        methodID
  2448.     char *            sig = 0;
  2449.     int            argoff = $min_args;
  2450.     CODE:
  2451.     {
  2452.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2453. #ifdef WIN32
  2454.         RETVAL = env->CallStaticIntMethodA(clazz,methodID,args);
  2455. #else
  2456.         RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
  2457. #endif
  2458.         RESTOREENV;
  2459.     }
  2460.     OUTPUT:
  2461.     RETVAL
  2462.  
  2463. jint
  2464. CallStaticIntMethodA(clazz,methodID,args)
  2465.     JNIEnv *        env = FETCHENV;
  2466.     jclass            clazz
  2467.     jmethodID        methodID
  2468.     char *            sig = 0;
  2469.     jvalue *        args
  2470.     CODE:
  2471.     {
  2472. #ifdef WIN32
  2473.         RETVAL = env->CallStaticIntMethodA(clazz,methodID,args);
  2474. #else
  2475.         RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
  2476. #endif
  2477.         RESTOREENV;
  2478.     }
  2479.     OUTPUT:
  2480.     RETVAL
  2481.  
  2482. jlong
  2483. CallStaticLongMethod(clazz,methodID,...)
  2484.     JNIEnv *        env = FETCHENV;
  2485.     jclass            clazz
  2486.     jmethodID        methodID
  2487.     char *            sig = 0;
  2488.     int            argoff = $min_args;
  2489.     CODE:
  2490.     {
  2491.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2492. #ifdef WIN32
  2493.         RETVAL = env->CallStaticLongMethodA(clazz,methodID,args);
  2494. #else
  2495.         RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
  2496. #endif
  2497.         RESTOREENV;
  2498.     }
  2499.     OUTPUT:
  2500.     RETVAL
  2501.  
  2502. jlong
  2503. CallStaticLongMethodA(clazz,methodID,args)
  2504.     JNIEnv *        env = FETCHENV;
  2505.     jclass            clazz
  2506.     jmethodID        methodID
  2507.     char *            sig = 0;
  2508.     jvalue *        args
  2509.     CODE:
  2510.     {
  2511. #ifdef WIN32
  2512.         RETVAL = env->CallStaticLongMethodA(clazz,methodID,args);
  2513. #else
  2514.         RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
  2515. #endif
  2516.         RESTOREENV;
  2517.     }
  2518.     OUTPUT:
  2519.     RETVAL
  2520.  
  2521. jfloat
  2522. CallStaticFloatMethod(clazz,methodID,...)
  2523.     JNIEnv *        env = FETCHENV;
  2524.     jclass            clazz
  2525.     jmethodID        methodID
  2526.     char *            sig = 0;
  2527.     int            argoff = $min_args;
  2528.     CODE:
  2529.     {
  2530.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2531. #ifdef WIN32
  2532.         RETVAL = env->CallStaticFloatMethodA(clazz,methodID,args);
  2533. #else
  2534.         RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
  2535. #endif
  2536.         RESTOREENV;
  2537.     }
  2538.     OUTPUT:
  2539.     RETVAL
  2540.  
  2541. jfloat
  2542. CallStaticFloatMethodA(clazz,methodID,args)
  2543.     JNIEnv *        env = FETCHENV;
  2544.     jclass            clazz
  2545.     jmethodID        methodID
  2546.     char *            sig = 0;
  2547.     jvalue *        args
  2548.     CODE:
  2549.     {
  2550. #ifdef WIN32
  2551.         RETVAL = env->CallStaticFloatMethodA(clazz,methodID,args);
  2552. #else
  2553.         RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
  2554. #endif
  2555.         RESTOREENV;
  2556.     }
  2557.     OUTPUT:
  2558.     RETVAL
  2559.  
  2560. jdouble
  2561. CallStaticDoubleMethod(clazz,methodID,...)
  2562.     JNIEnv *        env = FETCHENV;
  2563.     jclass            clazz
  2564.     jmethodID        methodID
  2565.     char *            sig = 0;
  2566.     int            argoff = $min_args;
  2567.     CODE:
  2568.     {
  2569.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2570. #ifdef WIN32
  2571.         RETVAL = env->CallStaticDoubleMethodA(clazz,methodID,args);
  2572. #else
  2573.         RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
  2574. #endif
  2575.         RESTOREENV;
  2576.     }
  2577.     OUTPUT:
  2578.     RETVAL
  2579.  
  2580. jdouble
  2581. CallStaticDoubleMethodA(clazz,methodID,args)
  2582.     JNIEnv *        env = FETCHENV;
  2583.     jclass            clazz
  2584.     jmethodID        methodID
  2585.     char *            sig = 0;
  2586.     jvalue *        args
  2587.     CODE:
  2588.     {
  2589. #ifdef WIN32
  2590.         RETVAL = env->CallStaticDoubleMethodA(clazz,methodID,args);
  2591. #else
  2592.         RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
  2593. #endif
  2594.         RESTOREENV;
  2595.     }
  2596.     OUTPUT:
  2597.     RETVAL
  2598.  
  2599. void
  2600. CallStaticVoidMethod(cls,methodID,...)
  2601.     JNIEnv *        env = FETCHENV;
  2602.     jclass            cls
  2603.     jmethodID        methodID
  2604.     char *            sig = 0;
  2605.     int            argoff = $min_args;
  2606.     CODE:
  2607.     {
  2608.         jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
  2609. #ifdef WIN32
  2610.         env->CallStaticVoidMethodA(cls,methodID,args);
  2611. #else
  2612.         (*env)->CallStaticVoidMethodA(env, cls,methodID,args);
  2613. #endif
  2614.         RESTOREENV;
  2615.     }
  2616.  
  2617. void
  2618. CallStaticVoidMethodA(cls,methodID,args)
  2619.     JNIEnv *        env = FETCHENV;
  2620.     jclass            cls
  2621.     jmethodID        methodID
  2622.     char *            sig = 0;
  2623.     jvalue *        args
  2624.     CODE:
  2625.     {
  2626. #ifdef WIN32
  2627.         env->CallStaticVoidMethodA(cls,methodID,args);
  2628. #else
  2629.         (*env)->CallStaticVoidMethodA(env, cls,methodID,args);
  2630. #endif
  2631.         RESTOREENV;
  2632.     }
  2633.  
  2634. jfieldID
  2635. GetStaticFieldID(clazz,name,sig)
  2636.     JNIEnv *        env = FETCHENV;
  2637.     jclass            clazz
  2638.     const char *        name
  2639.     const char *        sig
  2640.     CODE:
  2641.     {
  2642. #ifdef WIN32
  2643.         RETVAL = env->GetStaticFieldID(clazz,name,sig);
  2644. #else
  2645.         RETVAL = (*env)->GetStaticFieldID(env, clazz,name,sig);
  2646. #endif
  2647.         RESTOREENV;
  2648.     }
  2649.     OUTPUT:
  2650.     RETVAL
  2651.  
  2652. jobject
  2653. GetStaticObjectField(clazz,fieldID)
  2654.     JNIEnv *        env = FETCHENV;
  2655.     jclass            clazz
  2656.     jfieldID        fieldID
  2657.     char *            sig = 0;
  2658.     CODE:
  2659.     {
  2660. #ifdef WIN32
  2661.         RETVAL = env->GetStaticObjectField(clazz,fieldID);
  2662. #else
  2663.         RETVAL = (*env)->GetStaticObjectField(env, clazz,fieldID);
  2664. #endif
  2665.         RESTOREENV;
  2666.     }
  2667.     OUTPUT:
  2668.     RETVAL
  2669.  
  2670. jboolean
  2671. GetStaticBooleanField(clazz,fieldID)
  2672.     JNIEnv *        env = FETCHENV;
  2673.     jclass            clazz
  2674.     jfieldID        fieldID
  2675.     char *            sig = 0;
  2676.     CODE:
  2677.     {
  2678. #ifdef WIN32
  2679.         RETVAL = env->GetStaticBooleanField(clazz,fieldID);
  2680. #else
  2681.         RETVAL = (*env)->GetStaticBooleanField(env, clazz,fieldID);
  2682. #endif
  2683.         RESTOREENV;
  2684.     }
  2685.     OUTPUT:
  2686.     RETVAL
  2687.  
  2688. jbyte
  2689. GetStaticByteField(clazz,fieldID)
  2690.     JNIEnv *        env = FETCHENV;
  2691.     jclass            clazz
  2692.     jfieldID        fieldID
  2693.     char *            sig = 0;
  2694.     CODE:
  2695.     {
  2696. #ifdef WIN32
  2697.         RETVAL = env->GetStaticByteField(clazz,fieldID);
  2698. #else
  2699.         RETVAL = (*env)->GetStaticByteField(env, clazz,fieldID);
  2700. #endif
  2701.         RESTOREENV;
  2702.     }
  2703.     OUTPUT:
  2704.     RETVAL
  2705.  
  2706. jchar
  2707. GetStaticCharField(clazz,fieldID)
  2708.     JNIEnv *        env = FETCHENV;
  2709.     jclass            clazz
  2710.     jfieldID        fieldID
  2711.     char *            sig = 0;
  2712.     CODE:
  2713.     {
  2714. #ifdef WIN32
  2715.         RETVAL = env->GetStaticCharField(clazz,fieldID);
  2716. #else
  2717.         RETVAL = (*env)->GetStaticCharField(env, clazz,fieldID);
  2718. #endif
  2719.         RESTOREENV;
  2720.     }
  2721.     OUTPUT:
  2722.     RETVAL
  2723.  
  2724. jshort
  2725. GetStaticShortField(clazz,fieldID)
  2726.     JNIEnv *        env = FETCHENV;
  2727.     jclass            clazz
  2728.     jfieldID        fieldID
  2729.     char *            sig = 0;
  2730.     CODE:
  2731.     {
  2732. #ifdef WIN32
  2733.         RETVAL = env->GetStaticShortField(clazz,fieldID);
  2734. #else
  2735.         RETVAL = (*env)->GetStaticShortField(env, clazz,fieldID);
  2736. #endif
  2737.         RESTOREENV;
  2738.     }
  2739.     OUTPUT:
  2740.     RETVAL
  2741.  
  2742. jint
  2743. GetStaticIntField(clazz,fieldID)
  2744.     JNIEnv *        env = FETCHENV;
  2745.     jclass            clazz
  2746.     jfieldID        fieldID
  2747.     char *            sig = 0;
  2748.     CODE:
  2749.     {
  2750. #ifdef WIN32
  2751.         RETVAL = env->GetStaticIntField(clazz,fieldID);
  2752. #else
  2753.         RETVAL = (*env)->GetStaticIntField(env, clazz,fieldID);
  2754. #endif
  2755.         RESTOREENV;
  2756.     }
  2757.     OUTPUT:
  2758.     RETVAL
  2759.  
  2760. jlong
  2761. GetStaticLongField(clazz,fieldID)
  2762.     JNIEnv *        env = FETCHENV;
  2763.     jclass            clazz
  2764.     jfieldID        fieldID
  2765.     char *            sig = 0;
  2766.     CODE:
  2767.     {
  2768. #ifdef WIN32
  2769.         RETVAL = env->GetStaticLongField(clazz,fieldID);
  2770. #else
  2771.         RETVAL = (*env)->GetStaticLongField(env, clazz,fieldID);
  2772. #endif
  2773.         RESTOREENV;
  2774.     }
  2775.     OUTPUT:
  2776.     RETVAL
  2777.  
  2778. jfloat
  2779. GetStaticFloatField(clazz,fieldID)
  2780.     JNIEnv *        env = FETCHENV;
  2781.     jclass            clazz
  2782.     jfieldID        fieldID
  2783.     char *            sig = 0;
  2784.     CODE:
  2785.     {
  2786. #ifdef WIN32
  2787.         RETVAL = env->GetStaticFloatField(clazz,fieldID);
  2788. #else
  2789.         RETVAL = (*env)->GetStaticFloatField(env, clazz,fieldID);
  2790. #endif
  2791.         RESTOREENV;
  2792.     }
  2793.     OUTPUT:
  2794.     RETVAL
  2795.  
  2796. jdouble
  2797. GetStaticDoubleField(clazz,fieldID)
  2798.     JNIEnv *        env = FETCHENV;
  2799.     jclass            clazz
  2800.     jfieldID        fieldID
  2801.     char *            sig = 0;
  2802.     CODE:
  2803.     {
  2804. #ifdef WIN32
  2805.         RETVAL = env->GetStaticDoubleField(clazz,fieldID);
  2806. #else
  2807.         RETVAL = (*env)->GetStaticDoubleField(env, clazz,fieldID);
  2808. #endif
  2809.         RESTOREENV;
  2810.     }
  2811.     OUTPUT:
  2812.     RETVAL
  2813.  
  2814. void
  2815. SetStaticObjectField(clazz,fieldID,value)
  2816.     JNIEnv *        env = FETCHENV;
  2817.     jclass            clazz
  2818.     jfieldID        fieldID
  2819.     char *            sig = 0;
  2820.     jobject            value
  2821.     CODE:
  2822.     {
  2823. #ifdef WIN32
  2824.       env->SetStaticObjectField(clazz,fieldID,value);
  2825. #else
  2826.       (*env)->SetStaticObjectField(env, clazz,fieldID,value);
  2827. #endif
  2828.         RESTOREENV;
  2829.     }
  2830.  
  2831. void
  2832. SetStaticBooleanField(clazz,fieldID,value)
  2833.     JNIEnv *        env = FETCHENV;
  2834.     jclass            clazz
  2835.     jfieldID        fieldID
  2836.     char *            sig = 0;
  2837.     jboolean        value
  2838.     CODE:
  2839.     {
  2840. #ifdef WIN32
  2841.       env->SetStaticBooleanField(clazz,fieldID,value);
  2842. #else
  2843.       (*env)->SetStaticBooleanField(env, clazz,fieldID,value);
  2844. #endif
  2845.         RESTOREENV;
  2846.     }
  2847.  
  2848. void
  2849. SetStaticByteField(clazz,fieldID,value)
  2850.     JNIEnv *        env = FETCHENV;
  2851.     jclass            clazz
  2852.     jfieldID        fieldID
  2853.     char *            sig = 0;
  2854.     jbyte            value
  2855.     CODE:
  2856.     {
  2857. #ifdef WIN32
  2858.       env->SetStaticByteField(clazz,fieldID,value);
  2859. #else
  2860.       (*env)->SetStaticByteField(env, clazz,fieldID,value);
  2861. #endif
  2862.         RESTOREENV;
  2863.     }
  2864.  
  2865. void
  2866. SetStaticCharField(clazz,fieldID,value)
  2867.     JNIEnv *        env = FETCHENV;
  2868.     jclass            clazz
  2869.     jfieldID        fieldID
  2870.     char *            sig = 0;
  2871.     jchar            value
  2872.     CODE:
  2873.     {
  2874. #ifdef WIN32
  2875.       env->SetStaticCharField(clazz,fieldID,value);
  2876. #else
  2877.       (*env)->SetStaticCharField(env, clazz,fieldID,value);
  2878. #endif
  2879.         RESTOREENV;
  2880.     }
  2881.  
  2882. void
  2883. SetStaticShortField(clazz,fieldID,value)
  2884.     JNIEnv *        env = FETCHENV;
  2885.     jclass            clazz
  2886.     jfieldID        fieldID
  2887.     char *            sig = 0;
  2888.     jshort            value
  2889.     CODE:
  2890.     {
  2891. #ifdef WIN32
  2892.       env->SetStaticShortField(clazz,fieldID,value);
  2893. #else
  2894.       (*env)->SetStaticShortField(env, clazz,fieldID,value);
  2895. #endif
  2896.         RESTOREENV;
  2897.     }
  2898.  
  2899. void
  2900. SetStaticIntField(clazz,fieldID,value)
  2901.     JNIEnv *        env = FETCHENV;
  2902.     jclass            clazz
  2903.     jfieldID        fieldID
  2904.     char *            sig = 0;
  2905.     jint            value
  2906.     CODE:
  2907.     {
  2908. #ifdef WIN32
  2909.       env->SetStaticIntField(clazz,fieldID,value);
  2910. #else
  2911.       (*env)->SetStaticIntField(env, clazz,fieldID,value);
  2912. #endif
  2913.         RESTOREENV;
  2914.     }
  2915.  
  2916. void
  2917. SetStaticLongField(clazz,fieldID,value)
  2918.     JNIEnv *        env = FETCHENV;
  2919.     jclass            clazz
  2920.     jfieldID        fieldID
  2921.     char *            sig = 0;
  2922.     jlong            value
  2923.     CODE:
  2924.     {
  2925. #ifdef WIN32
  2926.       env->SetStaticLongField(clazz,fieldID,value);
  2927. #else
  2928.       (*env)->SetStaticLongField(env, clazz,fieldID,value);
  2929. #endif
  2930.         RESTOREENV;
  2931.     }
  2932.  
  2933. void
  2934. SetStaticFloatField(clazz,fieldID,value)
  2935.     JNIEnv *        env = FETCHENV;
  2936.     jclass            clazz
  2937.     jfieldID        fieldID
  2938.     char *            sig = 0;
  2939.     jfloat            value
  2940.     CODE:
  2941.     {
  2942. #ifdef WIN32
  2943.       env->SetStaticFloatField(clazz,fieldID,value);
  2944. #else
  2945.       (*env)->SetStaticFloatField(env, clazz,fieldID,value);
  2946. #endif
  2947.         RESTOREENV;
  2948.     }
  2949.  
  2950. void
  2951. SetStaticDoubleField(clazz,fieldID,value)
  2952.     JNIEnv *        env = FETCHENV;
  2953.     jclass            clazz
  2954.     jfieldID        fieldID
  2955.     char *            sig = 0;
  2956.     jdouble            value
  2957.     CODE:
  2958.     {
  2959. #ifdef WIN32
  2960.       env->SetStaticDoubleField(clazz,fieldID,value);
  2961. #else
  2962.       (*env)->SetStaticDoubleField(env, clazz,fieldID,value);
  2963. #endif
  2964.         RESTOREENV;
  2965.     }
  2966.  
  2967. jstring
  2968. NewString(unicode)
  2969.     JNIEnv *        env = FETCHENV;
  2970.     STRLEN            tmplen = NO_INIT;
  2971.     jsize            unicode_len_ = NO_INIT;
  2972.     const jchar *        unicode
  2973.     CODE:
  2974.     {
  2975. #ifdef WIN32
  2976.         RETVAL = env->NewString(unicode, unicode_len_);
  2977. #else
  2978.         RETVAL = (*env)->NewString(env, unicode, unicode_len_);
  2979. #endif
  2980.         RESTOREENV;
  2981.     }
  2982.     OUTPUT:
  2983.     RETVAL
  2984.  
  2985. jsize
  2986. GetStringLength(str)
  2987.     JNIEnv *        env = FETCHENV;
  2988.     jstring            str
  2989.     CODE:
  2990.     {
  2991. #ifdef WIN32
  2992.         RETVAL = env->GetStringLength(str);
  2993. #else
  2994.         RETVAL = (*env)->GetStringLength(env, str);
  2995. #endif
  2996.         RESTOREENV;
  2997.     }
  2998.     OUTPUT:
  2999.     RETVAL
  3000.  
  3001. const jchar *
  3002. GetStringChars(str)
  3003.     JNIEnv *        env = FETCHENV;
  3004.     jstring            str
  3005.     jboolean        isCopy = NO_INIT;
  3006.     jsize             RETVAL_len_ = NO_INIT;
  3007.     CODE:
  3008.     {
  3009. #ifdef WIN32
  3010.         RETVAL = env->GetStringChars(str,&isCopy);
  3011. #else
  3012.         RETVAL = (*env)->GetStringChars(env, str,&isCopy);
  3013. #endif
  3014. #ifdef WIN32
  3015.         RETVAL_len_ = env->GetStringLength(str);
  3016. #else
  3017.         RETVAL_len_ = (*env)->GetStringLength(env, str);
  3018. #endif
  3019.         RESTOREENV;
  3020.     }
  3021.     OUTPUT:
  3022.     RETVAL
  3023.     CLEANUP:
  3024. #ifdef WIN32
  3025.         env->ReleaseStringChars(str,RETVAL);
  3026. #else
  3027.         (*env)->ReleaseStringChars(env, str,RETVAL);
  3028. #endif
  3029.  
  3030. jstring
  3031. NewStringUTF(utf)
  3032.     JNIEnv *        env = FETCHENV;
  3033.     const char *        utf
  3034.     CODE:
  3035.     {
  3036. #ifdef WIN32
  3037.         RETVAL = env->NewStringUTF(utf);
  3038. #else
  3039.         RETVAL = (*env)->NewStringUTF(env, utf);
  3040. #endif
  3041.         RESTOREENV;
  3042.     }
  3043.     OUTPUT:
  3044.     RETVAL
  3045.  
  3046. jsize
  3047. GetStringUTFLength(str)
  3048.     JNIEnv *        env = FETCHENV;
  3049.     jstring            str
  3050.     CODE:
  3051.     {
  3052. #ifdef WIN32
  3053.         RETVAL = env->GetStringUTFLength(str);
  3054. #else
  3055.         RETVAL = (*env)->GetStringUTFLength(env, str);
  3056. #endif
  3057.         RESTOREENV;
  3058.     }
  3059.     OUTPUT:
  3060.     RETVAL
  3061.  
  3062. const char *
  3063. GetStringUTFChars(str)
  3064.     JNIEnv *        env = FETCHENV;
  3065.     jstring            str
  3066.     jboolean        isCopy = NO_INIT;
  3067.     CODE:
  3068.     {
  3069. #ifdef WIN32
  3070.         RETVAL = env->GetStringUTFChars(str,&isCopy);
  3071. #else
  3072.         RETVAL = (*env)->GetStringUTFChars(env, str,&isCopy);
  3073. #endif
  3074.         RESTOREENV;
  3075.     }
  3076.     OUTPUT:
  3077.     RETVAL
  3078.     CLEANUP:
  3079. #ifdef WIN32
  3080.     env->ReleaseStringUTFChars(str, RETVAL);
  3081. #else
  3082.     (*env)->ReleaseStringUTFChars(env, str, RETVAL);
  3083. #endif
  3084.  
  3085.  
  3086. jsize
  3087. GetArrayLength(array)
  3088.     JNIEnv *        env = FETCHENV;
  3089.     jarray            array
  3090.     CODE:
  3091.     {
  3092. #ifdef WIN32
  3093.         RETVAL = env->GetArrayLength(array);
  3094. #else
  3095.         RETVAL = (*env)->GetArrayLength(env, array);
  3096. #endif
  3097.         RESTOREENV;
  3098.     }
  3099.     OUTPUT:
  3100.     RETVAL
  3101.  
  3102. jobjectArray
  3103. NewObjectArray(len,clazz,init)
  3104.     JNIEnv *        env = FETCHENV;
  3105.     jsize            len
  3106.     jclass            clazz
  3107.     jobject            init
  3108.     CODE:
  3109.     {
  3110. #ifdef WIN32
  3111.         RETVAL = env->NewObjectArray(len,clazz,init);
  3112. #else
  3113.         RETVAL = (*env)->NewObjectArray(env, len,clazz,init);
  3114. #endif
  3115.         RESTOREENV;
  3116.     }
  3117.     OUTPUT:
  3118.     RETVAL
  3119.  
  3120. jobject
  3121. GetObjectArrayElement(array,index)
  3122.     JNIEnv *        env = FETCHENV;
  3123.     jobjectArray        array
  3124.     jsize            index
  3125.     CODE:
  3126.     {
  3127. #ifdef WIN32
  3128.         RETVAL = env->GetObjectArrayElement(array,index);
  3129. #else
  3130.         RETVAL = (*env)->GetObjectArrayElement(env, array,index);
  3131. #endif
  3132.         RESTOREENV;
  3133.     }
  3134.     OUTPUT:
  3135.     RETVAL
  3136.  
  3137. void
  3138. SetObjectArrayElement(array,index,val)
  3139.     JNIEnv *        env = FETCHENV;
  3140.     jobjectArray        array
  3141.     jsize            index
  3142.     jobject            val
  3143.     CODE:
  3144.     {
  3145. #ifdef WIN32
  3146.         env->SetObjectArrayElement(array,index,val);
  3147. #else
  3148.         (*env)->SetObjectArrayElement(env, array,index,val);
  3149. #endif
  3150.         RESTOREENV;
  3151.     }
  3152.  
  3153. jbooleanArray
  3154. NewBooleanArray(len)
  3155.     JNIEnv *        env = FETCHENV;
  3156.     jsize            len
  3157.     CODE:
  3158.     {
  3159. #ifdef WIN32
  3160.         RETVAL = env->NewBooleanArray(len);
  3161. #else
  3162.         RETVAL = (*env)->NewBooleanArray(env, len);
  3163. #endif
  3164.         RESTOREENV;
  3165.     }
  3166.     OUTPUT:
  3167.     RETVAL
  3168.  
  3169. jbyteArray
  3170. NewByteArray(len)
  3171.     JNIEnv *        env = FETCHENV;
  3172.     jsize            len
  3173.     CODE:
  3174.     {
  3175. #ifdef WIN32
  3176.         RETVAL = env->NewByteArray(len);
  3177. #else
  3178.         RETVAL = (*env)->NewByteArray(env, len);
  3179. #endif
  3180.         RESTOREENV;
  3181.     }
  3182.     OUTPUT:
  3183.     RETVAL
  3184.  
  3185. jcharArray
  3186. NewCharArray(len)
  3187.     JNIEnv *        env = FETCHENV;
  3188.     jsize            len
  3189.     CODE:
  3190.     {
  3191. #ifdef WIN32
  3192.         RETVAL = env->NewCharArray(len);
  3193. #else
  3194.         RETVAL = (*env)->NewCharArray(env, len);
  3195. #endif
  3196.         RESTOREENV;
  3197.     }
  3198.     OUTPUT:
  3199.     RETVAL
  3200.  
  3201. jshortArray
  3202. NewShortArray(len)
  3203.     JNIEnv *        env = FETCHENV;
  3204.     jsize            len
  3205.     CODE:
  3206.     {
  3207. #ifdef WIN32
  3208.         RETVAL = env->NewShortArray(len);
  3209. #else
  3210.         RETVAL = (*env)->NewShortArray(env, len);
  3211. #endif
  3212.         RESTOREENV;
  3213.     }
  3214.     OUTPUT:
  3215.     RETVAL
  3216.  
  3217. jintArray
  3218. NewIntArray(len)
  3219.     JNIEnv *        env = FETCHENV;
  3220.     jsize            len
  3221.     CODE:
  3222.     {
  3223. #ifdef WIN32
  3224.         RETVAL = env->NewIntArray(len);
  3225. #else
  3226.         RETVAL = (*env)->NewIntArray(env, len);
  3227. #endif
  3228.         RESTOREENV;
  3229.     }
  3230.     OUTPUT:
  3231.     RETVAL
  3232.  
  3233. jlongArray
  3234. NewLongArray(len)
  3235.     JNIEnv *        env = FETCHENV;
  3236.     jsize            len
  3237.     CODE:
  3238.     {
  3239. #ifdef WIN32
  3240.         RETVAL = env->NewLongArray(len);
  3241. #else
  3242.         RETVAL = (*env)->NewLongArray(env, len);
  3243. #endif
  3244.         RESTOREENV;
  3245.     }
  3246.     OUTPUT:
  3247.     RETVAL
  3248.  
  3249. jfloatArray
  3250. NewFloatArray(len)
  3251.     JNIEnv *        env = FETCHENV;
  3252.     jsize            len
  3253.     CODE:
  3254.     {
  3255. #ifdef WIN32
  3256.         RETVAL = env->NewFloatArray(len);
  3257. #else
  3258.         RETVAL = (*env)->NewFloatArray(env, len);
  3259. #endif
  3260.         RESTOREENV;
  3261.     }
  3262.     OUTPUT:
  3263.     RETVAL
  3264.  
  3265. jdoubleArray
  3266. NewDoubleArray(len)
  3267.     JNIEnv *        env = FETCHENV;
  3268.     jsize            len
  3269.     CODE:
  3270.     {
  3271. #ifdef WIN32
  3272.         RETVAL = env->NewDoubleArray(len);
  3273. #else
  3274.         RETVAL = (*env)->NewDoubleArray(env, len);
  3275. #endif
  3276.         RESTOREENV;
  3277.     }
  3278.     OUTPUT:
  3279.     RETVAL
  3280.  
  3281. jboolean *
  3282. GetBooleanArrayElements(array)
  3283.     JNIEnv *        env = FETCHENV;
  3284.     jsize            RETVAL_len_ = NO_INIT;
  3285.     jbooleanArray        array
  3286.     jboolean        isCopy = NO_INIT;
  3287.     PPCODE:
  3288.     {
  3289. #ifdef WIN32
  3290.         RETVAL = env->GetBooleanArrayElements(array,&isCopy);
  3291. #else
  3292.         RETVAL = (*env)->GetBooleanArrayElements(env, array,&isCopy);
  3293. #endif
  3294. #ifdef WIN32
  3295.         RETVAL_len_ = env->GetArrayLength(array);
  3296. #else
  3297.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3298. #endif
  3299.         if (GIMME == G_ARRAY) {
  3300.         int i;
  3301.         jboolean* r = RETVAL;
  3302.         EXTEND(sp, RETVAL_len_);
  3303.         for (i = RETVAL_len_; i; --i) {
  3304.             PUSHs(sv_2mortal(newSViv(*r++)));
  3305.         }
  3306.         }
  3307.         else {
  3308.         if (RETVAL_len_) {
  3309.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3310.             (STRLEN)RETVAL_len_ * sizeof(jboolean))));
  3311.         }
  3312.         else
  3313.             PUSHs(&PL_sv_no);
  3314.         }
  3315. #ifdef WIN32
  3316.         env->ReleaseBooleanArrayElements(array,RETVAL,JNI_ABORT);
  3317. #else
  3318.         (*env)->ReleaseBooleanArrayElements(env, array,RETVAL,JNI_ABORT);
  3319. #endif
  3320.         RESTOREENV;
  3321.     }
  3322.  
  3323. jbyte *
  3324. GetByteArrayElements(array)
  3325.     JNIEnv *        env = FETCHENV;
  3326.     jsize            RETVAL_len_ = NO_INIT;
  3327.     jbyteArray        array
  3328.     jboolean        isCopy = NO_INIT;
  3329.     PPCODE:
  3330.     {
  3331. #ifdef WIN32
  3332.         RETVAL = env->GetByteArrayElements(array,&isCopy);
  3333. #else
  3334.         RETVAL = (*env)->GetByteArrayElements(env, array,&isCopy);
  3335. #endif
  3336. #ifdef WIN32
  3337.         RETVAL_len_ = env->GetArrayLength(array);
  3338. #else
  3339.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3340. #endif
  3341.         if (GIMME == G_ARRAY) {
  3342.         int i;
  3343.         jbyte* r = RETVAL;
  3344.         EXTEND(sp, RETVAL_len_);
  3345.         for (i = RETVAL_len_; i; --i) {
  3346.             PUSHs(sv_2mortal(newSViv(*r++)));
  3347.         }
  3348.         }
  3349.         else {
  3350.         if (RETVAL_len_) {
  3351.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3352.             (STRLEN)RETVAL_len_ * sizeof(jbyte))));
  3353.         }
  3354.         else
  3355.             PUSHs(&PL_sv_no);
  3356.         }
  3357. #ifdef WIN32
  3358.         env->ReleaseByteArrayElements(array,RETVAL,JNI_ABORT);
  3359. #else
  3360.         (*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT);
  3361. #endif
  3362.         RESTOREENV;
  3363.     }
  3364.  
  3365. jchar *
  3366. GetCharArrayElements(array)
  3367.     JNIEnv *        env = FETCHENV;
  3368.     jsize            RETVAL_len_ = NO_INIT;
  3369.     jcharArray        array
  3370.     jboolean        isCopy = NO_INIT;
  3371.     PPCODE:
  3372.     {
  3373. #ifdef WIN32
  3374.         RETVAL = env->GetCharArrayElements(array,&isCopy);
  3375. #else
  3376.         RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy);
  3377. #endif
  3378. #ifdef WIN32
  3379.         RETVAL_len_ = env->GetArrayLength(array);
  3380. #else
  3381.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3382. #endif
  3383.         if (GIMME == G_ARRAY) {
  3384.         int i;
  3385.         jchar* r = RETVAL;
  3386.         EXTEND(sp, RETVAL_len_);
  3387.         for (i = RETVAL_len_; i; --i) {
  3388.             PUSHs(sv_2mortal(newSViv(*r++)));
  3389.         }
  3390.         }
  3391.         else {
  3392.         if (RETVAL_len_) {
  3393.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3394.             (STRLEN)RETVAL_len_ * sizeof(jchar))));
  3395.         }
  3396.         else
  3397.             PUSHs(&PL_sv_no);
  3398.         }
  3399. #ifdef WIN32
  3400.         env->ReleaseCharArrayElements(array,RETVAL,JNI_ABORT);
  3401. #else
  3402.         (*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT);
  3403. #endif
  3404.         RESTOREENV;
  3405.     }
  3406.  
  3407. jshort *
  3408. GetShortArrayElements(array)
  3409.     JNIEnv *        env = FETCHENV;
  3410.     jsize            RETVAL_len_ = NO_INIT;
  3411.     jshortArray        array
  3412.     jboolean        isCopy = NO_INIT;
  3413.     PPCODE:
  3414.     {
  3415. #ifdef WIN32
  3416.         RETVAL = env->GetShortArrayElements(array,&isCopy);
  3417. #else
  3418.         RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy);
  3419. #endif
  3420. #ifdef WIN32
  3421.         RETVAL_len_ = env->GetArrayLength(array);
  3422. #else
  3423.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3424. #endif
  3425.         if (GIMME == G_ARRAY) {
  3426.         int i;
  3427.         jshort* r = RETVAL;
  3428.         EXTEND(sp, RETVAL_len_);
  3429.         for (i = RETVAL_len_; i; --i) {
  3430.             PUSHs(sv_2mortal(newSViv(*r++)));
  3431.         }
  3432.         }
  3433.         else {
  3434.         if (RETVAL_len_) {
  3435.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3436.             (STRLEN)RETVAL_len_ * sizeof(jshort))));
  3437.         }
  3438.         else
  3439.             PUSHs(&PL_sv_no);
  3440.         }
  3441. #ifdef WIN32
  3442.         env->ReleaseShortArrayElements(array,RETVAL,JNI_ABORT);
  3443. #else
  3444.         (*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT);
  3445. #endif
  3446.         RESTOREENV;
  3447.     }
  3448.  
  3449. jint *
  3450. GetIntArrayElements(array)
  3451.     JNIEnv *        env = FETCHENV;
  3452.     jsize            RETVAL_len_ = NO_INIT;
  3453.     jintArray        array
  3454.     jboolean        isCopy = NO_INIT;
  3455.     PPCODE:
  3456.     {
  3457. #ifdef WIN32
  3458.         RETVAL = env->GetIntArrayElements(array,&isCopy);
  3459. #else
  3460.         RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy);
  3461. #endif
  3462. #ifdef WIN32
  3463.         RETVAL_len_ = env->GetArrayLength(array);
  3464. #else
  3465.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3466. #endif
  3467.         if (GIMME == G_ARRAY) {
  3468.         int i;
  3469.         jint* r = RETVAL;
  3470.         EXTEND(sp, RETVAL_len_);
  3471.         for (i = RETVAL_len_; i; --i) {
  3472.             PUSHs(sv_2mortal(newSViv(*r++)));
  3473.         }
  3474.         }
  3475.         else {
  3476.         if (RETVAL_len_) {
  3477.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3478.             (STRLEN)RETVAL_len_ * sizeof(jint))));
  3479.         }
  3480.         else
  3481.             PUSHs(&PL_sv_no);
  3482.         }
  3483. #ifdef WIN32
  3484.         env->ReleaseIntArrayElements(array,RETVAL,JNI_ABORT);
  3485. #else
  3486.         (*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT);
  3487. #endif
  3488.         RESTOREENV;
  3489.     }
  3490.  
  3491. jlong *
  3492. GetLongArrayElements(array)
  3493.     JNIEnv *        env = FETCHENV;
  3494.     jsize            RETVAL_len_ = NO_INIT;
  3495.     jlongArray        array
  3496.     jboolean        isCopy = NO_INIT;
  3497.     PPCODE:
  3498.     {
  3499. #ifdef WIN32
  3500.         RETVAL = env->GetLongArrayElements(array,&isCopy);
  3501. #else
  3502.         RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy);
  3503. #endif
  3504. #ifdef WIN32
  3505.         RETVAL_len_ = env->GetArrayLength(array);
  3506. #else
  3507.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3508. #endif
  3509.         if (GIMME == G_ARRAY) {
  3510.         int i;
  3511.         jlong* r = RETVAL;
  3512.         EXTEND(sp, RETVAL_len_);
  3513.         for (i = RETVAL_len_; i; --i) {
  3514.             PUSHs(sv_2mortal(newSViv(*r++)));
  3515.         }
  3516.         }
  3517.         else {
  3518.         if (RETVAL_len_) {
  3519.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3520.             (STRLEN)RETVAL_len_ * sizeof(jlong))));
  3521.         }
  3522.         else
  3523.             PUSHs(&PL_sv_no);
  3524.         }
  3525. #ifdef WIN32
  3526.         env->ReleaseLongArrayElements(array,RETVAL,JNI_ABORT);
  3527. #else
  3528.         (*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT);
  3529. #endif
  3530.         RESTOREENV;
  3531.     }
  3532.  
  3533. jfloat *
  3534. GetFloatArrayElements(array)
  3535.     JNIEnv *        env = FETCHENV;
  3536.     jsize            RETVAL_len_ = NO_INIT;
  3537.     jfloatArray        array
  3538.     jboolean        isCopy = NO_INIT;
  3539.     PPCODE:
  3540.     {
  3541. #ifdef WIN32
  3542.         RETVAL = env->GetFloatArrayElements(array,&isCopy);
  3543. #else
  3544.         RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy);
  3545. #endif
  3546. #ifdef WIN32
  3547.         RETVAL_len_ = env->GetArrayLength(array);
  3548. #else
  3549.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3550. #endif
  3551.         if (GIMME == G_ARRAY) {
  3552.         int i;
  3553.         jfloat* r = RETVAL;
  3554.         EXTEND(sp, RETVAL_len_);
  3555.         for (i = RETVAL_len_; i; --i) {
  3556.             PUSHs(sv_2mortal(newSVnv(*r++)));
  3557.         }
  3558.         }
  3559.         else {
  3560.         if (RETVAL_len_) {
  3561.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3562.             (STRLEN)RETVAL_len_ * sizeof(jfloat))));
  3563.         }
  3564.         else
  3565.             PUSHs(&PL_sv_no);
  3566.         }
  3567. #ifdef WIN32
  3568.         env->ReleaseFloatArrayElements(array,RETVAL,JNI_ABORT);
  3569. #else
  3570.         (*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT);
  3571. #endif
  3572.         RESTOREENV;
  3573.     }
  3574.  
  3575. jdouble *
  3576. GetDoubleArrayElements(array)
  3577.     JNIEnv *        env = FETCHENV;
  3578.     jsize            RETVAL_len_ = NO_INIT;
  3579.     jdoubleArray        array
  3580.     jboolean        isCopy = NO_INIT;
  3581.     PPCODE:
  3582.     {
  3583. #ifdef WIN32
  3584.         RETVAL = env->GetDoubleArrayElements(array,&isCopy);
  3585. #else
  3586.         RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy);
  3587. #endif
  3588. #ifdef WIN32
  3589.         RETVAL_len_ = env->GetArrayLength(array);
  3590. #else
  3591.         RETVAL_len_ = (*env)->GetArrayLength(env, array);
  3592. #endif
  3593.         if (GIMME == G_ARRAY) {
  3594.         int i;
  3595.         jdouble* r = RETVAL;
  3596.         EXTEND(sp, RETVAL_len_);
  3597.         for (i = RETVAL_len_; i; --i) {
  3598.             PUSHs(sv_2mortal(newSVnv(*r++)));
  3599.         }
  3600.         }
  3601.         else {
  3602.         if (RETVAL_len_) {
  3603.             PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
  3604.             (STRLEN)RETVAL_len_ * sizeof(jdouble))));
  3605.         }
  3606.         else
  3607.             PUSHs(&PL_sv_no);
  3608.         }
  3609. #ifdef WIN32
  3610.         env->ReleaseDoubleArrayElements(array,RETVAL,JNI_ABORT);
  3611. #else
  3612.         (*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT);
  3613. #endif
  3614.         RESTOREENV;
  3615.     }
  3616.  
  3617. void
  3618. GetBooleanArrayRegion(array,start,len,buf)
  3619.     JNIEnv *        env = FETCHENV;
  3620.     jbooleanArray        array
  3621.     jsize            start
  3622.     jsize            len
  3623.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3624.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3625.     jboolean *        buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1);
  3626.     CODE:
  3627.     {
  3628. #ifdef WIN32
  3629.         env->GetBooleanArrayRegion(array,start,len,buf);
  3630. #else
  3631.         (*env)->GetBooleanArrayRegion(env, array,start,len,buf);
  3632. #endif
  3633.         SvCUR_set(ST(3), len * sizeof(jboolean));
  3634.         *SvEND(ST(3)) = '\0';
  3635.         RESTOREENV;
  3636.     }
  3637.  
  3638. void
  3639. GetByteArrayRegion(array,start,len,buf)
  3640.     JNIEnv *        env = FETCHENV;
  3641.     jbyteArray        array
  3642.     jsize            start
  3643.     jsize            len
  3644.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3645.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3646.     jbyte *            buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1);
  3647.     CODE:
  3648.     {
  3649. #ifdef WIN32
  3650.         env->GetByteArrayRegion(array,start,len,buf);
  3651. #else
  3652.         (*env)->GetByteArrayRegion(env, array,start,len,buf);
  3653. #endif
  3654.         SvCUR_set(ST(3), len * sizeof(jbyte));
  3655.         *SvEND(ST(3)) = '\0';
  3656.         RESTOREENV;
  3657.     }
  3658.  
  3659. void
  3660. GetCharArrayRegion(array,start,len,buf)
  3661.     JNIEnv *        env = FETCHENV;
  3662.     jcharArray        array
  3663.     jsize            start
  3664.     jsize            len
  3665.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3666.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3667.     jchar *            buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1);
  3668.     CODE:
  3669.     {
  3670. #ifdef WIN32
  3671.         env->GetCharArrayRegion(array,start,len,buf);
  3672. #else
  3673.         (*env)->GetCharArrayRegion(env, array,start,len,buf);
  3674. #endif
  3675.         SvCUR_set(ST(3), len * sizeof(jchar));
  3676.         *SvEND(ST(3)) = '\0';
  3677.         RESTOREENV;
  3678.     }
  3679.  
  3680. void
  3681. GetShortArrayRegion(array,start,len,buf)
  3682.     JNIEnv *        env = FETCHENV;
  3683.     jshortArray        array
  3684.     jsize            start
  3685.     jsize            len
  3686.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3687.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3688.     jshort *        buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1);
  3689.     CODE:
  3690.     {
  3691. #ifdef WIN32
  3692.         env->GetShortArrayRegion(array,start,len,buf);
  3693. #else
  3694.         (*env)->GetShortArrayRegion(env, array,start,len,buf);
  3695. #endif
  3696.         SvCUR_set(ST(3), len * sizeof(jshort));
  3697.         *SvEND(ST(3)) = '\0';
  3698.         RESTOREENV;
  3699.     }
  3700.  
  3701. void
  3702. GetIntArrayRegion(array,start,len,buf)
  3703.     JNIEnv *        env = FETCHENV;
  3704.     jintArray        array
  3705.     jsize            start
  3706.     jsize            len
  3707.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3708.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3709.     jint *            buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1);
  3710.     CODE:
  3711.     {
  3712. #ifdef WIN32
  3713.         env->GetIntArrayRegion(array,start,len,buf);
  3714. #else
  3715.         (*env)->GetIntArrayRegion(env, array,start,len,buf);
  3716. #endif
  3717.         SvCUR_set(ST(3), len * sizeof(jint));
  3718.         *SvEND(ST(3)) = '\0';
  3719.         RESTOREENV;
  3720.     }
  3721.  
  3722. void
  3723. GetLongArrayRegion(array,start,len,buf)
  3724.     JNIEnv *        env = FETCHENV;
  3725.     jlongArray        array
  3726.     jsize            start
  3727.     jsize            len
  3728.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3729.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3730.     jlong *            buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1);
  3731.     CODE:
  3732.     {
  3733. #ifdef WIN32
  3734.         env->GetLongArrayRegion(array,start,len,buf);
  3735. #else
  3736.         (*env)->GetLongArrayRegion(env, array,start,len,buf);
  3737. #endif
  3738.         SvCUR_set(ST(3), len * sizeof(jlong));
  3739.         *SvEND(ST(3)) = '\0';
  3740.         RESTOREENV;
  3741.     }
  3742.  
  3743. void
  3744. GetFloatArrayRegion(array,start,len,buf)
  3745.     JNIEnv *        env = FETCHENV;
  3746.     jfloatArray        array
  3747.     jsize            start
  3748.     jsize            len
  3749.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3750.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3751.     jfloat *        buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1);
  3752.     CODE:
  3753.     {
  3754. #ifdef WIN32
  3755.         env->GetFloatArrayRegion(array,start,len,buf);
  3756. #else
  3757.         (*env)->GetFloatArrayRegion(env, array,start,len,buf);
  3758. #endif
  3759.         SvCUR_set(ST(3), len * sizeof(jfloat));
  3760.         *SvEND(ST(3)) = '\0';
  3761.         RESTOREENV;
  3762.     }
  3763.  
  3764. void
  3765. GetDoubleArrayRegion(array,start,len,buf)
  3766.     JNIEnv *        env = FETCHENV;
  3767.     jdoubleArray        array
  3768.     jsize            start
  3769.     jsize            len
  3770.     STRLEN            tmplen = len * sizeof(jboolean) + 1;
  3771.     char *            tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
  3772.     jdouble *        buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1);
  3773.     CODE:
  3774.     {
  3775. #ifdef WIN32
  3776.         env->GetDoubleArrayRegion(array,start,len,buf);
  3777. #else
  3778.         (*env)->GetDoubleArrayRegion(env, array,start,len,buf);
  3779. #endif
  3780.         SvCUR_set(ST(3), len * sizeof(jdouble));
  3781.         *SvEND(ST(3)) = '\0';
  3782.         RESTOREENV;
  3783.     }
  3784.  
  3785. void
  3786. SetBooleanArrayRegion(array,start,len,buf)
  3787.     JNIEnv *        env = FETCHENV;
  3788.     STRLEN            tmplen = NO_INIT;
  3789.     jbooleanArray        array
  3790.     jsize            start
  3791.     jsize            len
  3792.     jsize            buf_len_ = NO_INIT;
  3793.     jboolean *        buf
  3794.     CODE:
  3795.     {
  3796.         if (buf_len_ < len)
  3797.         croak("string is too short");
  3798.         else if (buf_len_ > len && PL_dowarn)
  3799.         warn("string is too long");
  3800. #ifdef WIN32
  3801.         env->SetBooleanArrayRegion(array,start,len,buf);
  3802. #else
  3803.         (*env)->SetBooleanArrayRegion(env, array,start,len,buf);
  3804. #endif
  3805.         RESTOREENV;
  3806.     }
  3807.  
  3808. void
  3809. SetByteArrayRegion(array,start,len,buf)
  3810.     JNIEnv *        env = FETCHENV;
  3811.     STRLEN            tmplen = NO_INIT;
  3812.     jbyteArray        array
  3813.     jsize            start
  3814.     jsize            len
  3815.     jsize            buf_len_ = NO_INIT;
  3816.     jbyte *            buf
  3817.     CODE:
  3818.     {
  3819.         if (buf_len_ < len)
  3820.         croak("string is too short");
  3821.         else if (buf_len_ > len && PL_dowarn)
  3822.         warn("string is too long");
  3823. #ifdef WIN32
  3824.         env->SetByteArrayRegion(array,start,len,buf);
  3825. #else
  3826.         (*env)->SetByteArrayRegion(env, array,start,len,buf);
  3827. #endif
  3828.         RESTOREENV;
  3829.     }
  3830.  
  3831. void
  3832. SetCharArrayRegion(array,start,len,buf)
  3833.     JNIEnv *        env = FETCHENV;
  3834.     STRLEN            tmplen = NO_INIT;
  3835.     jcharArray        array
  3836.     jsize            start
  3837.     jsize            len
  3838.     jsize            buf_len_ = NO_INIT;
  3839.     jchar *            buf
  3840.     CODE:
  3841.     {
  3842.         if (buf_len_ < len)
  3843.         croak("string is too short");
  3844.         else if (buf_len_ > len && PL_dowarn)
  3845.         warn("string is too long");
  3846. #ifdef WIN32
  3847.         env->SetCharArrayRegion(array,start,len,buf);
  3848. #else
  3849.         (*env)->SetCharArrayRegion(env, array,start,len,buf);
  3850. #endif
  3851.         RESTOREENV;
  3852.     }
  3853.  
  3854. void
  3855. SetShortArrayRegion(array,start,len,buf)
  3856.     JNIEnv *        env = FETCHENV;
  3857.     STRLEN            tmplen = NO_INIT;
  3858.     jshortArray        array
  3859.     jsize            start
  3860.     jsize            len
  3861.     jsize            buf_len_ = NO_INIT;
  3862.     jshort *        buf
  3863.     CODE:
  3864.     {
  3865.         if (buf_len_ < len)
  3866.         croak("string is too short");
  3867.         else if (buf_len_ > len && PL_dowarn)
  3868.         warn("string is too long");
  3869. #ifdef WIN32
  3870.         env->SetShortArrayRegion(array,start,len,buf);
  3871. #else
  3872.         (*env)->SetShortArrayRegion(env, array,start,len,buf);
  3873. #endif
  3874.         RESTOREENV;
  3875.     }
  3876.  
  3877. void
  3878. SetIntArrayRegion(array,start,len,buf)
  3879.     JNIEnv *        env = FETCHENV;
  3880.     STRLEN            tmplen = NO_INIT;
  3881.     jintArray        array
  3882.     jsize            start
  3883.     jsize            len
  3884.     jsize            buf_len_ = NO_INIT;
  3885.     jint *            buf
  3886.     CODE:
  3887.     {
  3888.         if (buf_len_ < len)
  3889.         croak("string is too short");
  3890.         else if (buf_len_ > len && PL_dowarn)
  3891.         warn("string is too long");
  3892. #ifdef WIN32
  3893.         env->SetIntArrayRegion(array,start,len,buf);
  3894. #else
  3895.         (*env)->SetIntArrayRegion(env, array,start,len,buf);
  3896. #endif
  3897.         RESTOREENV;
  3898.     }
  3899.  
  3900. void
  3901. SetLongArrayRegion(array,start,len,buf)
  3902.     JNIEnv *        env = FETCHENV;
  3903.     STRLEN            tmplen = NO_INIT;
  3904.     jlongArray        array
  3905.     jsize            start
  3906.     jsize            len
  3907.     jsize            buf_len_ = NO_INIT;
  3908.     jlong *            buf
  3909.     CODE:
  3910.     {
  3911.         if (buf_len_ < len)
  3912.         croak("string is too short");
  3913.         else if (buf_len_ > len && PL_dowarn)
  3914.         warn("string is too long");
  3915. #ifdef WIN32
  3916.         env->SetLongArrayRegion(array,start,len,buf);
  3917. #else
  3918.         (*env)->SetLongArrayRegion(env, array,start,len,buf);
  3919. #endif
  3920.         RESTOREENV;
  3921.     }
  3922.  
  3923. void
  3924. SetFloatArrayRegion(array,start,len,buf)
  3925.     JNIEnv *        env = FETCHENV;
  3926.     STRLEN            tmplen = NO_INIT;
  3927.     jfloatArray        array
  3928.     jsize            start
  3929.     jsize            len
  3930.     jsize            buf_len_ = NO_INIT;
  3931.     jfloat *        buf
  3932.     CODE:
  3933.     {
  3934.         if (buf_len_ < len)
  3935.         croak("string is too short");
  3936.         else if (buf_len_ > len && PL_dowarn)
  3937.         warn("string is too long");
  3938. #ifdef WIN32
  3939.         env->SetFloatArrayRegion(array,start,len,buf);
  3940. #else
  3941.         (*env)->SetFloatArrayRegion(env, array,start,len,buf);
  3942. #endif
  3943.         RESTOREENV;
  3944.     }
  3945.  
  3946. void
  3947. SetDoubleArrayRegion(array,start,len,buf)
  3948.     JNIEnv *        env = FETCHENV;
  3949.     STRLEN            tmplen = NO_INIT;
  3950.     jdoubleArray        array
  3951.     jsize            start
  3952.     jsize            len
  3953.     jsize            buf_len_ = NO_INIT;
  3954.     jdouble *        buf
  3955.     CODE:
  3956.     {
  3957.         if (buf_len_ < len)
  3958.         croak("string is too short");
  3959.         else if (buf_len_ > len && PL_dowarn)
  3960.         warn("string is too long");
  3961. #ifdef WIN32
  3962.         env->SetDoubleArrayRegion(array,start,len,buf);
  3963. #else
  3964.         (*env)->SetDoubleArrayRegion(env, array,start,len,buf);
  3965. #endif
  3966.         RESTOREENV;
  3967.     }
  3968.  
  3969. SysRet
  3970. RegisterNatives(clazz,methods,nMethods)
  3971.     JNIEnv *        env = FETCHENV;
  3972.     jclass            clazz
  3973.     JNINativeMethod *    methods
  3974.     jint            nMethods
  3975.     CODE:
  3976.     {
  3977. #ifdef WIN32
  3978.         RETVAL = env->RegisterNatives(clazz,methods,nMethods);
  3979. #else
  3980.         RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods);
  3981. #endif
  3982.     }
  3983.  
  3984. SysRet
  3985. UnregisterNatives(clazz)
  3986.     JNIEnv *        env = FETCHENV;
  3987.     jclass            clazz
  3988.     CODE:
  3989.     {
  3990. #ifdef WIN32
  3991.         RETVAL = env->UnregisterNatives(clazz);
  3992. #else
  3993.         RETVAL = (*env)->UnregisterNatives(env, clazz);
  3994. #endif
  3995.     }
  3996.     OUTPUT:
  3997.     RETVAL  
  3998.    
  3999. SysRet
  4000. MonitorEnter(obj)
  4001.     JNIEnv *        env = FETCHENV;
  4002.     jobject            obj
  4003.     CODE:
  4004.     {
  4005. #ifdef WIN32
  4006.         RETVAL = env->MonitorEnter(obj);
  4007. #else
  4008.         RETVAL = (*env)->MonitorEnter(env, obj);
  4009. #endif
  4010.         RESTOREENV;
  4011.     }
  4012.     OUTPUT:
  4013.     RETVAL
  4014.  
  4015. SysRet
  4016. MonitorExit(obj)
  4017.     JNIEnv *        env = FETCHENV;
  4018.     jobject            obj
  4019.     CODE:
  4020.     {
  4021. #ifdef WIN32
  4022.         RETVAL = env->MonitorExit(obj);
  4023. #else
  4024.         RETVAL = (*env)->MonitorExit(env, obj);
  4025. #endif
  4026.         RESTOREENV;
  4027.     }
  4028.     OUTPUT:
  4029.     RETVAL
  4030.  
  4031. JavaVM *
  4032. GetJavaVM(...)
  4033.     JNIEnv *        env = FETCHENV;
  4034.     CODE:
  4035.     {
  4036.         if (env) {    /* We're embedded. */
  4037. #ifdef WIN32
  4038.         if (env->GetJavaVM(&RETVAL) < 0)
  4039. #else
  4040.         if ((*env)->GetJavaVM(env, &RETVAL) < 0)
  4041. #endif
  4042.             RETVAL = 0;
  4043.         }
  4044.         else {    /* We're embedding. */
  4045. #ifdef KAFFE
  4046.                 JavaVMInitArgs vm_args;
  4047. #else
  4048.                 JDK1_1InitArgs vm_args;
  4049. #endif
  4050.         char *lib;
  4051.         if (jpldebug) {
  4052.             fprintf(stderr, "We're embedding Java in Perl.\n");
  4053.         }
  4054.  
  4055.         if (items--) {
  4056.             ++mark;
  4057.             lib = SvPV(*mark, PL_na);
  4058.         }
  4059.         else
  4060.             lib = 0;
  4061.         if (jpldebug) {
  4062.             fprintf(stderr, "lib is %s.\n", lib);
  4063.         }
  4064. #ifdef WIN32
  4065.         if (!LoadLibrary("javai.dll")) {
  4066.             if (lib && !LoadLibrary(lib))
  4067.             croak("Can't load javai.dll");
  4068.         }
  4069. #else
  4070.         if (jpldebug) {
  4071.             fprintf(stderr, "Opening Java shared library.\n");
  4072.                 }
  4073. #ifdef KAFFE
  4074.         if (!dlopen("libkaffevm.so", RTLD_LAZY|RTLD_GLOBAL)) {
  4075. #else
  4076.         if (!dlopen("libjava.so", RTLD_LAZY|RTLD_GLOBAL)) {
  4077. #endif
  4078.             if (lib && !dlopen(lib, RTLD_LAZY|RTLD_GLOBAL))
  4079.             croak("Can't load Java shared library.");
  4080.         }
  4081. #endif
  4082.  
  4083.         JNI_GetDefaultJavaVMInitArgs(&vm_args);
  4084.         vm_args.exit = &call_my_exit;
  4085.         if (jpldebug) {
  4086.             fprintf(stderr, "items = %d\n", items);
  4087.             fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));
  4088.         }
  4089.         ++mark;
  4090.         while (items > 1) {
  4091.             char *s = SvPV(*mark,PL_na);
  4092.             ++mark;
  4093.             if (jpldebug) {
  4094.                 fprintf(stderr, "*s = %s\n", s);
  4095.                 fprintf(stderr, "val = %s\n", SvPV(*mark, PL_na));
  4096.             }
  4097.             items -= 2;
  4098.             if (strEQ(s, "checkSource"))
  4099.             vm_args.checkSource = (jint)SvIV(*mark);
  4100.             else if (strEQ(s, "nativeStackSize"))
  4101.             vm_args.nativeStackSize = (jint)SvIV(*mark);
  4102.             else if (strEQ(s, "javaStackSize"))
  4103.             vm_args.javaStackSize = (jint)SvIV(*mark);
  4104.             else if (strEQ(s, "minHeapSize"))
  4105.             vm_args.minHeapSize = (jint)SvIV(*mark);
  4106.             else if (strEQ(s, "maxHeapSize"))
  4107.             vm_args.maxHeapSize = (jint)SvIV(*mark);
  4108.             else if (strEQ(s, "verifyMode"))
  4109.             vm_args.verifyMode = (jint)SvIV(*mark);
  4110.             else if (strEQ(s, "classpath"))
  4111.             vm_args.classpath = savepv(SvPV(*mark,PL_na));
  4112.             else if (strEQ(s, "enableClassGC"))
  4113.             vm_args.enableClassGC = (jint)SvIV(*mark);
  4114.             else if (strEQ(s, "enableVerboseGC"))
  4115.             vm_args.enableVerboseGC = (jint)SvIV(*mark);
  4116.             else if (strEQ(s, "disableAsyncGC"))
  4117.             vm_args.disableAsyncGC = (jint)SvIV(*mark);
  4118. #ifndef KAFFE
  4119.             else if (strEQ(s, "verbose"))
  4120.             vm_args.verbose = (jint)SvIV(*mark); 
  4121.             else if (strEQ(s, "debugging"))
  4122.             vm_args.debugging = (jboolean)SvIV(*mark);
  4123.             else if (strEQ(s, "debugPort"))
  4124.             vm_args.debugPort = (jint)SvIV(*mark); 
  4125. #endif
  4126.             else
  4127.             croak("unrecognized option: %s", s);
  4128.         }
  4129.  
  4130.         if (jpldebug) {
  4131.             fprintf(stderr, "Creating Java VM...\n");
  4132.             fprintf(stderr, "Working CLASSPATH: %s\n", 
  4133.             vm_args.classpath);
  4134.         }
  4135.         JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args);
  4136.         if (jpldebug) {
  4137.             fprintf(stderr, "Created Java VM.\n");
  4138.         }
  4139.         }
  4140.     }
  4141.  
  4142.