jni.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:13k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2003, 2004, 2005, 2006, 2007
  3.  * Robert Lougher <rob@lougher.org.uk>.
  4.  *
  5.  * This file is part of JamVM.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version 2,
  10.  * or (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  20.  */
  21. #ifndef __JNI_H__
  22. #define __JNI_H__
  23. #include <stdio.h>
  24. #include <stdarg.h>
  25. #define JNI_VERSION_1_1 0x00010001
  26. #define JNI_VERSION_1_2 0x00010002
  27. #define JNI_VERSION_1_4 0x00010004
  28. #define JNI_FALSE 0
  29. #define JNI_TRUE 1
  30. #define JNI_OK 0
  31. #define JNI_ERR (-1)
  32. #define JNI_EDETACHED (-2)
  33. #define JNI_EVERSION (-3)
  34. #define JNI_COMMIT 1
  35. #define JNI_ABORT 2
  36. #define JNIEXPORT
  37. #define JNICALL
  38. typedef int             jint;
  39. typedef long long       jlong;
  40. typedef signed char     jbyte;   
  41. typedef unsigned char   jboolean;
  42. typedef unsigned short  jchar;
  43. typedef short           jshort;
  44. typedef float           jfloat;
  45. typedef double          jdouble;
  46. typedef jint            jsize;
  47. typedef void *jobject;
  48. typedef jobject jclass;
  49. typedef jobject jthrowable;
  50. typedef jobject jstring;
  51. typedef jobject jarray;
  52. typedef jarray jbooleanArray;
  53. typedef jarray jbyteArray;
  54. typedef jarray jcharArray;
  55. typedef jarray jshortArray;
  56. typedef jarray jintArray;
  57. typedef jarray jlongArray;
  58. typedef jarray jfloatArray;
  59. typedef jarray jdoubleArray;
  60. typedef jarray jobjectArray;
  61. typedef jobject jweak;
  62. typedef union jvalue {
  63.     jboolean z;
  64.     jbyte    b;
  65.     jchar    c;
  66.     jshort   s;
  67.     jint     i;
  68.     jlong    j;
  69.     jfloat   f;
  70.     jdouble  d;
  71.     jobject  l;
  72. } jvalue;
  73. typedef struct {
  74.     char *name;
  75.     char *signature;
  76.     void *fnPtr;
  77. } JNINativeMethod;
  78. typedef void *jfieldID;
  79. typedef void *jmethodID;
  80. struct _JNINativeInterface;
  81. typedef const struct _JNINativeInterface *JNIEnv;
  82. struct _JNIInvokeInterface;
  83. typedef const struct _JNIInvokeInterface *JavaVM;
  84. #define VIRTUAL_METHOD(type, native_type)                                                   
  85. native_type (*Call##type##Method)(JNIEnv *env, jobject obj, jmethodID mID, ...);            
  86. native_type (*Call##type##MethodV)(JNIEnv *env, jobject obj, jmethodID mID, va_list jargs); 
  87. native_type (*Call##type##MethodA)(JNIEnv *env, jobject obj, jmethodID mID, jvalue *jargs);
  88. #define NONVIRTUAL_METHOD(type, native_type)                                                
  89. native_type (*CallNonvirtual##type##Method)(JNIEnv *env, jobject obj, jclass clazz,         
  90.                 jmethodID methodID, ...);                                                   
  91. native_type (*CallNonvirtual##type##MethodV)(JNIEnv *env, jobject obj, jclass clazz,        
  92.                 jmethodID methodID, va_list jargs);                                         
  93. native_type (*CallNonvirtual##type##MethodA)(JNIEnv *env, jobject obj, jclass clazz,        
  94.                 jmethodID methodID, jvalue *jargs);
  95. #define STATIC_METHOD(type, native_type)                                                    
  96. native_type (*CallStatic##type##Method)(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
  97. native_type (*CallStatic##type##MethodV)(JNIEnv *env, jclass clazz, jmethodID methodID,     
  98.                 va_list jargs);                                                             
  99. native_type (*CallStatic##type##MethodA)(JNIEnv *env, jclass clazz, jmethodID methodID,     
  100.                 jvalue *jargs);
  101. #define VOID_VIRTUAL_METHOD                                                                 
  102. void (*CallVoidMethod)(JNIEnv *env, jobject obj, jmethodID methodID, ...);                  
  103. void (*CallVoidMethodV)(JNIEnv *env, jobject obj, jmethodID methodID, va_list jargs);       
  104. void (*CallVoidMethodA)(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *jargs);       
  105. #define VOID_NONVIRTUAL_METHOD                                                              
  106. void (*CallNonvirtualVoidMethod)(JNIEnv *env, jobject obj, jclass clazz,                    
  107.                 jmethodID methodID, ...);                                                   
  108. void (*CallNonvirtualVoidMethodV)(JNIEnv *env, jobject obj, jclass clazz,                   
  109.                 jmethodID methodID, va_list jargs);                                         
  110. void (*CallNonvirtualVoidMethodA)(JNIEnv *env, jobject obj, jclass clazz,                   
  111.                 jmethodID methodID, jvalue *jargs);
  112. #define VOID_STATIC_METHOD                                                                  
  113. void (*CallStaticVoidMethod)(JNIEnv *env, jclass clazz, jmethodID methodID, ...);           
  114. void (*CallStaticVoidMethodV)(JNIEnv *env, jclass clazz, jmethodID methodID, va_list jargs);
  115. void (*CallStaticVoidMethodA)(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *jargs);
  116. #define CALL_METHOD(access)         
  117. access##_METHOD(Object, jobject);   
  118. access##_METHOD(Boolean, jboolean); 
  119. access##_METHOD(Byte, jbyte);       
  120. access##_METHOD(Char, jchar);       
  121. access##_METHOD(Short, jshort);     
  122. access##_METHOD(Int, jint);         
  123. access##_METHOD(Long, jlong);       
  124. access##_METHOD(Float, jfloat);     
  125. access##_METHOD(Double, jdouble);   
  126. VOID_##access##_METHOD;
  127. #define NEW_PRIM_ARRAY(type, native_type, array_type) 
  128. native_type##Array (*New##type##Array)(JNIEnv *env, jsize length);
  129. #define GET_ELEMENTS_PRIM_ARRAY(type, native_type, array_type) 
  130. native_type *(*Get##type##ArrayElements)(JNIEnv *env, native_type##Array array, jboolean *isCopy);
  131. #define RELEASE_ELEMENTS_PRIM_ARRAY(type, native_type, array_type) 
  132. void (*Release##type##ArrayElements)(JNIEnv *env, native_type##Array array, native_type *elems, jint mode);
  133. #define GET_REGION_PRIM_ARRAY(type, native_type, array_type) 
  134. void (*Get##type##ArrayRegion)(JNIEnv *env, native_type##Array array, jsize start, jsize len, native_type *buf);
  135. #define SET_REGION_PRIM_ARRAY(type, native_type, array_type) 
  136. void (*Set##type##ArrayRegion)(JNIEnv *env, native_type##Array array, jsize start, jsize len, native_type *buf);
  137. #define PRIM_ARRAY_OP(op)                      
  138. op##_PRIM_ARRAY(Boolean, jboolean, T_BOOLEAN); 
  139. op##_PRIM_ARRAY(Byte, jbyte, T_BYTE);          
  140. op##_PRIM_ARRAY(Char, jchar, T_CHAR);          
  141. op##_PRIM_ARRAY(Short, jshort, T_SHORT);       
  142. op##_PRIM_ARRAY(Int, jint, T_INT);             
  143. op##_PRIM_ARRAY(Long, jlong, T_LONG);          
  144. op##_PRIM_ARRAY(Float, jfloat, T_FLOAT);       
  145. op##_PRIM_ARRAY(Double, jdouble, T_DOUBLE);
  146. #define GET_FIELD(type, native_type) 
  147. native_type (*Get##type##Field)(JNIEnv *env, jobject obj, jfieldID fieldID);
  148. #define SET_FIELD(type, native_type) 
  149. void (*Set##type##Field)(JNIEnv *env, jobject obj, jfieldID fieldID, native_type value);
  150. #define GET_STATIC_FIELD(type, native_type) 
  151. native_type (*GetStatic##type##Field)(JNIEnv *env, jclass clazz, jfieldID fieldID);
  152. #define SET_STATIC_FIELD(type, native_type) 
  153. void (*SetStatic##type##Field)(JNIEnv *env, jclass clazz, jfieldID fieldID, native_type value);
  154. #define FIELD_OP(op)           
  155. op##_FIELD(Object, jobject);   
  156. op##_FIELD(Boolean, jboolean); 
  157. op##_FIELD(Byte, jbyte);       
  158. op##_FIELD(Char, jchar);       
  159. op##_FIELD(Short, jshort);     
  160. op##_FIELD(Int, jint);         
  161. op##_FIELD(Long, jlong);       
  162. op##_FIELD(Float, jfloat);     
  163. op##_FIELD(Double, jdouble);
  164. struct _JNINativeInterface {
  165.     void *reserved0;
  166.     void *reserved1;
  167.     void *reserved2;
  168.     void *reserved3;
  169.     jint (*GetVersion)(JNIEnv *env);
  170.     jclass (*DefineClass)(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len);
  171.     jclass (*FindClass)(JNIEnv *env, const char *name);
  172.     jmethodID (*FromReflectedMethod)(JNIEnv *env, jobject method);
  173.     jfieldID (*FromReflectedField)(JNIEnv *env, jobject field);
  174.     jobject (*ToReflectedMethod)(JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
  175.     jclass (*GetSuperclass)(JNIEnv *env, jclass sub);
  176.     jboolean (*IsAssignableFrom)(JNIEnv *env, jclass sub, jclass sup);
  177.     jobject (*ToReflectedField)(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
  178.     jint (*Throw)(JNIEnv *env, jthrowable obj);
  179.     jint (*ThrowNew)(JNIEnv *env, jclass clazz, const char *msg);
  180.     jthrowable (*ExceptionOccurred)(JNIEnv *env);
  181.     void (*ExceptionDescribe)(JNIEnv *env);
  182.     void (*ExceptionClear)(JNIEnv *env);
  183.     void (*FatalError)(JNIEnv *env, const char *msg);
  184.     jint (*PushLocalFrame)(JNIEnv *env, jint capacity);
  185.     jobject (*PopLocalFrame)(JNIEnv *env, jobject result);
  186.     jobject (*NewGlobalRef)(JNIEnv *env, jobject obj);
  187.     void (*DeleteGlobalRef)(JNIEnv *env, jobject obj);
  188.     void (*DeleteLocalRef)(JNIEnv *env, jobject obj);
  189.     jboolean (*IsSameObject)(JNIEnv *env, jobject obj1, jobject obj2);
  190.     jobject (*NewLocalRef)(JNIEnv *env, jobject obj);
  191.     jint (*EnsureLocalCapacity)(JNIEnv *env, jint capacity);
  192.     jobject (*AllocObject)(JNIEnv *env, jclass clazz);
  193.     jobject (*NewObject)(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
  194.     jobject (*NewObjectV)(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
  195.     jobject (*NewObjectA)(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
  196.     jclass (*GetObjectClass)(JNIEnv *env, jobject obj);
  197.     jboolean (*IsInstanceOf)(JNIEnv *env, jobject obj, jclass clazz);
  198.     jmethodID (*GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  199.     CALL_METHOD(VIRTUAL);
  200.     CALL_METHOD(NONVIRTUAL);
  201.     jfieldID (*GetFieldID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  202.     FIELD_OP(GET);
  203.     FIELD_OP(SET);
  204.     jmethodID (*GetStaticMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  205.     CALL_METHOD(STATIC);
  206.     jfieldID (*GetStaticFieldID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
  207.     FIELD_OP(GET_STATIC);
  208.     FIELD_OP(SET_STATIC);
  209.     jstring (*NewString)(JNIEnv *env, const jchar *unicode, jsize len);
  210.     jsize (*GetStringLength)(JNIEnv *env, jstring str);
  211.     const jchar *(*GetStringChars)(JNIEnv *env, jstring str, jboolean *isCopy);
  212.     void (*ReleaseStringChars)(JNIEnv *env, jstring str, const jchar *chars);
  213.   
  214.     jstring (*NewStringUTF)(JNIEnv *env, const char *utf);
  215.     jsize (*GetStringUTFLength)(JNIEnv *env, jstring str);
  216.     const char* (*GetStringUTFChars)(JNIEnv *env, jstring str, jboolean *isCopy);
  217.     void (*ReleaseStringUTFChars)(JNIEnv *env, jstring str, const char* chars);
  218.   
  219.     jsize (*GetArrayLength)(JNIEnv *env, jarray array);
  220.     jobjectArray (*NewObjectArray)(JNIEnv *env, jsize len, jclass clazz, jobject init);
  221.     jobject (*GetObjectArrayElement)(JNIEnv *env, jobjectArray array, jsize index);
  222.     void (*SetObjectArrayElement)(JNIEnv *env, jobjectArray array, jsize index, jobject val);
  223.     PRIM_ARRAY_OP(NEW);
  224.     PRIM_ARRAY_OP(GET_ELEMENTS);
  225.     PRIM_ARRAY_OP(RELEASE_ELEMENTS);
  226.     PRIM_ARRAY_OP(GET_REGION);
  227.     PRIM_ARRAY_OP(SET_REGION);
  228.     jint (*RegisterNatives)(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
  229.     jint (*UnregisterNatives)(JNIEnv *env, jclass clazz);
  230.     jint (*MonitorEnter)(JNIEnv *env, jobject obj);
  231.     jint (*MonitorExit)(JNIEnv *env, jobject obj);
  232.  
  233.     jint (*GetJavaVM)(JNIEnv *env, JavaVM **vm);
  234.     void (*GetStringRegion)(JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
  235.     void (*GetStringUTFRegion)(JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
  236.     void *(*GetPrimitiveArrayCritical)(JNIEnv *env, jarray array, jboolean *isCopy);
  237.     void (*ReleasePrimitiveArrayCritical)(JNIEnv *env, jarray array, void *carray, jint mode);
  238.     const jchar *(*GetStringCritical)(JNIEnv *env, jstring string, jboolean *isCopy);
  239.     void (*ReleaseStringCritical)(JNIEnv *env, jstring string, const jchar *cstring);
  240.     jweak (*NewWeakGlobalRef)(JNIEnv *env, jobject obj);
  241.     void (*DeleteWeakGlobalRef)(JNIEnv *env, jweak obj);
  242.     jboolean (*ExceptionCheck)(JNIEnv *env);
  243.     jobject (*NewDirectByteBuffer)(JNIEnv *env, void *addr, jlong capacity);
  244.     void* (*GetDirectBufferAddress)(JNIEnv *env, jobject buffer);
  245.     jlong (*GetDirectBufferCapacity)(JNIEnv *env, jobject buffer);
  246. };
  247. struct _JNIInvokeInterface {
  248.     void *reserved0;
  249.     void *reserved1;
  250.     void *reserved2;
  251.     jint (*DestroyJavaVM)(JavaVM *vm);
  252.     jint (*AttachCurrentThread)(JavaVM *vm, void **penv, void *args);
  253.     jint (*DetachCurrentThread)(JavaVM *vm);
  254.     jint (*GetEnv)(JavaVM *vm, void **penv, jint version);
  255.     jint (*AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);
  256. };
  257. typedef struct JavaVMOption {
  258.     char *optionString;
  259.     void *extraInfo;
  260. } JavaVMOption;
  261. typedef struct JavaVMInitArgs {
  262.     jint version;
  263.     jint nOptions;
  264.     JavaVMOption *options;
  265.     jboolean ignoreUnrecognized;
  266. } JavaVMInitArgs;
  267. typedef struct JavaVMAttachArgs {
  268.     jint version;
  269.     char *name;
  270.     jobject group;
  271. } JavaVMAttachArgs;
  272. #undef VIRTUAL_METHOD
  273. #undef NONVIRTUAL_METHOD
  274. #undef STATIC_METHOD
  275. #undef VOID_VIRTUAL_METHOD
  276. #undef VOID_NONVIRTUAL_METHOD
  277. #undef VOID_STATIC_METHOD
  278. #undef CALL_METHOD
  279. #undef NEW_PRIM_ARRAY
  280. #undef GET_ELEMENTS_PRIM_ARRAY
  281. #undef RELEASE_ELEMENTS_PRIM_ARRAY
  282. #undef GET_REGION_PRIM_ARRAY
  283. #undef SET_REGION_PRIM_ARRAY
  284. #undef PRIM_ARRAY_OP
  285. #undef GET_FIELD
  286. #undef SET_FIELD
  287. #undef GET_STATIC_FIELD
  288. #undef SET_STATIC_FIELD
  289. #undef FIELD_OP
  290. #endif