前言

这里摘抄一下jni.h头文件中的所有内容,主要是方便自己查阅。

涉及的文件

  1. android-ndk-r21d-windows-x86_64\android-ndk-r21d\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\include\jni.h
复制

正文

  1. /*
  2. * Copyright (C) 2006 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *     http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /*
  17. * JNI specification, as defined by Sun:
  18. * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html
  19. *
  20. * Everything here is expected to be VM-neutral.
  21. */
  22. #ifndef LIBNATIVEHELPER_INCLUDE_JNI_JNI_H_
  23. #define LIBNATIVEHELPER_INCLUDE_JNI_JNI_H_
  24. #include <stdarg.h>
  25. #include <stdint.h>
  26. /* Primitive types that match up with Java equivalents. */
  27. typedef uint8_t jboolean; /* unsigned 8 bits */
  28. typedef int8_t   jbyte;   /* signed 8 bits */
  29. typedef uint16_t jchar;   /* unsigned 16 bits */
  30. typedef int16_t jshort;   /* signed 16 bits */
  31. typedef int32_t jint;     /* signed 32 bits */
  32. typedef int64_t jlong;   /* signed 64 bits */
  33. typedef float   jfloat;   /* 32-bit IEEE 754 */
  34. typedef double   jdouble; /* 64-bit IEEE 754 */
  35. /* "cardinal indices and sizes" */
  36. typedef jint     jsize;
  37. #ifdef __cplusplus
  38. /*
  39. * Reference types, in C++
  40. */
  41. class _jobject {};
  42. class _jclass : public _jobject {};
  43. class _jstring : public _jobject {};
  44. class _jarray : public _jobject {};
  45. class _jobjectArray : public _jarray {};
  46. class _jbooleanArray : public _jarray {};
  47. class _jbyteArray : public _jarray {};
  48. class _jcharArray : public _jarray {};
  49. class _jshortArray : public _jarray {};
  50. class _jintArray : public _jarray {};
  51. class _jlongArray : public _jarray {};
  52. class _jfloatArray : public _jarray {};
  53. class _jdoubleArray : public _jarray {};
  54. class _jthrowable : public _jobject {};
  55. typedef _jobject*       jobject;
  56. typedef _jclass*       jclass;
  57. typedef _jstring*       jstring;
  58. typedef _jarray*       jarray;
  59. typedef _jobjectArray* jobjectArray;
  60. typedef _jbooleanArray* jbooleanArray;
  61. typedef _jbyteArray*   jbyteArray;
  62. typedef _jcharArray*   jcharArray;
  63. typedef _jshortArray*   jshortArray;
  64. typedef _jintArray*     jintArray;
  65. typedef _jlongArray*   jlongArray;
  66. typedef _jfloatArray*   jfloatArray;
  67. typedef _jdoubleArray* jdoubleArray;
  68. typedef _jthrowable*   jthrowable;
  69. typedef _jobject*       jweak;
  70. #else /* not __cplusplus */
  71. /*
  72. * Reference types, in C.
  73. */
  74. typedef void*           jobject;
  75. typedef jobject         jclass;
  76. typedef jobject         jstring;
  77. typedef jobject         jarray;
  78. typedef jarray         jobjectArray;
  79. typedef jarray         jbooleanArray;
  80. typedef jarray         jbyteArray;
  81. typedef jarray         jcharArray;
  82. typedef jarray         jshortArray;
  83. typedef jarray         jintArray;
  84. typedef jarray         jlongArray;
  85. typedef jarray         jfloatArray;
  86. typedef jarray         jdoubleArray;
  87. typedef jobject         jthrowable;
  88. typedef jobject         jweak;
  89. #endif /* not __cplusplus */
  90. struct _jfieldID;                       /* opaque structure */
  91. typedef struct _jfieldID* jfieldID;     /* field IDs */
  92. struct _jmethodID;                     /* opaque structure */
  93. typedef struct _jmethodID* jmethodID;   /* method IDs */
  94. struct JNIInvokeInterface;
  95. typedef union jvalue {
  96.   jboolean   z;
  97.   jbyte       b;
  98.   jchar       c;
  99.   jshort     s;
  100.   jint       i;
  101.   jlong       j;
  102.   jfloat     f;
  103.   jdouble     d;
  104.   jobject     l;
  105. } jvalue;
  106. typedef enum jobjectRefType {
  107.   JNIInvalidRefType = 0,
  108.   JNILocalRefType = 1,
  109.   JNIGlobalRefType = 2,
  110.   JNIWeakGlobalRefType = 3
  111. } jobjectRefType;
  112. typedef struct {
  113.   const char* name;
  114.   const char* signature;
  115.   void*       fnPtr;
  116. } JNINativeMethod;
  117. struct _JNIEnv;
  118. struct _JavaVM;
  119. typedef const struct JNINativeInterface* C_JNIEnv;
  120. #if defined(__cplusplus)
  121. typedef _JNIEnv JNIEnv;
  122. typedef _JavaVM JavaVM;
  123. #else
  124. typedef const struct JNINativeInterface* JNIEnv;
  125. typedef const struct JNIInvokeInterface* JavaVM;
  126. #endif
  127. /*
  128. * Table of interface function pointers.
  129. */
  130. struct JNINativeInterface {
  131.   void*       reserved0;
  132.   void*       reserved1;
  133.   void*       reserved2;
  134.   void*       reserved3;
  135.   jint       (*GetVersion)(JNIEnv *);
  136.   jclass     (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*,
  137.                       jsize);
  138.   jclass     (*FindClass)(JNIEnv*, const char*);
  139.   jmethodID   (*FromReflectedMethod)(JNIEnv*, jobject);
  140.   jfieldID   (*FromReflectedField)(JNIEnv*, jobject);
  141.   /* spec doesn't show jboolean parameter */
  142.   jobject     (*ToReflectedMethod)(JNIEnv*, jclass, jmethodID, jboolean);
  143.   jclass     (*GetSuperclass)(JNIEnv*, jclass);
  144.   jboolean   (*IsAssignableFrom)(JNIEnv*, jclass, jclass);
  145.   /* spec doesn't show jboolean parameter */
  146.   jobject     (*ToReflectedField)(JNIEnv*, jclass, jfieldID, jboolean);
  147.   jint       (*Throw)(JNIEnv*, jthrowable);
  148.   jint       (*ThrowNew)(JNIEnv *, jclass, const char *);
  149.   jthrowable (*ExceptionOccurred)(JNIEnv*);
  150.   void       (*ExceptionDescribe)(JNIEnv*);
  151.   void       (*ExceptionClear)(JNIEnv*);
  152.   void       (*FatalError)(JNIEnv*, const char*);
  153.   jint       (*PushLocalFrame)(JNIEnv*, jint);
  154.   jobject     (*PopLocalFrame)(JNIEnv*, jobject);
  155.   jobject     (*NewGlobalRef)(JNIEnv*, jobject);
  156.   void       (*DeleteGlobalRef)(JNIEnv*, jobject);
  157.   void       (*DeleteLocalRef)(JNIEnv*, jobject);
  158.   jboolean   (*IsSameObject)(JNIEnv*, jobject, jobject);
  159.   jobject     (*NewLocalRef)(JNIEnv*, jobject);
  160.   jint       (*EnsureLocalCapacity)(JNIEnv*, jint);
  161.   jobject     (*AllocObject)(JNIEnv*, jclass);
  162.   jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);
  163.   jobject     (*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list);
  164.   jobject     (*NewObjectA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  165.   jclass     (*GetObjectClass)(JNIEnv*, jobject);
  166.   jboolean   (*IsInstanceOf)(JNIEnv*, jobject, jclass);
  167.   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
  168.   jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
  169.   jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  170.   jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  171.   jboolean   (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
  172.   jboolean   (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  173.   jboolean   (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  174.   jbyte       (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);
  175.   jbyte       (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  176.   jbyte       (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  177.   jchar       (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);
  178.   jchar       (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  179.   jchar       (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  180.   jshort     (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);
  181.   jshort     (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  182.   jshort     (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  183.   jint       (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
  184.   jint       (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  185.   jint       (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  186.   jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);
  187.   jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  188.   jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  189.   jfloat     (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...);
  190.   jfloat     (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  191.   jfloat     (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  192.   jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...);
  193.   jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  194.   jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  195.   void       (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
  196.   void       (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);
  197.   void       (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, const jvalue*);
  198.   jobject     (*CallNonvirtualObjectMethod)(JNIEnv*, jobject, jclass,
  199.                       jmethodID, ...);
  200.   jobject     (*CallNonvirtualObjectMethodV)(JNIEnv*, jobject, jclass,
  201.                       jmethodID, va_list);
  202.   jobject     (*CallNonvirtualObjectMethodA)(JNIEnv*, jobject, jclass,
  203.                       jmethodID, const jvalue*);
  204.   jboolean   (*CallNonvirtualBooleanMethod)(JNIEnv*, jobject, jclass,
  205.                       jmethodID, ...);
  206.   jboolean   (*CallNonvirtualBooleanMethodV)(JNIEnv*, jobject, jclass,
  207.                         jmethodID, va_list);
  208.   jboolean   (*CallNonvirtualBooleanMethodA)(JNIEnv*, jobject, jclass,
  209.                         jmethodID, const jvalue*);
  210.   jbyte       (*CallNonvirtualByteMethod)(JNIEnv*, jobject, jclass,
  211.                       jmethodID, ...);
  212.   jbyte       (*CallNonvirtualByteMethodV)(JNIEnv*, jobject, jclass,
  213.                       jmethodID, va_list);
  214.   jbyte       (*CallNonvirtualByteMethodA)(JNIEnv*, jobject, jclass,
  215.                       jmethodID, const jvalue*);
  216.   jchar       (*CallNonvirtualCharMethod)(JNIEnv*, jobject, jclass,
  217.                       jmethodID, ...);
  218.   jchar       (*CallNonvirtualCharMethodV)(JNIEnv*, jobject, jclass,
  219.                       jmethodID, va_list);
  220.   jchar       (*CallNonvirtualCharMethodA)(JNIEnv*, jobject, jclass,
  221.                       jmethodID, const jvalue*);
  222.   jshort     (*CallNonvirtualShortMethod)(JNIEnv*, jobject, jclass,
  223.                       jmethodID, ...);
  224.   jshort     (*CallNonvirtualShortMethodV)(JNIEnv*, jobject, jclass,
  225.                       jmethodID, va_list);
  226.   jshort     (*CallNonvirtualShortMethodA)(JNIEnv*, jobject, jclass,
  227.                       jmethodID, const jvalue*);
  228.   jint       (*CallNonvirtualIntMethod)(JNIEnv*, jobject, jclass,
  229.                       jmethodID, ...);
  230.   jint       (*CallNonvirtualIntMethodV)(JNIEnv*, jobject, jclass,
  231.                       jmethodID, va_list);
  232.   jint       (*CallNonvirtualIntMethodA)(JNIEnv*, jobject, jclass,
  233.                       jmethodID, const jvalue*);
  234.   jlong       (*CallNonvirtualLongMethod)(JNIEnv*, jobject, jclass,
  235.                       jmethodID, ...);
  236.   jlong       (*CallNonvirtualLongMethodV)(JNIEnv*, jobject, jclass,
  237.                       jmethodID, va_list);
  238.   jlong       (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,
  239.                       jmethodID, const jvalue*);
  240.   jfloat     (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,
  241.                       jmethodID, ...);
  242.   jfloat     (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,
  243.                       jmethodID, va_list);
  244.   jfloat     (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,
  245.                       jmethodID, const jvalue*);
  246.   jdouble     (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,
  247.                       jmethodID, ...);
  248.   jdouble     (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,
  249.                       jmethodID, va_list);
  250.   jdouble     (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,
  251.                       jmethodID, const jvalue*);
  252.   void       (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,
  253.                       jmethodID, ...);
  254.   void       (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,
  255.                       jmethodID, va_list);
  256.   void       (*CallNonvirtualVoidMethodA)(JNIEnv*, jobject, jclass,
  257.                       jmethodID, const jvalue*);
  258.   jfieldID   (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);
  259.   jobject     (*GetObjectField)(JNIEnv*, jobject, jfieldID);
  260.   jboolean   (*GetBooleanField)(JNIEnv*, jobject, jfieldID);
  261.   jbyte       (*GetByteField)(JNIEnv*, jobject, jfieldID);
  262.   jchar       (*GetCharField)(JNIEnv*, jobject, jfieldID);
  263.   jshort     (*GetShortField)(JNIEnv*, jobject, jfieldID);
  264.   jint       (*GetIntField)(JNIEnv*, jobject, jfieldID);
  265.   jlong       (*GetLongField)(JNIEnv*, jobject, jfieldID);
  266.   jfloat     (*GetFloatField)(JNIEnv*, jobject, jfieldID);
  267.   jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID);
  268.   void       (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);
  269.   void       (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);
  270.   void       (*SetByteField)(JNIEnv*, jobject, jfieldID, jbyte);
  271.   void       (*SetCharField)(JNIEnv*, jobject, jfieldID, jchar);
  272.   void       (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);
  273.   void       (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);
  274.   void       (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);
  275.   void       (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat);
  276.   void       (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble);
  277.   jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
  278.   jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);
  279.   jobject     (*CallStaticObjectMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  280.   jobject     (*CallStaticObjectMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  281.   jboolean   (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);
  282.   jboolean   (*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID,
  283.                       va_list);
  284.   jboolean   (*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  285.   jbyte       (*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...);
  286.   jbyte       (*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  287.   jbyte       (*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  288.   jchar       (*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...);
  289.   jchar       (*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  290.   jchar       (*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  291.   jshort     (*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...);
  292.   jshort     (*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  293.   jshort     (*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  294.   jint       (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);
  295.   jint       (*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  296.   jint       (*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  297.   jlong       (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);
  298.   jlong       (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  299.   jlong       (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  300.   jfloat     (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...);
  301.   jfloat     (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  302.   jfloat     (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  303.   jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...);
  304.   jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  305.   jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  306.   void       (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
  307.   void       (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);
  308.   void       (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, const jvalue*);
  309.   jfieldID   (*GetStaticFieldID)(JNIEnv*, jclass, const char*,
  310.                       const char*);
  311.   jobject     (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);
  312.   jboolean   (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);
  313.   jbyte       (*GetStaticByteField)(JNIEnv*, jclass, jfieldID);
  314.   jchar       (*GetStaticCharField)(JNIEnv*, jclass, jfieldID);
  315.   jshort     (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);
  316.   jint       (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);
  317.   jlong       (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);
  318.   jfloat     (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID);
  319.   jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID);
  320.   void       (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);
  321.   void       (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);
  322.   void       (*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte);
  323.   void       (*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar);
  324.   void       (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);
  325.   void       (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);
  326.   void       (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);
  327.   void       (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat);
  328.   void       (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble);
  329.   jstring     (*NewString)(JNIEnv*, const jchar*, jsize);
  330.   jsize       (*GetStringLength)(JNIEnv*, jstring);
  331.   const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);
  332.   void       (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
  333.   jstring     (*NewStringUTF)(JNIEnv*, const char*);
  334.   jsize       (*GetStringUTFLength)(JNIEnv*, jstring);
  335.   /* JNI spec says this returns const jbyte*, but that's inconsistent */
  336.   const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);
  337.   void       (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);
  338.   jsize       (*GetArrayLength)(JNIEnv*, jarray);
  339.   jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);
  340.   jobject     (*GetObjectArrayElement)(JNIEnv*, jobjectArray, jsize);
  341.   void       (*SetObjectArrayElement)(JNIEnv*, jobjectArray, jsize, jobject);
  342.   jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);
  343.   jbyteArray   (*NewByteArray)(JNIEnv*, jsize);
  344.   jcharArray   (*NewCharArray)(JNIEnv*, jsize);
  345.   jshortArray   (*NewShortArray)(JNIEnv*, jsize);
  346.   jintArray     (*NewIntArray)(JNIEnv*, jsize);
  347.   jlongArray   (*NewLongArray)(JNIEnv*, jsize);
  348.   jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);
  349.   jdoubleArray (*NewDoubleArray)(JNIEnv*, jsize);
  350.   jboolean*   (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);
  351.   jbyte*     (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);
  352.   jchar*     (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);
  353.   jshort*     (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);
  354.   jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
  355.   jlong*     (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);
  356.   jfloat*     (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);
  357.   jdouble*   (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);
  358.   void       (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,
  359.                       jboolean*, jint);
  360.   void       (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,
  361.                       jbyte*, jint);
  362.   void       (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,
  363.                       jchar*, jint);
  364.   void       (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,
  365.                       jshort*, jint);
  366.   void       (*ReleaseIntArrayElements)(JNIEnv*, jintArray,
  367.                       jint*, jint);
  368.   void       (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,
  369.                       jlong*, jint);
  370.   void       (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,
  371.                       jfloat*, jint);
  372.   void       (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,
  373.                       jdouble*, jint);
  374.   void       (*GetBooleanArrayRegion)(JNIEnv*, jbooleanArray,
  375.                       jsize, jsize, jboolean*);
  376.   void       (*GetByteArrayRegion)(JNIEnv*, jbyteArray,
  377.                       jsize, jsize, jbyte*);
  378.   void       (*GetCharArrayRegion)(JNIEnv*, jcharArray,
  379.                       jsize, jsize, jchar*);
  380.   void       (*GetShortArrayRegion)(JNIEnv*, jshortArray,
  381.                       jsize, jsize, jshort*);
  382.   void       (*GetIntArrayRegion)(JNIEnv*, jintArray,
  383.                       jsize, jsize, jint*);
  384.   void       (*GetLongArrayRegion)(JNIEnv*, jlongArray,
  385.                       jsize, jsize, jlong*);
  386.   void       (*GetFloatArrayRegion)(JNIEnv*, jfloatArray,
  387.                       jsize, jsize, jfloat*);
  388.   void       (*GetDoubleArrayRegion)(JNIEnv*, jdoubleArray,
  389.                       jsize, jsize, jdouble*);
  390.   /* spec shows these without const; some jni.h do, some don't */
  391.   void       (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,
  392.                       jsize, jsize, const jboolean*);
  393.   void       (*SetByteArrayRegion)(JNIEnv*, jbyteArray,
  394.                       jsize, jsize, const jbyte*);
  395.   void       (*SetCharArrayRegion)(JNIEnv*, jcharArray,
  396.                       jsize, jsize, const jchar*);
  397.   void       (*SetShortArrayRegion)(JNIEnv*, jshortArray,
  398.                       jsize, jsize, const jshort*);
  399.   void       (*SetIntArrayRegion)(JNIEnv*, jintArray,
  400.                       jsize, jsize, const jint*);
  401.   void       (*SetLongArrayRegion)(JNIEnv*, jlongArray,
  402.                       jsize, jsize, const jlong*);
  403.   void       (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,
  404.                       jsize, jsize, const jfloat*);
  405.   void       (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray,
  406.                       jsize, jsize, const jdouble*);
  407.   jint       (*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,
  408.                       jint);
  409.   jint       (*UnregisterNatives)(JNIEnv*, jclass);
  410.   jint       (*MonitorEnter)(JNIEnv*, jobject);
  411.   jint       (*MonitorExit)(JNIEnv*, jobject);
  412.   jint       (*GetJavaVM)(JNIEnv*, JavaVM**);
  413.   void       (*GetStringRegion)(JNIEnv*, jstring, jsize, jsize, jchar*);
  414.   void       (*GetStringUTFRegion)(JNIEnv*, jstring, jsize, jsize, char*);
  415.   void*       (*GetPrimitiveArrayCritical)(JNIEnv*, jarray, jboolean*);
  416.   void       (*ReleasePrimitiveArrayCritical)(JNIEnv*, jarray, void*, jint);
  417.   const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*);
  418.   void       (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*);
  419.   jweak       (*NewWeakGlobalRef)(JNIEnv*, jobject);
  420.   void       (*DeleteWeakGlobalRef)(JNIEnv*, jweak);
  421.   jboolean   (*ExceptionCheck)(JNIEnv*);
  422.   jobject     (*NewDirectByteBuffer)(JNIEnv*, void*, jlong);
  423.   void*       (*GetDirectBufferAddress)(JNIEnv*, jobject);
  424.   jlong       (*GetDirectBufferCapacity)(JNIEnv*, jobject);
  425.   /* added in JNI 1.6 */
  426.   jobjectRefType (*GetObjectRefType)(JNIEnv*, jobject);
  427. };
  428. /*
  429. * C++ object wrapper.
  430. *
  431. * This is usually overlaid on a C struct whose first element is a
  432. * JNINativeInterface*. We rely somewhat on compiler behavior.
  433. */
  434. struct _JNIEnv {
  435.   /* do not rename this; it does not seem to be entirely opaque */
  436.   const struct JNINativeInterface* functions;
  437. #if defined(__cplusplus)
  438.   jint GetVersion()
  439.   { return functions->GetVersion(this); }
  440.   jclass DefineClass(const char *name, jobject loader, const jbyte* buf,
  441.       jsize bufLen)
  442.   { return functions->DefineClass(this, name, loader, buf, bufLen); }
  443.   jclass FindClass(const char* name)
  444.   { return functions->FindClass(this, name); }
  445.   jmethodID FromReflectedMethod(jobject method)
  446.   { return functions->FromReflectedMethod(this, method); }
  447.   jfieldID FromReflectedField(jobject field)
  448.   { return functions->FromReflectedField(this, field); }
  449.   jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic)
  450.   { return functions->ToReflectedMethod(this, cls, methodID, isStatic); }
  451.   jclass GetSuperclass(jclass clazz)
  452.   { return functions->GetSuperclass(this, clazz); }
  453.   jboolean IsAssignableFrom(jclass clazz1, jclass clazz2)
  454.   { return functions->IsAssignableFrom(this, clazz1, clazz2); }
  455.   jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic)
  456.   { return functions->ToReflectedField(this, cls, fieldID, isStatic); }
  457.   jint Throw(jthrowable obj)
  458.   { return functions->Throw(this, obj); }
  459.   jint ThrowNew(jclass clazz, const char* message)
  460.   { return functions->ThrowNew(this, clazz, message); }
  461.   jthrowable ExceptionOccurred()
  462.   { return functions->ExceptionOccurred(this); }
  463.   void ExceptionDescribe()
  464.   { functions->ExceptionDescribe(this); }
  465.   void ExceptionClear()
  466.   { functions->ExceptionClear(this); }
  467.   void FatalError(const char* msg)
  468.   { functions->FatalError(this, msg); }
  469.   jint PushLocalFrame(jint capacity)
  470.   { return functions->PushLocalFrame(this, capacity); }
  471.   jobject PopLocalFrame(jobject result)
  472.   { return functions->PopLocalFrame(this, result); }
  473.   jobject NewGlobalRef(jobject obj)
  474.   { return functions->NewGlobalRef(this, obj); }
  475.   void DeleteGlobalRef(jobject globalRef)
  476.   { functions->DeleteGlobalRef(this, globalRef); }
  477.   void DeleteLocalRef(jobject localRef)
  478.   { functions->DeleteLocalRef(this, localRef); }
  479.   jboolean IsSameObject(jobject ref1, jobject ref2)
  480.   { return functions->IsSameObject(this, ref1, ref2); }
  481.   jobject NewLocalRef(jobject ref)
  482.   { return functions->NewLocalRef(this, ref); }
  483.   jint EnsureLocalCapacity(jint capacity)
  484.   { return functions->EnsureLocalCapacity(this, capacity); }
  485.   jobject AllocObject(jclass clazz)
  486.   { return functions->AllocObject(this, clazz); }
  487.   jobject NewObject(jclass clazz, jmethodID methodID, ...)
  488.   {
  489.       va_list args;
  490.       va_start(args, methodID);
  491.       jobject result = functions->NewObjectV(this, clazz, methodID, args);
  492.       va_end(args);
  493.       return result;
  494.   }
  495.   jobject NewObjectV(jclass clazz, jmethodID methodID, va_list args)
  496.   { return functions->NewObjectV(this, clazz, methodID, args); }
  497.   jobject NewObjectA(jclass clazz, jmethodID methodID, const jvalue* args)
  498.   { return functions->NewObjectA(this, clazz, methodID, args); }
  499.   jclass GetObjectClass(jobject obj)
  500.   { return functions->GetObjectClass(this, obj); }
  501.   jboolean IsInstanceOf(jobject obj, jclass clazz)
  502.   { return functions->IsInstanceOf(this, obj, clazz); }
  503.   jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
  504.   { return functions->GetMethodID(this, clazz, name, sig); }
  505. #define CALL_TYPE_METHOD(_jtype, _jname)                                   \
  506.   _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)       \
  507.   {                                                                       \
  508.       _jtype result;                                                     \
  509.       va_list args;                                                       \
  510.       va_start(args, methodID);                                           \
  511.       result = functions->Call##_jname##MethodV(this, obj, methodID,     \
  512.                   args);                                                 \
  513.       va_end(args);                                                       \
  514.       return result;                                                     \
  515.   }
  516. #define CALL_TYPE_METHODV(_jtype, _jname)                                   \
  517.   _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,           \
  518.       va_list args)                                                       \
  519.   { return functions->Call##_jname##MethodV(this, obj, methodID, args); }
  520. #define CALL_TYPE_METHODA(_jtype, _jname)                                   \
  521.   _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID,           \
  522.                                 const jvalue* args)                       \
  523.   { return functions->Call##_jname##MethodA(this, obj, methodID, args); }
  524. #define CALL_TYPE(_jtype, _jname)                                           \
  525.   CALL_TYPE_METHOD(_jtype, _jname)                                       \
  526.   CALL_TYPE_METHODV(_jtype, _jname)                                       \
  527.   CALL_TYPE_METHODA(_jtype, _jname)
  528.   CALL_TYPE(jobject, Object)
  529.   CALL_TYPE(jboolean, Boolean)
  530.   CALL_TYPE(jbyte, Byte)
  531.   CALL_TYPE(jchar, Char)
  532.   CALL_TYPE(jshort, Short)
  533.   CALL_TYPE(jint, Int)
  534.   CALL_TYPE(jlong, Long)
  535.   CALL_TYPE(jfloat, Float)
  536.   CALL_TYPE(jdouble, Double)
  537.   void CallVoidMethod(jobject obj, jmethodID methodID, ...)
  538.   {
  539.       va_list args;
  540.       va_start(args, methodID);
  541.       functions->CallVoidMethodV(this, obj, methodID, args);
  542.       va_end(args);
  543.   }
  544.   void CallVoidMethodV(jobject obj, jmethodID methodID, va_list args)
  545.   { functions->CallVoidMethodV(this, obj, methodID, args); }
  546.   void CallVoidMethodA(jobject obj, jmethodID methodID, const jvalue* args)
  547.   { functions->CallVoidMethodA(this, obj, methodID, args); }
  548. #define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                           \
  549.   _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz,       \
  550.       jmethodID methodID, ...)                                           \
  551.   {                                                                       \
  552.       _jtype result;                                                     \
  553.       va_list args;                                                       \
  554.       va_start(args, methodID);                                           \
  555.       result = functions->CallNonvirtual##_jname##MethodV(this, obj,     \
  556.                   clazz, methodID, args);                                 \
  557.       va_end(args);                                                       \
  558.       return result;                                                     \
  559.   }
  560. #define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                           \
  561.   _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz,       \
  562.       jmethodID methodID, va_list args)                                   \
  563.   { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz,   \
  564.       methodID, args); }
  565. #define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)                           \
  566.   _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz,       \
  567.       jmethodID methodID, const jvalue* args)                             \
  568.   { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz,   \
  569.       methodID, args); }
  570. #define CALL_NONVIRT_TYPE(_jtype, _jname)                                   \
  571.   CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                               \
  572.   CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                               \
  573.   CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)
  574.   CALL_NONVIRT_TYPE(jobject, Object)
  575.   CALL_NONVIRT_TYPE(jboolean, Boolean)
  576.   CALL_NONVIRT_TYPE(jbyte, Byte)
  577.   CALL_NONVIRT_TYPE(jchar, Char)
  578.   CALL_NONVIRT_TYPE(jshort, Short)
  579.   CALL_NONVIRT_TYPE(jint, Int)
  580.   CALL_NONVIRT_TYPE(jlong, Long)
  581.   CALL_NONVIRT_TYPE(jfloat, Float)
  582.   CALL_NONVIRT_TYPE(jdouble, Double)
  583.   void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
  584.       jmethodID methodID, ...)
  585.   {
  586.       va_list args;
  587.       va_start(args, methodID);
  588.       functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args);
  589.       va_end(args);
  590.   }
  591.   void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
  592.       jmethodID methodID, va_list args)
  593.   { functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); }
  594.   void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
  595.       jmethodID methodID, const jvalue* args)
  596.   { functions->CallNonvirtualVoidMethodA(this, obj, clazz, methodID, args); }
  597.   jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)
  598.   { return functions->GetFieldID(this, clazz, name, sig); }
  599.   jobject GetObjectField(jobject obj, jfieldID fieldID)
  600.   { return functions->GetObjectField(this, obj, fieldID); }
  601.   jboolean GetBooleanField(jobject obj, jfieldID fieldID)
  602.   { return functions->GetBooleanField(this, obj, fieldID); }
  603.   jbyte GetByteField(jobject obj, jfieldID fieldID)
  604.   { return functions->GetByteField(this, obj, fieldID); }
  605.   jchar GetCharField(jobject obj, jfieldID fieldID)
  606.   { return functions->GetCharField(this, obj, fieldID); }
  607.   jshort GetShortField(jobject obj, jfieldID fieldID)
  608.   { return functions->GetShortField(this, obj, fieldID); }
  609.   jint GetIntField(jobject obj, jfieldID fieldID)
  610.   { return functions->GetIntField(this, obj, fieldID); }
  611.   jlong GetLongField(jobject obj, jfieldID fieldID)
  612.   { return functions->GetLongField(this, obj, fieldID); }
  613.   jfloat GetFloatField(jobject obj, jfieldID fieldID)
  614.   { return functions->GetFloatField(this, obj, fieldID); }
  615.   jdouble GetDoubleField(jobject obj, jfieldID fieldID)
  616.   { return functions->GetDoubleField(this, obj, fieldID); }
  617.   void SetObjectField(jobject obj, jfieldID fieldID, jobject value)
  618.   { functions->SetObjectField(this, obj, fieldID, value); }
  619.   void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value)
  620.   { functions->SetBooleanField(this, obj, fieldID, value); }
  621.   void SetByteField(jobject obj, jfieldID fieldID, jbyte value)
  622.   { functions->SetByteField(this, obj, fieldID, value); }
  623.   void SetCharField(jobject obj, jfieldID fieldID, jchar value)
  624.   { functions->SetCharField(this, obj, fieldID, value); }
  625.   void SetShortField(jobject obj, jfieldID fieldID, jshort value)
  626.   { functions->SetShortField(this, obj, fieldID, value); }
  627.   void SetIntField(jobject obj, jfieldID fieldID, jint value)
  628.   { functions->SetIntField(this, obj, fieldID, value); }
  629.   void SetLongField(jobject obj, jfieldID fieldID, jlong value)
  630.   { functions->SetLongField(this, obj, fieldID, value); }
  631.   void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)
  632.   { functions->SetFloatField(this, obj, fieldID, value); }
  633.   void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)
  634.   { functions->SetDoubleField(this, obj, fieldID, value); }
  635.   jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)
  636.   { return functions->GetStaticMethodID(this, clazz, name, sig); }
  637. #define CALL_STATIC_TYPE_METHOD(_jtype, _jname)                             \
  638.   _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID,     \
  639.       ...)                                                               \
  640.   {                                                                       \
  641.       _jtype result;                                                     \
  642.       va_list args;                                                       \
  643.       va_start(args, methodID);                                           \
  644.       result = functions->CallStatic##_jname##MethodV(this, clazz,       \
  645.                   methodID, args);                                       \
  646.       va_end(args);                                                       \
  647.       return result;                                                     \
  648.   }
  649. #define CALL_STATIC_TYPE_METHODV(_jtype, _jname)                           \
  650.   _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID,   \
  651.       va_list args)                                                       \
  652.   { return functions->CallStatic##_jname##MethodV(this, clazz, methodID, \
  653.       args); }
  654. #define CALL_STATIC_TYPE_METHODA(_jtype, _jname)                           \
  655.   _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID,   \
  656.                                       const jvalue* args)                 \
  657.   { return functions->CallStatic##_jname##MethodA(this, clazz, methodID, \
  658.       args); }
  659. #define CALL_STATIC_TYPE(_jtype, _jname)                                   \
  660.   CALL_STATIC_TYPE_METHOD(_jtype, _jname)                                 \
  661.   CALL_STATIC_TYPE_METHODV(_jtype, _jname)                               \
  662.   CALL_STATIC_TYPE_METHODA(_jtype, _jname)
  663.   CALL_STATIC_TYPE(jobject, Object)
  664.   CALL_STATIC_TYPE(jboolean, Boolean)
  665.   CALL_STATIC_TYPE(jbyte, Byte)
  666.   CALL_STATIC_TYPE(jchar, Char)
  667.   CALL_STATIC_TYPE(jshort, Short)
  668.   CALL_STATIC_TYPE(jint, Int)
  669.   CALL_STATIC_TYPE(jlong, Long)
  670.   CALL_STATIC_TYPE(jfloat, Float)
  671.   CALL_STATIC_TYPE(jdouble, Double)
  672.   void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...)
  673.   {
  674.       va_list args;
  675.       va_start(args, methodID);
  676.       functions->CallStaticVoidMethodV(this, clazz, methodID, args);
  677.       va_end(args);
  678.   }
  679.   void CallStaticVoidMethodV(jclass clazz, jmethodID methodID, va_list args)
  680.   { functions->CallStaticVoidMethodV(this, clazz, methodID, args); }
  681.   void CallStaticVoidMethodA(jclass clazz, jmethodID methodID, const jvalue* args)
  682.   { functions->CallStaticVoidMethodA(this, clazz, methodID, args); }
  683.   jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)
  684.   { return functions->GetStaticFieldID(this, clazz, name, sig); }
  685.   jobject GetStaticObjectField(jclass clazz, jfieldID fieldID)
  686.   { return functions->GetStaticObjectField(this, clazz, fieldID); }
  687.   jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID)
  688.   { return functions->GetStaticBooleanField(this, clazz, fieldID); }
  689.   jbyte GetStaticByteField(jclass clazz, jfieldID fieldID)
  690.   { return functions->GetStaticByteField(this, clazz, fieldID); }
  691.   jchar GetStaticCharField(jclass clazz, jfieldID fieldID)
  692.   { return functions->GetStaticCharField(this, clazz, fieldID); }
  693.   jshort GetStaticShortField(jclass clazz, jfieldID fieldID)
  694.   { return functions->GetStaticShortField(this, clazz, fieldID); }
  695.   jint GetStaticIntField(jclass clazz, jfieldID fieldID)
  696.   { return functions->GetStaticIntField(this, clazz, fieldID); }
  697.   jlong GetStaticLongField(jclass clazz, jfieldID fieldID)
  698.   { return functions->GetStaticLongField(this, clazz, fieldID); }
  699.   jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)
  700.   { return functions->GetStaticFloatField(this, clazz, fieldID); }
  701.   jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)
  702.   { return functions->GetStaticDoubleField(this, clazz, fieldID); }
  703.   void SetStaticObjectField(jclass clazz, jfieldID fieldID, jobject value)
  704.   { functions->SetStaticObjectField(this, clazz, fieldID, value); }
  705.   void SetStaticBooleanField(jclass clazz, jfieldID fieldID, jboolean value)
  706.   { functions->SetStaticBooleanField(this, clazz, fieldID, value); }
  707.   void SetStaticByteField(jclass clazz, jfieldID fieldID, jbyte value)
  708.   { functions->SetStaticByteField(this, clazz, fieldID, value); }
  709.   void SetStaticCharField(jclass clazz, jfieldID fieldID, jchar value)
  710.   { functions->SetStaticCharField(this, clazz, fieldID, value); }
  711.   void SetStaticShortField(jclass clazz, jfieldID fieldID, jshort value)
  712.   { functions->SetStaticShortField(this, clazz, fieldID, value); }
  713.   void SetStaticIntField(jclass clazz, jfieldID fieldID, jint value)
  714.   { functions->SetStaticIntField(this, clazz, fieldID, value); }
  715.   void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)
  716.   { functions->SetStaticLongField(this, clazz, fieldID, value); }
  717.   void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)
  718.   { functions->SetStaticFloatField(this, clazz, fieldID, value); }
  719.   void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)
  720.   { functions->SetStaticDoubleField(this, clazz, fieldID, value); }
  721.   jstring NewString(const jchar* unicodeChars, jsize len)
  722.   { return functions->NewString(this, unicodeChars, len); }
  723.   jsize GetStringLength(jstring string)
  724.   { return functions->GetStringLength(this, string); }
  725.   const jchar* GetStringChars(jstring string, jboolean* isCopy)
  726.   { return functions->GetStringChars(this, string, isCopy); }
  727.   void ReleaseStringChars(jstring string, const jchar* chars)
  728.   { functions->ReleaseStringChars(this, string, chars); }
  729.   jstring NewStringUTF(const char* bytes)
  730.   { return functions->NewStringUTF(this, bytes); }
  731.   jsize GetStringUTFLength(jstring string)
  732.   { return functions->GetStringUTFLength(this, string); }
  733.   const char* GetStringUTFChars(jstring string, jboolean* isCopy)
  734.   { return functions->GetStringUTFChars(this, string, isCopy); }
  735.   void ReleaseStringUTFChars(jstring string, const char* utf)
  736.   { functions->ReleaseStringUTFChars(this, string, utf); }
  737.   jsize GetArrayLength(jarray array)
  738.   { return functions->GetArrayLength(this, array); }
  739.   jobjectArray NewObjectArray(jsize length, jclass elementClass,
  740.       jobject initialElement)
  741.   { return functions->NewObjectArray(this, length, elementClass,
  742.       initialElement); }
  743.   jobject GetObjectArrayElement(jobjectArray array, jsize index)
  744.   { return functions->GetObjectArrayElement(this, array, index); }
  745.   void SetObjectArrayElement(jobjectArray array, jsize index, jobject value)
  746.   { functions->SetObjectArrayElement(this, array, index, value); }
  747.   jbooleanArray NewBooleanArray(jsize length)
  748.   { return functions->NewBooleanArray(this, length); }
  749.   jbyteArray NewByteArray(jsize length)
  750.   { return functions->NewByteArray(this, length); }
  751.   jcharArray NewCharArray(jsize length)
  752.   { return functions->NewCharArray(this, length); }
  753.   jshortArray NewShortArray(jsize length)
  754.   { return functions->NewShortArray(this, length); }
  755.   jintArray NewIntArray(jsize length)
  756.   { return functions->NewIntArray(this, length); }
  757.   jlongArray NewLongArray(jsize length)
  758.   { return functions->NewLongArray(this, length); }
  759.   jfloatArray NewFloatArray(jsize length)
  760.   { return functions->NewFloatArray(this, length); }
  761.   jdoubleArray NewDoubleArray(jsize length)
  762.   { return functions->NewDoubleArray(this, length); }
  763.   jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy)
  764.   { return functions->GetBooleanArrayElements(this, array, isCopy); }
  765.   jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy)
  766.   { return functions->GetByteArrayElements(this, array, isCopy); }
  767.   jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)
  768.   { return functions->GetCharArrayElements(this, array, isCopy); }
  769.   jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy)
  770.   { return functions->GetShortArrayElements(this, array, isCopy); }
  771.   jint* GetIntArrayElements(jintArray array, jboolean* isCopy)
  772.   { return functions->GetIntArrayElements(this, array, isCopy); }
  773.   jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy)
  774.   { return functions->GetLongArrayElements(this, array, isCopy); }
  775.   jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy)
  776.   { return functions->GetFloatArrayElements(this, array, isCopy); }
  777.   jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy)
  778.   { return functions->GetDoubleArrayElements(this, array, isCopy); }
  779.   void ReleaseBooleanArrayElements(jbooleanArray array, jboolean* elems,
  780.       jint mode)
  781.   { functions->ReleaseBooleanArrayElements(this, array, elems, mode); }
  782.   void ReleaseByteArrayElements(jbyteArray array, jbyte* elems,
  783.       jint mode)
  784.   { functions->ReleaseByteArrayElements(this, array, elems, mode); }
  785.   void ReleaseCharArrayElements(jcharArray array, jchar* elems,
  786.       jint mode)
  787.   { functions->ReleaseCharArrayElements(this, array, elems, mode); }
  788.   void ReleaseShortArrayElements(jshortArray array, jshort* elems,
  789.       jint mode)
  790.   { functions->ReleaseShortArrayElements(this, array, elems, mode); }
  791.   void ReleaseIntArrayElements(jintArray array, jint* elems,
  792.       jint mode)
  793.   { functions->ReleaseIntArrayElements(this, array, elems, mode); }
  794.   void ReleaseLongArrayElements(jlongArray array, jlong* elems,
  795.       jint mode)
  796.   { functions->ReleaseLongArrayElements(this, array, elems, mode); }
  797.   void ReleaseFloatArrayElements(jfloatArray array, jfloat* elems,
  798.       jint mode)
  799.   { functions->ReleaseFloatArrayElements(this, array, elems, mode); }
  800.   void ReleaseDoubleArrayElements(jdoubleArray array, jdouble* elems,
  801.       jint mode)
  802.   { functions->ReleaseDoubleArrayElements(this, array, elems, mode); }
  803.   void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
  804.       jboolean* buf)
  805.   { functions->GetBooleanArrayRegion(this, array, start, len, buf); }
  806.   void GetByteArrayRegion(jbyteArray array, jsize start, jsize len,
  807.       jbyte* buf)
  808.   { functions->GetByteArrayRegion(this, array, start, len, buf); }
  809.   void GetCharArrayRegion(jcharArray array, jsize start, jsize len,
  810.       jchar* buf)
  811.   { functions->GetCharArrayRegion(this, array, start, len, buf); }
  812.   void GetShortArrayRegion(jshortArray array, jsize start, jsize len,
  813.       jshort* buf)
  814.   { functions->GetShortArrayRegion(this, array, start, len, buf); }
  815.   void GetIntArrayRegion(jintArray array, jsize start, jsize len,
  816.       jint* buf)
  817.   { functions->GetIntArrayRegion(this, array, start, len, buf); }
  818.   void GetLongArrayRegion(jlongArray array, jsize start, jsize len,
  819.       jlong* buf)
  820.   { functions->GetLongArrayRegion(this, array, start, len, buf); }
  821.   void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
  822.       jfloat* buf)
  823.   { functions->GetFloatArrayRegion(this, array, start, len, buf); }
  824.   void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
  825.       jdouble* buf)
  826.   { functions->GetDoubleArrayRegion(this, array, start, len, buf); }
  827.   void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
  828.       const jboolean* buf)
  829.   { functions->SetBooleanArrayRegion(this, array, start, len, buf); }
  830.   void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
  831.       const jbyte* buf)
  832.   { functions->SetByteArrayRegion(this, array, start, len, buf); }
  833.   void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
  834.       const jchar* buf)
  835.   { functions->SetCharArrayRegion(this, array, start, len, buf); }
  836.   void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
  837.       const jshort* buf)
  838.   { functions->SetShortArrayRegion(this, array, start, len, buf); }
  839.   void SetIntArrayRegion(jintArray array, jsize start, jsize len,
  840.       const jint* buf)
  841.   { functions->SetIntArrayRegion(this, array, start, len, buf); }
  842.   void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
  843.       const jlong* buf)
  844.   { functions->SetLongArrayRegion(this, array, start, len, buf); }
  845.   void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
  846.       const jfloat* buf)
  847.   { functions->SetFloatArrayRegion(this, array, start, len, buf); }
  848.   void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
  849.       const jdouble* buf)
  850.   { functions->SetDoubleArrayRegion(this, array, start, len, buf); }
  851.   jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,
  852.       jint nMethods)
  853.   { return functions->RegisterNatives(this, clazz, methods, nMethods); }
  854.   jint UnregisterNatives(jclass clazz)
  855.   { return functions->UnregisterNatives(this, clazz); }
  856.   jint MonitorEnter(jobject obj)
  857.   { return functions->MonitorEnter(this, obj); }
  858.   jint MonitorExit(jobject obj)
  859.   { return functions->MonitorExit(this, obj); }
  860.   jint GetJavaVM(JavaVM** vm)
  861.   { return functions->GetJavaVM(this, vm); }
  862.   void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)
  863.   { functions->GetStringRegion(this, str, start, len, buf); }
  864.   void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)
  865.   { return functions->GetStringUTFRegion(this, str, start, len, buf); }
  866.   void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy)
  867.   { return functions->GetPrimitiveArrayCritical(this, array, isCopy); }
  868.   void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode)
  869.   { functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); }
  870.   const jchar* GetStringCritical(jstring string, jboolean* isCopy)
  871.   { return functions->GetStringCritical(this, string, isCopy); }
  872.   void ReleaseStringCritical(jstring string, const jchar* carray)
  873.   { functions->ReleaseStringCritical(this, string, carray); }
  874.   jweak NewWeakGlobalRef(jobject obj)
  875.   { return functions->NewWeakGlobalRef(this, obj); }
  876.   void DeleteWeakGlobalRef(jweak obj)
  877.   { functions->DeleteWeakGlobalRef(this, obj); }
  878.   jboolean ExceptionCheck()
  879.   { return functions->ExceptionCheck(this); }
  880.   jobject NewDirectByteBuffer(void* address, jlong capacity)
  881.   { return functions->NewDirectByteBuffer(this, address, capacity); }
  882.   void* GetDirectBufferAddress(jobject buf)
  883.   { return functions->GetDirectBufferAddress(this, buf); }
  884.   jlong GetDirectBufferCapacity(jobject buf)
  885.   { return functions->GetDirectBufferCapacity(this, buf); }
  886.   /* added in JNI 1.6 */
  887.   jobjectRefType GetObjectRefType(jobject obj)
  888.   { return functions->GetObjectRefType(this, obj); }
  889. #endif /*__cplusplus*/
  890. };
  891. /*
  892. * JNI invocation interface.
  893. */
  894. struct JNIInvokeInterface {
  895.   void*       reserved0;
  896.   void*       reserved1;
  897.   void*       reserved2;
  898.   jint       (*DestroyJavaVM)(JavaVM*);
  899.   jint       (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);
  900.   jint       (*DetachCurrentThread)(JavaVM*);
  901.   jint       (*GetEnv)(JavaVM*, void**, jint);
  902.   jint       (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*);
  903. };
  904. /*
  905. * C++ version.
  906. */
  907. struct _JavaVM {
  908.   const struct JNIInvokeInterface* functions;
  909. #if defined(__cplusplus)
  910.   jint DestroyJavaVM()
  911.   { return functions->DestroyJavaVM(this); }
  912.   jint AttachCurrentThread(JNIEnv** p_env, void* thr_args)
  913.   { return functions->AttachCurrentThread(this, p_env, thr_args); }
  914.   jint DetachCurrentThread()
  915.   { return functions->DetachCurrentThread(this); }
  916.   jint GetEnv(void** env, jint version)
  917.   { return functions->GetEnv(this, env, version); }
  918.   jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args)
  919.   { return functions->AttachCurrentThreadAsDaemon(this, p_env, thr_args); }
  920. #endif /*__cplusplus*/
  921. };
  922. struct JavaVMAttachArgs {
  923.   jint       version;   /* must be >= JNI_VERSION_1_2 */
  924.   const char* name;       /* NULL or name of thread as modified UTF-8 str */
  925.   jobject     group;     /* global ref of a ThreadGroup object, or NULL */
  926. };
  927. typedef struct JavaVMAttachArgs JavaVMAttachArgs;
  928. /*
  929. * JNI 1.2+ initialization. (As of 1.6, the pre-1.2 structures are no
  930. * longer supported.)
  931. */
  932. typedef struct JavaVMOption {
  933.   const char* optionString;
  934.   void*       extraInfo;
  935. } JavaVMOption;
  936. typedef struct JavaVMInitArgs {
  937.   jint       version;   /* use JNI_VERSION_1_2 or later */
  938.   jint       nOptions;
  939.   JavaVMOption* options;
  940.   jboolean   ignoreUnrecognized;
  941. } JavaVMInitArgs;
  942. #ifdef __cplusplus
  943. extern "C" {
  944. #endif
  945. /*
  946. * VM initialization functions.
  947. *
  948. * Note these are the only symbols exported for JNI by the VM.
  949. */
  950. jint JNI_GetDefaultJavaVMInitArgs(void*);
  951. jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
  952. jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
  953. #define JNIIMPORT
  954. #define JNIEXPORT __attribute__ ((visibility ("default")))
  955. #define JNICALL
  956. /*
  957. * Prototypes for functions exported by loadable shared libs. These are
  958. * called by JNI, not provided by JNI.
  959. */
  960. JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
  961. JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);
  962. #ifdef __cplusplus
  963. }
  964. #endif
  965. /*
  966. * Manifest constants.
  967. */
  968. #define JNI_FALSE   0
  969. #define JNI_TRUE   1
  970. #define JNI_VERSION_1_1 0x00010001
  971. #define JNI_VERSION_1_2 0x00010002
  972. #define JNI_VERSION_1_4 0x00010004
  973. #define JNI_VERSION_1_6 0x00010006
  974. #define JNI_OK         (0)         /* no error */
  975. #define JNI_ERR         (-1)       /* generic error */
  976. #define JNI_EDETACHED   (-2)       /* thread detached from the VM */
  977. #define JNI_EVERSION   (-3)       /* JNI version error */
  978. #define JNI_ENOMEM     (-4)       /* Out of memory */
  979. #define JNI_EEXIST     (-5)       /* VM already created */
  980. #define JNI_EINVAL     (-6)       /* Invalid argument */
  981. #define JNI_COMMIT     1           /* copy content, do not free buffer */
  982. #define JNI_ABORT       2           /* free buffer w/o copying back */
  983. #endif // LIBNATIVEHELPER_INCLUDE_JNI_JNI_H_
复制

参考文章

 

相关文章

暂无评论

none
暂无评论...