home *** CD-ROM | disk | FTP | other *** search
/ Netscape Plug-Ins Developer's Kit / Netscape_Plug-Ins_Developers_Kit.iso / source / Chap05 / zero / INCLUDE / JRI.H < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-30  |  34.2 KB  |  1,023 lines

  1. /* -*- Mode: C; tab-width: 4; -*- */
  2. /*******************************************************************************
  3.  * Java Runtime Interface
  4.  * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.
  5.  ******************************************************************************/
  6.  
  7. #ifndef JRI_H
  8. #define JRI_H
  9.  
  10. #include "jri_md.h"
  11. #include <stddef.h>
  12. #include <stdlib.h>
  13. #include <stdarg.h>
  14.  
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18.  
  19. /*******************************************************************************
  20.  * Types
  21.  ******************************************************************************/
  22.  
  23. typedef void*                       JRIRef;
  24.  
  25. typedef struct JRIGlobal*            JRIGlobalRef;
  26.  
  27. typedef struct JRINativeInterface    JRINativeInterface;
  28.  
  29. typedef const JRINativeInterface*    JRIEnv;
  30.  
  31. typedef struct JRIFieldThunk        JRIFieldThunk;
  32.  
  33. typedef struct JRIMethodThunk        JRIMethodThunk;
  34.  
  35. /* convenience types: */
  36. typedef JRIRef        jref;
  37. typedef JRIRef        jbooleanArray;
  38. typedef JRIRef        jbyteArray;
  39. typedef JRIRef        jcharArray;
  40. typedef JRIRef        jshortArray;
  41. typedef JRIRef        jintArray;
  42. typedef JRIRef        jlongArray;
  43. typedef JRIRef        jfloatArray;
  44. typedef JRIRef        jdoubleArray;
  45. typedef JRIRef        jobjectArray;
  46. typedef JRIRef        jstringArray;
  47. typedef JRIRef        jarrayArray;
  48.  
  49. typedef union JRIValue {
  50.     jbool            z;
  51.     jbyte            b;
  52.     jchar            c;
  53.     jshort            s;
  54.     jint            i;
  55.     jlong            l;
  56.     jfloat            f;
  57.     jdouble            d;
  58.     jref            r;
  59. } JRIValue;
  60.  
  61. typedef enum JRIMethodThunkType {
  62.     JRIMethodThunkType_NameAndSig
  63. } JRIMethodThunkType;
  64.  
  65. struct JRIMethodThunk {
  66.     JRIMethodThunkType                type;
  67.     void*                            data0;
  68.     void*                            data1;
  69. };
  70.  
  71. typedef enum JRIBoolean {
  72.     JRIFalse        = 0,
  73.     JRITrue            = 1
  74. } JRIBoolean;
  75.  
  76. typedef struct JRINativeInfo {
  77.     char*            nativeMethodName;    /* input */
  78.     char*            nativeMethodSig;    /* input */
  79.     void*            nativeMethodProc;    /* input */
  80. } JRINativeInfo;
  81.  
  82. #define JRIConstructorMethodName    "<init>"
  83.  
  84. /*******************************************************************************
  85.  * Signature Construction Macros
  86.  ******************************************************************************/
  87.  
  88. /*
  89. ** These macros can be used to construct signature strings. Hopefully their names
  90. ** are a little easier to remember than the single character they correspond to.
  91. ** For example, to specify the signature of the method:
  92. **
  93. **    public int read(byte b[], int off, int len);
  94. **
  95. ** you could write something like this in C:
  96. **
  97. **    char* readSig = JRISigMethod(JRISigArray(JRISigByte)
  98. **                                 JRISigInt
  99. **                                 JRISigInt) JRISigInt;
  100. **
  101. ** Of course, don't put commas between the types.
  102. */
  103. #define JRISigArray(T)        "[" T
  104. #define JRISigByte            "B"
  105. #define JRISigChar            "C"
  106. #define JRISigClass(name)    "L" name ";"
  107. #define JRISigFloat            "F"
  108. #define JRISigDouble        "D"
  109. #define JRISigMethod(args)    "(" args ")"
  110. #define JRISigNoArgs        ""
  111. #define JRISigInt            "I"
  112. #define JRISigLong            "J"
  113. #define JRISigShort            "S"
  114. #define JRISigVoid            "V"
  115. #define JRISigBoolean        "Z"
  116.  
  117. /*******************************************************************************
  118.  * Environments
  119.  ******************************************************************************/
  120.  
  121. extern JRI_PUBLIC_API(JRIEnv*)
  122. JRI_GetCurrentEnv(void);
  123.  
  124. /*
  125. ** LoadClass borrows the buffer that you hand to it, so it will copy it
  126. ** if it needs to. This is useful when defining a class from static class
  127. ** data.
  128. */
  129. typedef jref
  130. (*JRI_LoadClass_t)(JRIEnv* env, const char* buf, jsize bufLen);
  131.  
  132. /*
  133. ** Returns a jref to a class object from a fully qualified name (package
  134. ** names delimited by '/' and the class name). If the name begins with
  135. ** '[' (the array signature character), an array class is returned.
  136. */
  137. typedef jref
  138. (*JRI_FindClass_t)(JRIEnv* env, const char* name);
  139.  
  140. /* Working with Exceptions */
  141.  
  142. typedef void
  143. (*JRI_Throw_t)(JRIEnv* env, jref obj);
  144.  
  145. typedef void
  146. (*JRI_ThrowNew_t)(JRIEnv* env, jref clazz, const char* message);
  147.  
  148. typedef jref
  149. (*JRI_ExceptionOccurred_t)(JRIEnv* env);
  150.  
  151. typedef void
  152. (*JRI_ExceptionDescribe_t)(JRIEnv* env);
  153.  
  154. typedef void
  155. (*JRI_ExceptionClear_t)(JRIEnv* env);
  156.  
  157. /*******************************************************************************
  158.  * References
  159.  ******************************************************************************/
  160.  
  161. typedef JRIGlobalRef
  162. (*JRI_NewGlobalRef_t)(JRIEnv* env, jref ref);
  163.  
  164. typedef void
  165. (*JRI_DisposeGlobalRef_t)(JRIEnv* env, JRIGlobalRef ref);
  166.  
  167. typedef jref
  168. (*JRI_GetGlobalRef_t)(JRIEnv* env, JRIGlobalRef globalRef);
  169.  
  170. typedef void
  171. (*JRI_SetGlobalRef_t)(JRIEnv* env, JRIGlobalRef globalRef, jref value);
  172.  
  173. typedef jbool
  174. (*JRI_IsSameObject_t)(JRIEnv* env, jref r1, jref r2);
  175.  
  176. /*******************************************************************************
  177.  * Object Operations
  178.  ******************************************************************************/
  179.  
  180. typedef jref
  181. (*JRI_NewObject_t)(JRIEnv* env, jref clazz, JRIMethodThunk* method, ...);
  182.  
  183. typedef jref
  184. (*JRI_NewObjectA_t)(JRIEnv* env, jref clazz, JRIMethodThunk* method,
  185.                     JRIValue* args);
  186.  
  187. typedef jref
  188. (*JRI_NewObjectV_t)(JRIEnv* env, jref clazz, JRIMethodThunk* method,
  189.                     va_list args);
  190.  
  191. typedef jref
  192. (*JRI_GetObjectClass_t)(JRIEnv* env, jref obj);
  193.  
  194. typedef jbool
  195. (*JRI_IsInstanceOf_t)(JRIEnv* env, jref obj, jref clazz);
  196.  
  197. /******************************************************************************/
  198.  
  199. /* Accessing Public Fields of Objects */
  200.  
  201. typedef jref
  202. (*JRI_GetField_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  203.  
  204. typedef jbool
  205. (*JRI_GetField_boolean_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  206.  
  207. typedef jbyte
  208. (*JRI_GetField_byte_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  209.  
  210. typedef jchar
  211. (*JRI_GetField_char_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  212.  
  213. typedef jshort
  214. (*JRI_GetField_short_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  215.  
  216. typedef jint
  217. (*JRI_GetField_int_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  218.  
  219. typedef jlong
  220. (*JRI_GetField_long_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  221.  
  222. typedef jfloat
  223. (*JRI_GetField_float_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  224.  
  225. typedef jdouble
  226. (*JRI_GetField_double_t)(JRIEnv* env, jref obj, JRIFieldThunk* field);
  227.  
  228. /******************************************************************************/
  229.  
  230. typedef void
  231. (*JRI_SetField_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jref value);
  232.  
  233. typedef void
  234. (*JRI_SetField_boolean_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jbool value);
  235.  
  236. typedef void
  237. (*JRI_SetField_byte_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jbyte value);
  238.  
  239. typedef void
  240. (*JRI_SetField_char_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jchar value);
  241.  
  242. typedef void
  243. (*JRI_SetField_short_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jshort value);
  244.  
  245. typedef void
  246. (*JRI_SetField_int_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jint value);
  247.  
  248. typedef void
  249. (*JRI_SetField_long_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jlong value);
  250.  
  251. typedef void
  252. (*JRI_SetField_float_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jfloat value);
  253.  
  254. typedef void
  255. (*JRI_SetField_double_t)(JRIEnv* env, jref obj, JRIFieldThunk* field, jdouble value);
  256.  
  257. /******************************************************************************/
  258.  
  259. /* Calling Public Dynamic Methods of Objects */
  260.  
  261. typedef JRIValue
  262. (*JRI_CallMethod_t)(JRIEnv* env, jref obj, JRIMethodThunk* method, ...);
  263.  
  264. typedef JRIValue
  265. (*JRI_ApplyMethodV_t)(JRIEnv* env, jref obj, JRIMethodThunk* method, va_list args);
  266.  
  267. typedef JRIValue
  268. (*JRI_ApplyMethod_t)(JRIEnv* env, jref obj, JRIMethodThunk* method,
  269.                JRIValue* valueArray);
  270.  
  271. /*******************************************************************************
  272.  * Class Operations
  273.  ******************************************************************************/
  274.  
  275. /*
  276. ** Determines whether the first class is a subclass of the second, or
  277. ** whether it has the second class as one of its interfaces.
  278. */
  279. typedef jbool
  280. (*JRI_IsSubclassOf_t)(JRIEnv* env, jref clazz, jref super);
  281.  
  282. /******************************************************************************/
  283.  
  284. /* Accessing Public Static Fields of Objects */
  285.  
  286. typedef jref
  287. (*JRI_GetStaticField_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  288.  
  289. typedef jbool
  290. (*JRI_GetStaticField_boolean_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  291.  
  292. typedef jbyte
  293. (*JRI_GetStaticField_byte_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  294.  
  295. typedef jchar
  296. (*JRI_GetStaticField_char_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  297.  
  298. typedef jshort
  299. (*JRI_GetStaticField_short_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  300.  
  301. typedef jint
  302. (*JRI_GetStaticField_int_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  303.  
  304. typedef jlong
  305. (*JRI_GetStaticField_long_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  306.  
  307. typedef jfloat
  308. (*JRI_GetStaticField_float_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  309.  
  310. typedef jdouble
  311. (*JRI_GetStaticField_double_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field);
  312.  
  313. /******************************************************************************/
  314.  
  315. typedef void
  316. (*JRI_SetStaticField_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  317.                         jref value);
  318.  
  319. typedef void
  320. (*JRI_SetStaticField_boolean_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  321.                             jbool value);
  322.  
  323. typedef void
  324. (*JRI_SetStaticField_byte_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  325.                          jbyte value);
  326.  
  327. typedef void
  328. (*JRI_SetStaticField_char_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  329.                          jchar value);
  330.  
  331. typedef void
  332. (*JRI_SetStaticField_short_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  333.                           jshort value);
  334.  
  335. typedef void
  336. (*JRI_SetStaticField_int_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  337.                         jint value);
  338.  
  339. typedef void
  340. (*JRI_SetStaticField_long_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  341.                          jlong value);
  342.  
  343. typedef void
  344. (*JRI_SetStaticField_float_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  345.                           jfloat value);
  346.  
  347. typedef void
  348. (*JRI_SetStaticField_double_t)(JRIEnv* env, jref clazz, JRIFieldThunk* field,
  349.                            jdouble value);
  350.  
  351. /******************************************************************************/
  352.  
  353. /* Calling Public Static Methods of Objects */
  354.  
  355. typedef JRIValue
  356. (*JRI_CallStaticMethod_t)(JRIEnv* env, jref clazz, JRIMethodThunk* method, ...);
  357.  
  358. typedef JRIValue
  359. (*JRI_ApplyStaticMethodV_t)(JRIEnv* env, jref clazz, JRIMethodThunk* method,
  360.                      va_list args);
  361.  
  362. typedef JRIValue
  363. (*JRI_ApplyStaticMethod_t)(JRIEnv* env, jref clazz, JRIMethodThunk* method,
  364.                      JRIValue* valueArray);
  365.  
  366. /*******************************************************************************
  367.  * String Operations
  368.  ******************************************************************************/
  369.  
  370. /* Unicode Interface */
  371.  
  372. typedef jref
  373. (*JRI_NewString_t)(JRIEnv* env, const jchar* bytes, jsize length);
  374.  
  375. typedef jsize
  376. (*JRI_GetStringLength_t)(JRIEnv* env, jref string);
  377.  
  378. /* This returns a const jchar* pointer directly into the string's contents: */
  379. typedef const jchar*
  380. (*JRI_GetStringChars_t)(JRIEnv* env, jref string);
  381.  
  382. /* Mallocs a C string that must be freed by caller: */
  383. typedef jchar*
  384. (*JRI_CopyString_t)(JRIEnv* env, jref string);
  385.  
  386. /* UTF Interface */
  387.  
  388. typedef jref
  389. (*JRI_NewStringUTF_t)(JRIEnv* env, const char* bytes, jsize length);
  390.  
  391. typedef jsize
  392. (*JRI_GetStringUTFLength_t)(JRIEnv* env, jref string);
  393.  
  394. /* Mallocs a UTF C string that must be freed by caller: */
  395. typedef char*
  396. (*JRI_CopyStringUTF_t)(JRIEnv* env, jref string);
  397.  
  398. /*******************************************************************************
  399.  * Scalar Array Operations
  400.  ******************************************************************************/
  401.  
  402. typedef jref
  403. (*JRI_NewScalarArray_t)(JRIEnv* env, jsize length, const jbyte* bytes);
  404.  
  405. typedef jsize
  406. (*JRI_GetScalarArrayLength_t)(JRIEnv* env, jref array);
  407.  
  408. typedef jbyte*
  409. (*JRI_GetScalarArrayData_t)(JRIEnv* env, jref array);
  410.  
  411. /*******************************************************************************
  412.  * Object Array Operations
  413.  ******************************************************************************/
  414.  
  415. typedef jref
  416. (*JRI_NewObjectArray_t)(JRIEnv* env, jsize length, jref elementClass,
  417.                         jref initialElement);
  418.  
  419. typedef jsize
  420. (*JRI_GetObjectArrayLength_t)(JRIEnv* env, jref array);
  421.  
  422. typedef jref
  423. (*JRI_GetObjectArrayElement_t)(JRIEnv* env, jref array, jsize index);
  424.  
  425. typedef void
  426. (*JRI_SetObjectArrayElement_t)(JRIEnv* env, jref array, jsize index,
  427.                                jref value);
  428.  
  429. /*******************************************************************************
  430.  * Native Bootstrap
  431.  ******************************************************************************/
  432.  
  433. /*
  434. ** This routine is used by the generated stub code to look up field
  435. ** positions and method identifiers for native access and invocation.
  436. */
  437. typedef void
  438. (*JRI_RegisterNatives_t)(JRIEnv* env, jref clazz,
  439.                          JRINativeInfo* nativeInfoArray);
  440.  
  441. typedef void
  442. (*JRI_UnregisterNatives_t)(JRIEnv* env, jref clazz);
  443.  
  444. /******************************************************************************/
  445.  
  446. struct JRIFieldThunk {
  447.     void*            data;
  448.     JRI_GetField_t    get;    /* cast this to the right accessor type before calling */
  449.     JRI_SetField_t    set;    /* cast this to the right accessor type before calling */
  450. };
  451.  
  452. struct JRINativeInterface {
  453.     void*                            Reserved0;
  454.     void*                            Reserved1;
  455.     void*                            Reserved2;
  456.     JRI_LoadClass_t                    LoadClass;
  457.     JRI_FindClass_t                    FindClass;
  458.     JRI_Throw_t                        Throw;
  459.     JRI_ThrowNew_t                    ThrowNew;
  460.     JRI_ExceptionOccurred_t            ExceptionOccurred;
  461.     JRI_ExceptionDescribe_t            ExceptionDescribe;
  462.     JRI_ExceptionClear_t            ExceptionClear;
  463.     JRI_NewGlobalRef_t                NewGlobalRef;
  464.     JRI_DisposeGlobalRef_t            DisposeGlobalRef;
  465.     JRI_GetGlobalRef_t                GetGlobalRef;
  466.     JRI_SetGlobalRef_t                SetGlobalRef;
  467.     JRI_IsSameObject_t                IsSameObject;
  468.     JRI_NewObject_t                    NewObject;
  469.     JRI_NewObjectA_t                NewObjectA;
  470.     JRI_NewObjectV_t                NewObjectV;
  471.     JRI_GetObjectClass_t            GetObjectClass;
  472.     JRI_IsInstanceOf_t                IsInstanceOf;
  473.     JRI_GetField_t                    GetField;
  474.     JRI_GetField_boolean_t            GetField_boolean;
  475.     JRI_GetField_byte_t                GetField_byte;
  476.     JRI_GetField_char_t                GetField_char;
  477.     JRI_GetField_short_t            GetField_short;
  478.     JRI_GetField_int_t                GetField_int;
  479.     JRI_GetField_long_t                GetField_long;
  480.     JRI_GetField_float_t            GetField_float;
  481.     JRI_GetField_double_t            GetField_double;
  482.     JRI_SetField_t                    SetField;
  483.     JRI_SetField_boolean_t            SetField_boolean;
  484.     JRI_SetField_byte_t                SetField_byte;
  485.     JRI_SetField_char_t                SetField_char;
  486.     JRI_SetField_short_t            SetField_short;
  487.     JRI_SetField_int_t                SetField_int;
  488.     JRI_SetField_long_t                SetField_long;
  489.     JRI_SetField_float_t            SetField_float;
  490.     JRI_SetField_double_t            SetField_double;
  491.     JRI_CallMethod_t                CallMethod;
  492.     JRI_ApplyMethodV_t                ApplyMethodV;
  493.     JRI_ApplyMethod_t                ApplyMethod;
  494.     JRI_IsSubclassOf_t                IsSubclassOf;
  495.     JRI_GetStaticField_t            GetStaticField;
  496.     JRI_GetStaticField_boolean_t    GetStaticField_boolean;
  497.     JRI_GetStaticField_byte_t        GetStaticField_byte;
  498.     JRI_GetStaticField_char_t        GetStaticField_char;
  499.     JRI_GetStaticField_short_t        GetStaticField_short;
  500.     JRI_GetStaticField_int_t        GetStaticField_int;
  501.     JRI_GetStaticField_long_t        GetStaticField_long;
  502.     JRI_GetStaticField_float_t        GetStaticField_float;
  503.     JRI_GetStaticField_double_t        GetStaticField_double;
  504.     JRI_SetStaticField_t            SetStaticField;
  505.     JRI_SetStaticField_boolean_t    SetStaticField_boolean;
  506.     JRI_SetStaticField_byte_t        SetStaticField_byte;
  507.     JRI_SetStaticField_char_t        SetStaticField_char;
  508.     JRI_SetStaticField_short_t        SetStaticField_short;
  509.     JRI_SetStaticField_int_t        SetStaticField_int;
  510.     JRI_SetStaticField_long_t        SetStaticField_long;
  511.     JRI_SetStaticField_float_t        SetStaticField_float;
  512.     JRI_SetStaticField_double_t        SetStaticField_double;
  513.     JRI_CallStaticMethod_t            CallStaticMethod;
  514.     JRI_ApplyStaticMethodV_t        ApplyStaticMethodV;
  515.     JRI_ApplyStaticMethod_t            ApplyStaticMethod;
  516.     JRI_NewString_t                    NewString;
  517.     JRI_GetStringLength_t            GetStringLength;
  518.     JRI_GetStringChars_t            GetStringChars;
  519.     JRI_CopyString_t                CopyString;
  520.     JRI_NewStringUTF_t                NewStringUTF;
  521.     JRI_GetStringUTFLength_t        GetStringUTFLength;
  522.     JRI_CopyStringUTF_t                CopyStringUTF;
  523.     JRI_NewScalarArray_t            NewScalarArray;
  524.     JRI_GetScalarArrayLength_t        GetScalarArrayLength;
  525.     JRI_GetScalarArrayData_t        GetScalarArrayData;
  526.     JRI_NewObjectArray_t            NewObjectArray;
  527.     JRI_GetObjectArrayLength_t        GetObjectArrayLength;
  528.     JRI_GetObjectArrayElement_t        GetObjectArrayElement;
  529.     JRI_SetObjectArrayElement_t        SetObjectArrayElement;
  530.     JRI_RegisterNatives_t            RegisterNatives;
  531.     JRI_UnregisterNatives_t            UnregisterNatives;
  532. };
  533.  
  534. /******************************************************************************/
  535.  
  536. /*
  537. ** LoadClass borrows the buffer that you hand to it, so it will Copy it
  538. ** if it needs to. This is useful when defining a class from static class
  539. ** data.
  540. */
  541. #define JRI_LoadClass(env, buf, bufLen)        \
  542.     (((*(env))->LoadClass)(env, buf, bufLen))
  543.  
  544. /*
  545. ** Returns a jref to a class object from a fully qualified name (package
  546. ** names delimited by '/' and the class name). If the name begins with
  547. ** '[' (the array signature character), an array class is returned.
  548. */
  549. #define JRI_FindClass(env, name)        \
  550.     (((*(env))->FindClass)(env, name))
  551.  
  552. /* Working with Exceptions */
  553.  
  554. #define JRI_Throw(env, obj)    \
  555.     (((*(env))->Throw)(env, obj))
  556.  
  557. #define JRI_ThrowNew(env, clazz, message)        \
  558.     (((*(env))->ThrowNew)(env, clazz, message))
  559.  
  560. #define JRI_ExceptionOccurred(env)        \
  561.     (((*(env))->ExceptionOccurred)(env))
  562.  
  563. #define JRI_ExceptionDescribe(env)        \
  564.     (((*(env))->ExceptionDescribe)(env))
  565.  
  566. #define JRI_ExceptionClear(env)        \
  567.     (((*(env))->ExceptionClear)(env))
  568.  
  569. /*******************************************************************************
  570.  * References
  571.  ******************************************************************************/
  572.  
  573. #define JRI_NewGlobalRef(env, ref)        \
  574.     (((*(env))->NewGlobalRef)(env, ref))
  575.  
  576. #define JRI_DisposeGlobalRef(env, ref)    \
  577.     (((*(env))->DisposeGlobalRef)(env, ref))
  578.  
  579. #define JRI_GetGlobalRef(env, globalRef)        \
  580.     (((*(env))->GetGlobalRef)(env, globalRef))
  581.  
  582. #define JRI_SetGlobalRef(env, globalRef, value)    \
  583.     (((*(env))->SetGlobalRef)(env, globalRef, value))
  584.  
  585. #define JRI_IsSameObject(env, r1, r2)        \
  586.     (((*(env))->IsSameObject)(env, r1, r2))
  587.  
  588. /*******************************************************************************
  589.  * Object Operations
  590.  ******************************************************************************/
  591.  
  592. #define JRI_NewObjectM(env)        ((*(env))->NewObject)
  593. #define JRI_NewObject            JRI_NewObjectM(env)    /* hard coded 'env' */
  594.  
  595. #define JRI_NewObjectA(env, clazz, method, args)        \
  596.     (((*(env))->NewObjectA)(env, clazz, method, args))
  597.  
  598. #define JRI_NewObjectV(env, clazz, method, args)        \
  599.     (((*(env))->NewObjectV)(env, clazz, method, args))
  600.  
  601. #define JRI_GetObjectClass(env, obj)        \
  602.     (((*(env))->GetObjectClass)(env, obj))
  603.  
  604. #define JRI_IsInstanceOf(env, obj, clazz)    \
  605.     (((*(env))->IsInstanceOf)(env, obj, clazz))
  606.  
  607. /******************************************************************************/
  608.  
  609. /* Accessing Public Fields of Objects */
  610.  
  611. #define JRI_GetField(env, obj, fieldThunk)    \
  612.     (((JRI_GetField_t)(fieldThunk)->get)(env, obj, fieldThunk))
  613.  
  614. #define JRI_GetField_boolean(env, obj, fieldThunk)    \
  615.     (((JRI_GetField_boolean_t)(fieldThunk)->get)(env, obj, fieldThunk))
  616.  
  617. #define JRI_GetField_byte(env, obj, fieldThunk)    \
  618.     (((JRI_GetField_byte_t)(fieldThunk)->get)(env, obj, fieldThunk))
  619.  
  620. #define JRI_GetField_char(env, obj, fieldThunk)    \
  621.     (((JRI_GetField_char_t)(fieldThunk)->get)(env, obj, fieldThunk))
  622.  
  623. #define JRI_GetField_short(env, obj, fieldThunk)    \
  624.     (((JRI_GetField_short_t)(fieldThunk)->get)(env, obj, fieldThunk))
  625.  
  626. #define JRI_GetField_int(env, obj, fieldThunk)    \
  627.     (((JRI_GetField_int_t)(fieldThunk)->get)(env, obj, fieldThunk))
  628.  
  629. #define JRI_GetField_long(env, obj, fieldThunk)    \
  630.     (((JRI_GetField_long_t)(fieldThunk)->get)(env, obj, fieldThunk))
  631.  
  632. #define JRI_GetField_float(env, obj, fieldThunk)    \
  633.     (((JRI_GetField_float_t)(fieldThunk)->get)(env, obj, fieldThunk))
  634.  
  635. #define JRI_GetField_double(env, obj, fieldThunk)    \
  636.     (((JRI_GetField_double_t)(fieldThunk)->get)(env, obj, fieldThunk))
  637.  
  638. /******************************************************************************/
  639.  
  640. #define JRI_SetField(env, obj, fieldThunk, value)    \
  641.     (((JRI_SetField_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  642.  
  643. #define JRI_SetField_boolean(env, obj, fieldThunk, value)    \
  644.     (((JRI_SetField_boolean_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  645.  
  646. #define JRI_SetField_byte(env, obj, fieldThunk, value)    \
  647.     (((JRI_SetField_byte_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  648.  
  649. #define JRI_SetField_char(env, obj, fieldThunk, value)    \
  650.     (((JRI_SetField_char_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  651.  
  652. #define JRI_SetField_short(env, obj, fieldThunk, value)    \
  653.     (((JRI_SetField_short_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  654.  
  655. #define JRI_SetField_int(env, obj, fieldThunk, value)    \
  656.     (((JRI_SetField_int_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  657.  
  658. #define JRI_SetField_long(env, obj, fieldThunk, value)    \
  659.     (((JRI_SetField_long_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  660.  
  661. #define JRI_SetField_float(env, obj, fieldThunk, value)    \
  662.     (((JRI_SetField_float_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  663.  
  664. #define JRI_SetField_double(env, obj, fieldThunk, value)    \
  665.     (((JRI_SetField_double_t)(fieldThunk)->set)(env, obj, fieldThunk, value))
  666.  
  667. /******************************************************************************/
  668.  
  669. /* Calling Public Dynamic Methods of Objects */
  670.  
  671. #define JRI_CallMethodM(env)            ((*(env))->CallMethod)
  672. #define JRI_CallMethod                    JRI_CallMethodM(env)    /* hard coded 'env' */
  673.  
  674. #define JRI_ApplyMethodV(env, obj, methodThunk, args)    \
  675.     (((*(env))->ApplyMethodV)(env, obj, methodThunk, args))
  676.  
  677. #define JRI_ApplyMethod(env, obj, methodThunk, args)    \
  678.     (((*(env))->ApplyMethod)(env, obj, methodThunk, args))
  679.  
  680. /*******************************************************************************
  681.  * Class Operations
  682.  ******************************************************************************/
  683.  
  684. /*
  685. ** Determines whether the first class is a subclass of the second, or
  686. ** whether it has the second class as one of its interfaces.
  687. */
  688. #define JRI_IsSubclassOf(env, clazz, super)    \
  689.     (((*(env))->IsSubclassOf)(env, clazz, super))
  690.  
  691. /******************************************************************************/
  692.  
  693. /* Accessing Public Static Fields of Objects */
  694.  
  695. #define JRI_GetStaticField(env, clazz, fieldThunk)    \
  696.     (((JRI_GetStaticField_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  697.  
  698. #define JRI_GetStaticField_boolean(env, clazz, fieldThunk)    \
  699.     (((JRI_GetStaticField_boolean_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  700.  
  701. #define JRI_GetStaticField_byte(env, clazz, fieldThunk)    \
  702.     (((JRI_GetStaticField_byte_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  703.  
  704. #define JRI_GetStaticField_char(env, clazz, fieldThunk)    \
  705.     (((JRI_GetStaticField_char_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  706.  
  707. #define JRI_GetStaticField_short(env, clazz, fieldThunk)    \
  708.     (((JRI_GetStaticField_short_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  709.  
  710. #define JRI_GetStaticField_int(env, clazz, fieldThunk)    \
  711.     (((JRI_GetStaticField_int_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  712.  
  713. #define JRI_GetStaticField_long(env, clazz, fieldThunk)    \
  714.     (((JRI_GetStaticField_long_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  715.  
  716. #define JRI_GetStaticField_float(env, clazz, fieldThunk)    \
  717.     (((JRI_GetStaticField_float_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  718.  
  719. #define JRI_GetStaticField_double(env, clazz, fieldThunk)    \
  720.     (((JRI_GetStaticField_double_t)(fieldThunk)->get)(env, clazz, fieldThunk))
  721.  
  722. /******************************************************************************/
  723.  
  724. #define JRI_SetStaticField(env, clazz, fieldThunk, value)    \
  725.     (((JRI_SetStaticField_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  726.  
  727. #define JRI_SetStaticField_boolean(env, clazz, fieldThunk, value)    \
  728.     (((JRI_SetStaticField_boolean_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  729.  
  730. #define JRI_SetStaticField_byte(env, clazz, fieldThunk, value)    \
  731.     (((JRI_SetStaticField_byte_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  732.  
  733. #define JRI_SetStaticField_char(env, clazz, fieldThunk, value)    \
  734.     (((JRI_SetStaticField_char_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  735.  
  736. #define JRI_SetStaticField_short(env, clazz, fieldThunk, value)    \
  737.     (((JRI_SetStaticField_short_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  738.  
  739. #define JRI_SetStaticField_int(env, clazz, fieldThunk, value)    \
  740.     (((JRI_SetStaticField_int_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  741.  
  742. #define JRI_SetStaticField_long(env, clazz, fieldThunk, value)    \
  743.     (((JRI_SetStaticField_long_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  744.  
  745. #define JRI_SetStaticField_float(env, clazz, fieldThunk, value)    \
  746.     (((JRI_SetStaticField_float_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  747.  
  748. #define JRI_SetStaticField_double(env, clazz, fieldThunk, value)    \
  749.     (((JRI_SetStaticField_double_t)(fieldThunk)->set)(env, clazz, fieldThunk, value))
  750.  
  751. /******************************************************************************/
  752.  
  753. /* Calling Public Static Methods of Objects */
  754.  
  755. #define JRI_CallStaticMethodM(env)            ((*(env))->CallStaticMethod)
  756. #define JRI_CallStaticMethod                JRI_CallStaticMethodM(env)    /* hard coded 'env' */
  757.  
  758. #define JRI_ApplyStaticMethodV(env, clazz, method, args)        \
  759.     (((*(env))->ApplyStaticMethodV)(env, clazz, method, args))
  760.  
  761. #define JRI_ApplyStaticMethod(env, clazz, method, args)        \
  762.     (((*(env))->ApplyStaticMethod)(env, clazz, method, args))
  763.  
  764. /*******************************************************************************
  765.  * String Operations
  766.  ******************************************************************************/
  767.  
  768. /* Unicode Interface */
  769.  
  770. #define JRI_NewString(env, bytes, length)    \
  771.     (((*(env))->NewString)(env, bytes, length))
  772.  
  773. #define JRI_GetStringLength(env, string)    \
  774.     (((*(env))->GetStringLength)(env, string))
  775.  
  776. /* This returns a const jchar* pointer directly into the string's contents: */
  777. #define JRI_GetStringChars(env, string)        \
  778.     (((*(env))->GetStringChars)(env, string))
  779.  
  780. /* Mallocs a C string that must be freed by caller: */
  781. #define JRI_CopyString(env, string)        \
  782.     (((*(env))->CopyString)(env, string))
  783.  
  784. /* UTF Interface */
  785.  
  786. #define JRI_NewStringUTF(env, bytes, length)        \
  787.     (((*(env))->NewStringUTF)(env, bytes, length))
  788.  
  789. #define JRI_GetStringUTFLength(env, string)        \
  790.     (((*(env))->GetStringUTFLength)(env, string))
  791.  
  792. /* Mallocs a UTF C string that must be freed by caller: */
  793. #define JRI_CopyStringUTF(env, string)    \
  794.     (((*(env))->CopyStringUTF)(env, string))
  795.  
  796. /*******************************************************************************
  797.  * Scalar Array Operations
  798.  ******************************************************************************/
  799.  
  800. #define JRI_NewScalarArray(env, length, bytes)        \
  801.     (((*(env))->NewScalarArray)(env, length, bytes))
  802.  
  803. #define JRI_GetScalarArrayLength(env, array)        \
  804.     (((*(env))->GetScalarArrayLength)(env, array))
  805.  
  806. #define JRI_GetScalarArrayData(env, array)    \
  807.     (((*(env))->GetScalarArrayData)(env, array))
  808.  
  809. /*******************************************************************************
  810.  * Specific Scalar Array Types
  811.  ******************************************************************************/
  812.  
  813. #define JRI_NewBooleanArray(env, length, initialValues)    \
  814.     JRI_NewScalarArray(env, length, (jbyte*)(initialValues))
  815. #define JRI_GetBooleanArrayLength(env, array)    \
  816.     JRI_GetScalarArrayLength(env, array)
  817. #define JRI_GetBooleanArrayData(env, array)    \
  818.     ((jbool*)JRI_GetScalarArrayData(env, array))
  819.  
  820. #define JRI_NewByteArray(env, length, initialValues)    \
  821.     JRI_NewScalarArray(env, length, (jbyte*)(initialValues))
  822. #define JRI_GetByteArrayLength(env, array)    \
  823.     JRI_GetScalarArrayLength(env, array)
  824. #define JRI_GetByteArrayData(env, array)    \
  825.     JRI_GetScalarArrayData(env, array)
  826.  
  827. #define JRI_NewCharArray(env, length, initialValues)    \
  828.     JRI_NewScalarArray(env, ((length) * sizeof(jchar)), (jbyte*)(initialValues))
  829. #define JRI_GetCharArrayLength(env, array)    \
  830.     JRI_GetScalarArrayLength(env, array)
  831. #define JRI_GetCharArrayData(env, array)           \
  832.     ((jchar*)JRI_GetScalarArrayData(env, array))
  833.  
  834. #define JRI_NewShortArray(env, length, initialValues)    \
  835.     JRI_NewScalarArray(env, ((length) * sizeof(jshort)), (jbyte*)(initialValues))
  836. #define JRI_GetShortArrayLength(env, array)    \
  837.     JRI_GetScalarArrayLength(env, array)
  838. #define JRI_GetShortArrayData(env, array)           \
  839.     ((jshort*)JRI_GetScalarArrayData(env, array))
  840.  
  841. #define JRI_NewIntArray(env, length, initialValues)    \
  842.     JRI_NewScalarArray(env, ((length) * sizeof(jint)), (jbyte*)(initialValues))
  843. #define JRI_GetIntArrayLength(env, array)    \
  844.     JRI_GetScalarArrayLength(env, array)
  845. #define JRI_GetIntArrayData(env, array)           \
  846.     ((jint*)JRI_GetScalarArrayData(env, array))
  847.  
  848. #define JRI_NewLongArray(env, length, initialValues)    \
  849.     JRI_NewScalarArray(env, ((length) * sizeof(jlong)), (jbyte*)(initialValues))
  850. #define JRI_GetLongArrayLength(env, array)    \
  851.     JRI_GetScalarArrayLength(env, array)
  852. #define JRI_GetLongArrayData(env, array)           \
  853.     ((jlong*)JRI_GetScalarArrayData(env, array))
  854.  
  855. #define JRI_NewFloatArray(env, length, initialValues)    \
  856.     JRI_NewScalarArray(env, ((length) * sizeof(jfloat)), (jbyte*)(initialValues))
  857. #define JRI_GetFloatArrayLength(env, array)    \
  858.     JRI_GetScalarArrayLength(env, array)
  859. #define JRI_GetFloatArrayData(env, array)           \
  860.     ((jfloat*)JRI_GetScalarArrayData(env, array))
  861.  
  862. #define JRI_NewDoubleArray(env, length, initialValues)    \
  863.     JRI_NewScalarArray(env, ((length) * sizeof(jdouble)), (jbyte*)(initialValues))
  864. #define JRI_GetDoubleArrayLength(env, array)    \
  865.     JRI_GetScalarArrayLength(env, array)
  866. #define JRI_GetDoubleArrayData(env, array)           \
  867.     ((jdouble*)JRI_GetScalarArrayData(env, array))
  868.  
  869. /*******************************************************************************
  870.  * Object Array Operations
  871.  ******************************************************************************/
  872.  
  873. #define JRI_NewObjectArray(env, length, elementClass, initialElement)        \
  874.     (((*(env))->NewObjectArray)(env, length, elementClass, initialElement))
  875.  
  876. #define JRI_GetObjectArrayLength(env, array)        \
  877.     (((*(env))->GetObjectArrayLength)(env, array))
  878.  
  879. #define JRI_GetObjectArrayElement(env, array, index)    \
  880.     (((*(env))->GetObjectArrayElement)(env, array, index))
  881.  
  882. #define JRI_SetObjectArrayElement(env, array, index, value)        \
  883.     (((*(env))->SetObjectArrayElement)(env, array, index, value))
  884.  
  885. /*******************************************************************************
  886.  * Native Bootstrap
  887.  ******************************************************************************/
  888.  
  889. /*
  890. ** This routine is used by the generated stub code to look up field
  891. ** positions and method identifiers for native access and invocation.
  892. */
  893. #define JRI_RegisterNatives(env, clazz, nativeInfoArray)        \
  894.     (((*(env))->RegisterNatives)(env, clazz, nativeInfoArray))
  895.  
  896. #define JRI_UnregisterNatives(env, clazz)        \
  897.     (((*(env))->UnregisterNatives)(env, clazz))
  898.  
  899. /*******************************************************************************
  900.  * Glue Routines -- These are used to auto-initialize fields
  901.  ******************************************************************************/
  902.  
  903. JRI_PUBLIC_API(jref)
  904. JRI_GetFieldByName(JRIEnv* env, jref obj, JRIFieldThunk* field);
  905.  
  906. JRI_PUBLIC_API(jbool)
  907. JRI_GetFieldByName_boolean(JRIEnv* env, jref obj, JRIFieldThunk* field);
  908.  
  909. JRI_PUBLIC_API(jbyte)
  910. JRI_GetFieldByName_byte(JRIEnv* env, jref obj, JRIFieldThunk* field);
  911.  
  912. JRI_PUBLIC_API(jchar)
  913. JRI_GetFieldByName_char(JRIEnv* env, jref obj, JRIFieldThunk* field);
  914.  
  915. JRI_PUBLIC_API(jshort)
  916. JRI_GetFieldByName_short(JRIEnv* env, jref obj, JRIFieldThunk* field);
  917.  
  918. JRI_PUBLIC_API(jint)
  919. JRI_GetFieldByName_int(JRIEnv* env, jref obj, JRIFieldThunk* field);
  920.  
  921. JRI_PUBLIC_API(jlong)
  922. JRI_GetFieldByName_long(JRIEnv* env, jref obj, JRIFieldThunk* field);
  923.  
  924. JRI_PUBLIC_API(jfloat)
  925. JRI_GetFieldByName_float(JRIEnv* env, jref obj, JRIFieldThunk* field);
  926.  
  927. JRI_PUBLIC_API(jdouble)
  928. JRI_GetFieldByName_double(JRIEnv* env, jref obj, JRIFieldThunk* field);
  929.  
  930. /******************************************************************************/
  931.  
  932. JRI_PUBLIC_API(void)
  933. JRI_SetFieldByName(JRIEnv* env, jref obj, JRIFieldThunk* field, jref value);
  934.  
  935. JRI_PUBLIC_API(void)
  936. JRI_SetFieldByName_boolean(JRIEnv* env, jref obj, JRIFieldThunk* field, jbool value);
  937.  
  938. JRI_PUBLIC_API(void)
  939. JRI_SetFieldByName_byte(JRIEnv* env, jref obj, JRIFieldThunk* field, jbyte value);
  940.  
  941. JRI_PUBLIC_API(void)
  942. JRI_SetFieldByName_char(JRIEnv* env, jref obj, JRIFieldThunk* field, jchar value);
  943.  
  944. JRI_PUBLIC_API(void)
  945. JRI_SetFieldByName_short(JRIEnv* env, jref obj, JRIFieldThunk* field, jshort value);
  946.  
  947. JRI_PUBLIC_API(void)
  948. JRI_SetFieldByName_int(JRIEnv* env, jref obj, JRIFieldThunk* field, jint value);
  949.  
  950. JRI_PUBLIC_API(void)
  951. JRI_SetFieldByName_long(JRIEnv* env, jref obj, JRIFieldThunk* field, jlong value);
  952.  
  953. JRI_PUBLIC_API(void)
  954. JRI_SetFieldByName_float(JRIEnv* env, jref obj, JRIFieldThunk* field, jfloat value);
  955.  
  956. JRI_PUBLIC_API(void)
  957. JRI_SetFieldByName_double(JRIEnv* env, jref obj, JRIFieldThunk* field, jdouble value);
  958.  
  959. /******************************************************************************/
  960.  
  961. JRI_PUBLIC_API(jref)
  962. JRI_GetStaticFieldByName(JRIEnv* env, jref obj, JRIFieldThunk* field);
  963.  
  964. JRI_PUBLIC_API(jbool)
  965. JRI_GetStaticFieldByName_boolean(JRIEnv* env, jref obj, JRIFieldThunk* field);
  966.  
  967. JRI_PUBLIC_API(jbyte)
  968. JRI_GetStaticFieldByName_byte(JRIEnv* env, jref obj, JRIFieldThunk* field);
  969.  
  970. JRI_PUBLIC_API(jchar)
  971. JRI_GetStaticFieldByName_char(JRIEnv* env, jref obj, JRIFieldThunk* field);
  972.  
  973. JRI_PUBLIC_API(jshort)
  974. JRI_GetStaticFieldByName_short(JRIEnv* env, jref obj, JRIFieldThunk* field);
  975.  
  976. JRI_PUBLIC_API(jint)
  977. JRI_GetStaticFieldByName_int(JRIEnv* env, jref obj, JRIFieldThunk* field);
  978.  
  979. JRI_PUBLIC_API(jlong)
  980. JRI_GetStaticFieldByName_long(JRIEnv* env, jref obj, JRIFieldThunk* field);
  981.  
  982. JRI_PUBLIC_API(jfloat)
  983. JRI_GetStaticFieldByName_float(JRIEnv* env, jref obj, JRIFieldThunk* field);
  984.  
  985. JRI_PUBLIC_API(jdouble)
  986. JRI_GetStaticFieldByName_double(JRIEnv* env, jref obj, JRIFieldThunk* field);
  987.  
  988. /******************************************************************************/
  989.  
  990. JRI_PUBLIC_API(void)
  991. JRI_SetStaticFieldByName(JRIEnv* env, jref obj, JRIFieldThunk* field, jref value);
  992.  
  993. JRI_PUBLIC_API(void)
  994. JRI_SetStaticFieldByName_boolean(JRIEnv* env, jref obj, JRIFieldThunk* field, jbool value);
  995.  
  996. JRI_PUBLIC_API(void)
  997. JRI_SetStaticFieldByName_byte(JRIEnv* env, jref obj, JRIFieldThunk* field, jbyte value);
  998.  
  999. JRI_PUBLIC_API(void)
  1000. JRI_SetStaticFieldByName_char(JRIEnv* env, jref obj, JRIFieldThunk* field, jchar value);
  1001.  
  1002. JRI_PUBLIC_API(void)
  1003. JRI_SetStaticFieldByName_short(JRIEnv* env, jref obj, JRIFieldThunk* field, jshort value);
  1004.  
  1005. JRI_PUBLIC_API(void)
  1006. JRI_SetStaticFieldByName_int(JRIEnv* env, jref obj, JRIFieldThunk* field, jint value);
  1007.  
  1008. JRI_PUBLIC_API(void)
  1009. JRI_SetStaticFieldByName_long(JRIEnv* env, jref obj, JRIFieldThunk* field, jlong value);
  1010.  
  1011. JRI_PUBLIC_API(void)
  1012. JRI_SetStaticFieldByName_float(JRIEnv* env, jref obj, JRIFieldThunk* field, jfloat value);
  1013.  
  1014. JRI_PUBLIC_API(void)
  1015. JRI_SetStaticFieldByName_double(JRIEnv* env, jref obj, JRIFieldThunk* field, jdouble value);
  1016.  
  1017. /******************************************************************************/
  1018. #ifdef __cplusplus
  1019. }
  1020. #endif
  1021. #endif /* JRI_H */
  1022. /******************************************************************************/
  1023.