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 JNI_H_ 23 #define 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, 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, jvalue*); 171 jboolean (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...); 172 jboolean (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list); 173 jboolean (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 174 jbyte (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...); 175 jbyte (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list); 176 jbyte (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 177 jchar (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...); 178 jchar (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list); 179 jchar (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 180 jshort (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...); 181 jshort (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list); 182 jshort (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 183 jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...); 184 jint (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list); 185 jint (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 186 jlong (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...); 187 jlong (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list); 188 jlong (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 189 jfloat (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...); 190 jfloat (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list); 191 jfloat (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 192 jdouble (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...); 193 jdouble (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list); 194 jdouble (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*); 195 void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); 196 void (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list); 197 void (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, jvalue*); 281 jboolean (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...); 282 jboolean (*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID, 283 va_list); 284 jboolean (*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID, 285 jvalue*); 286 jbyte (*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...); 287 jbyte (*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list); 288 jbyte (*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 289 jchar (*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...); 290 jchar (*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list); 291 jchar (*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 292 jshort (*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...); 293 jshort (*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list); 294 jshort (*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 295 jint (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...); 296 jint (*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list); 297 jint (*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 298 jlong (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...); 299 jlong (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list); 300 jlong (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 301 jfloat (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...); 302 jfloat (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list); 303 jfloat (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 304 jdouble (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...); 305 jdouble (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list); 306 jdouble (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 307 void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...); 308 void (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list); 309 void (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*); 310 jfieldID (*GetStaticFieldID)(JNIEnv*, jclass, const char*, 311 const char*); 312 jobject (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID); 313 jboolean (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID); 314 jbyte (*GetStaticByteField)(JNIEnv*, jclass, jfieldID); 315 jchar (*GetStaticCharField)(JNIEnv*, jclass, jfieldID); 316 jshort (*GetStaticShortField)(JNIEnv*, jclass, jfieldID); 317 jint (*GetStaticIntField)(JNIEnv*, jclass, jfieldID); 318 jlong (*GetStaticLongField)(JNIEnv*, jclass, jfieldID); 319 jfloat (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID); 320 jdouble (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID); 321 void (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject); 322 void (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean); 323 void (*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte); 324 void (*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar); 325 void (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort); 326 void (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint); 327 void (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong); 328 void (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat); 329 void (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble); 330 jstring (*NewString)(JNIEnv*, const jchar*, jsize); 331 jsize (*GetStringLength)(JNIEnv*, jstring); 332 const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*); 333 void (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*); 334 jstring (*NewStringUTF)(JNIEnv*, const char*); 335 jsize (*GetStringUTFLength)(JNIEnv*, jstring); 336 /* JNI spec says this returns const jbyte*, but that's inconsistent */ 337 const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*); 338 void (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*); 339 jsize (*GetArrayLength)(JNIEnv*, jarray); 340 jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject); 341 jobject (*GetObjectArrayElement)(JNIEnv*, jobjectArray, jsize); 342 void (*SetObjectArrayElement)(JNIEnv*, jobjectArray, jsize, jobject); 343 jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize); 344 jbyteArray (*NewByteArray)(JNIEnv*, jsize); 345 jcharArray (*NewCharArray)(JNIEnv*, jsize); 346 jshortArray (*NewShortArray)(JNIEnv*, jsize); 347 jintArray (*NewIntArray)(JNIEnv*, jsize); 348 jlongArray (*NewLongArray)(JNIEnv*, jsize); 349 jfloatArray (*NewFloatArray)(JNIEnv*, jsize); 350 jdoubleArray (*NewDoubleArray)(JNIEnv*, jsize); 351 jboolean* (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*); 352 jbyte* (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*); 353 jchar* (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*); 354 jshort* (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*); 355 jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*); 356 jlong* (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*); 357 jfloat* (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*); 358 jdouble* (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*); 359 void (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray, 360 jboolean*, jint); 361 void (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray, 362 jbyte*, jint); 363 void (*ReleaseCharArrayElements)(JNIEnv*, jcharArray, 364 jchar*, jint); 365 void (*ReleaseShortArrayElements)(JNIEnv*, jshortArray, 366 jshort*, jint); 367 void (*ReleaseIntArrayElements)(JNIEnv*, jintArray, 368 jint*, jint); 369 void (*ReleaseLongArrayElements)(JNIEnv*, jlongArray, 370 jlong*, jint); 371 void (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray, 372 jfloat*, jint); 373 void (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray, 374 jdouble*, jint); 375 void (*GetBooleanArrayRegion)(JNIEnv*, jbooleanArray, 376 jsize, jsize, jboolean*); 377 void (*GetByteArrayRegion)(JNIEnv*, jbyteArray, 378 jsize, jsize, jbyte*); 379 void (*GetCharArrayRegion)(JNIEnv*, jcharArray, 380 jsize, jsize, jchar*); 381 void (*GetShortArrayRegion)(JNIEnv*, jshortArray, 382 jsize, jsize, jshort*); 383 void (*GetIntArrayRegion)(JNIEnv*, jintArray, 384 jsize, jsize, jint*); 385 void (*GetLongArrayRegion)(JNIEnv*, jlongArray, 386 jsize, jsize, jlong*); 387 void (*GetFloatArrayRegion)(JNIEnv*, jfloatArray, 388 jsize, jsize, jfloat*); 389 void (*GetDoubleArrayRegion)(JNIEnv*, jdoubleArray, 390 jsize, jsize, jdouble*); 391 /* spec shows these without const; some jni.h do, some don't */ 392 void (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray, 393 jsize, jsize, const jboolean*); 394 void (*SetByteArrayRegion)(JNIEnv*, jbyteArray, 395 jsize, jsize, const jbyte*); 396 void (*SetCharArrayRegion)(JNIEnv*, jcharArray, 397 jsize, jsize, const jchar*); 398 void (*SetShortArrayRegion)(JNIEnv*, jshortArray, 399 jsize, jsize, const jshort*); 400 void (*SetIntArrayRegion)(JNIEnv*, jintArray, 401 jsize, jsize, const jint*); 402 void (*SetLongArrayRegion)(JNIEnv*, jlongArray, 403 jsize, jsize, const jlong*); 404 void (*SetFloatArrayRegion)(JNIEnv*, jfloatArray, 405 jsize, jsize, const jfloat*); 406 void (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray, 407 jsize, jsize, const jdouble*); 408 jint (*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*, 409 jint); 410 jint (*UnregisterNatives)(JNIEnv*, jclass); 411 jint (*MonitorEnter)(JNIEnv*, jobject); 412 jint (*MonitorExit)(JNIEnv*, jobject); 413 jint (*GetJavaVM)(JNIEnv*, JavaVM**); 414 void (*GetStringRegion)(JNIEnv*, jstring, jsize, jsize, jchar*); 415 void (*GetStringUTFRegion)(JNIEnv*, jstring, jsize, jsize, char*); 416 void* (*GetPrimitiveArrayCritical)(JNIEnv*, jarray, jboolean*); 417 void (*ReleasePrimitiveArrayCritical)(JNIEnv*, jarray, void*, jint); 418 const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*); 419 void (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*); 420 jweak (*NewWeakGlobalRef)(JNIEnv*, jobject); 421 void (*DeleteWeakGlobalRef)(JNIEnv*, jweak); 422 jboolean (*ExceptionCheck)(JNIEnv*); 423 jobject (*NewDirectByteBuffer)(JNIEnv*, void*, jlong); 424 void* (*GetDirectBufferAddress)(JNIEnv*, jobject); 425 jlong (*GetDirectBufferCapacity)(JNIEnv*, jobject); 426 /* added in JNI 1.6 */ 427 jobjectRefType (*GetObjectRefType)(JNIEnv*, jobject); 428 }; 429 /* 430 * C++ object wrapper. 431 * 432 * This is usually overlaid on a C struct whose first element is a 433 * JNINativeInterface*. We rely somewhat on compiler behavior. 434 */ 435 struct _JNIEnv { 436 /* do not rename this; it does not seem to be entirely opaque */ 437 const struct JNINativeInterface* functions; 438 #if defined(__cplusplus) GetVersion_JNIEnv439 jint GetVersion() 440 { return functions->GetVersion(this); } DefineClass_JNIEnv441 jclass DefineClass(const char *name, jobject loader, const jbyte* buf, 442 jsize bufLen) 443 { return functions->DefineClass(this, name, loader, buf, bufLen); } FindClass_JNIEnv444 jclass FindClass(const char* name) 445 { return functions->FindClass(this, name); } FromReflectedMethod_JNIEnv446 jmethodID FromReflectedMethod(jobject method) 447 { return functions->FromReflectedMethod(this, method); } FromReflectedField_JNIEnv448 jfieldID FromReflectedField(jobject field) 449 { return functions->FromReflectedField(this, field); } ToReflectedMethod_JNIEnv450 jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) 451 { return functions->ToReflectedMethod(this, cls, methodID, isStatic); } GetSuperclass_JNIEnv452 jclass GetSuperclass(jclass clazz) 453 { return functions->GetSuperclass(this, clazz); } IsAssignableFrom_JNIEnv454 jboolean IsAssignableFrom(jclass clazz1, jclass clazz2) 455 { return functions->IsAssignableFrom(this, clazz1, clazz2); } ToReflectedField_JNIEnv456 jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) 457 { return functions->ToReflectedField(this, cls, fieldID, isStatic); } Throw_JNIEnv458 jint Throw(jthrowable obj) 459 { return functions->Throw(this, obj); } ThrowNew_JNIEnv460 jint ThrowNew(jclass clazz, const char* message) 461 { return functions->ThrowNew(this, clazz, message); } ExceptionOccurred_JNIEnv462 jthrowable ExceptionOccurred() 463 { return functions->ExceptionOccurred(this); } ExceptionDescribe_JNIEnv464 void ExceptionDescribe() 465 { functions->ExceptionDescribe(this); } ExceptionClear_JNIEnv466 void ExceptionClear() 467 { functions->ExceptionClear(this); } FatalError_JNIEnv468 void FatalError(const char* msg) 469 { functions->FatalError(this, msg); } PushLocalFrame_JNIEnv470 jint PushLocalFrame(jint capacity) 471 { return functions->PushLocalFrame(this, capacity); } PopLocalFrame_JNIEnv472 jobject PopLocalFrame(jobject result) 473 { return functions->PopLocalFrame(this, result); } NewGlobalRef_JNIEnv474 jobject NewGlobalRef(jobject obj) 475 { return functions->NewGlobalRef(this, obj); } DeleteGlobalRef_JNIEnv476 void DeleteGlobalRef(jobject globalRef) 477 { functions->DeleteGlobalRef(this, globalRef); } DeleteLocalRef_JNIEnv478 void DeleteLocalRef(jobject localRef) 479 { functions->DeleteLocalRef(this, localRef); } IsSameObject_JNIEnv480 jboolean IsSameObject(jobject ref1, jobject ref2) 481 { return functions->IsSameObject(this, ref1, ref2); } NewLocalRef_JNIEnv482 jobject NewLocalRef(jobject ref) 483 { return functions->NewLocalRef(this, ref); } EnsureLocalCapacity_JNIEnv484 jint EnsureLocalCapacity(jint capacity) 485 { return functions->EnsureLocalCapacity(this, capacity); } AllocObject_JNIEnv486 jobject AllocObject(jclass clazz) 487 { return functions->AllocObject(this, clazz); } NewObject_JNIEnv488 jobject NewObject(jclass clazz, jmethodID methodID, ...) 489 { 490 va_list args; 491 va_start(args, methodID); 492 jobject result = functions->NewObjectV(this, clazz, methodID, args); 493 va_end(args); 494 return result; 495 } NewObjectV_JNIEnv496 jobject NewObjectV(jclass clazz, jmethodID methodID, va_list args) 497 { return functions->NewObjectV(this, clazz, methodID, args); } NewObjectA_JNIEnv498 jobject NewObjectA(jclass clazz, jmethodID methodID, jvalue* args) 499 { return functions->NewObjectA(this, clazz, methodID, args); } GetObjectClass_JNIEnv500 jclass GetObjectClass(jobject obj) 501 { return functions->GetObjectClass(this, obj); } IsInstanceOf_JNIEnv502 jboolean IsInstanceOf(jobject obj, jclass clazz) 503 { return functions->IsInstanceOf(this, obj, clazz); } GetMethodID_JNIEnv504 jmethodID GetMethodID(jclass clazz, const char* name, const char* sig) 505 { return functions->GetMethodID(this, clazz, name, sig); } 506 #define CALL_TYPE_METHOD(_jtype, _jname) \ 507 _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...) \ 508 { \ 509 _jtype result; \ 510 va_list args; \ 511 va_start(args, methodID); \ 512 result = functions->Call##_jname##MethodV(this, obj, methodID, \ 513 args); \ 514 va_end(args); \ 515 return result; \ 516 } 517 #define CALL_TYPE_METHODV(_jtype, _jname) \ 518 _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID, \ 519 va_list args) \ 520 { return functions->Call##_jname##MethodV(this, obj, methodID, args); } 521 #define CALL_TYPE_METHODA(_jtype, _jname) \ 522 _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID, \ 523 jvalue* args) \ 524 { return functions->Call##_jname##MethodA(this, obj, methodID, args); } 525 #define CALL_TYPE(_jtype, _jname) \ 526 CALL_TYPE_METHOD(_jtype, _jname) \ 527 CALL_TYPE_METHODV(_jtype, _jname) \ 528 CALL_TYPE_METHODA(_jtype, _jname) CALL_TYPE_JNIEnv529 CALL_TYPE(jobject, Object) 530 CALL_TYPE(jboolean, Boolean) 531 CALL_TYPE(jbyte, Byte) 532 CALL_TYPE(jchar, Char) 533 CALL_TYPE(jshort, Short) 534 CALL_TYPE(jint, Int) 535 CALL_TYPE(jlong, Long) 536 CALL_TYPE(jfloat, Float) 537 CALL_TYPE(jdouble, Double) 538 void CallVoidMethod(jobject obj, jmethodID methodID, ...) 539 { 540 va_list args; 541 va_start(args, methodID); 542 functions->CallVoidMethodV(this, obj, methodID, args); 543 va_end(args); 544 } CallVoidMethodV_JNIEnv545 void CallVoidMethodV(jobject obj, jmethodID methodID, va_list args) 546 { functions->CallVoidMethodV(this, obj, methodID, args); } CallVoidMethodA_JNIEnv547 void CallVoidMethodA(jobject obj, jmethodID methodID, jvalue* args) 548 { functions->CallVoidMethodA(this, obj, methodID, args); } 549 #define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname) \ 550 _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz, \ 551 jmethodID methodID, ...) \ 552 { \ 553 _jtype result; \ 554 va_list args; \ 555 va_start(args, methodID); \ 556 result = functions->CallNonvirtual##_jname##MethodV(this, obj, \ 557 clazz, methodID, args); \ 558 va_end(args); \ 559 return result; \ 560 } 561 #define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname) \ 562 _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz, \ 563 jmethodID methodID, va_list args) \ 564 { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz, \ 565 methodID, args); } 566 #define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname) \ 567 _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz, \ 568 jmethodID methodID, jvalue* args) \ 569 { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz, \ 570 methodID, args); } 571 #define CALL_NONVIRT_TYPE(_jtype, _jname) \ 572 CALL_NONVIRT_TYPE_METHOD(_jtype, _jname) \ 573 CALL_NONVIRT_TYPE_METHODV(_jtype, _jname) \ 574 CALL_NONVIRT_TYPE_METHODA(_jtype, _jname) CALL_NONVIRT_TYPE_JNIEnv575 CALL_NONVIRT_TYPE(jobject, Object) 576 CALL_NONVIRT_TYPE(jboolean, Boolean) 577 CALL_NONVIRT_TYPE(jbyte, Byte) 578 CALL_NONVIRT_TYPE(jchar, Char) 579 CALL_NONVIRT_TYPE(jshort, Short) 580 CALL_NONVIRT_TYPE(jint, Int) 581 CALL_NONVIRT_TYPE(jlong, Long) 582 CALL_NONVIRT_TYPE(jfloat, Float) 583 CALL_NONVIRT_TYPE(jdouble, Double) 584 void CallNonvirtualVoidMethod(jobject obj, jclass clazz, 585 jmethodID methodID, ...) 586 { 587 va_list args; 588 va_start(args, methodID); 589 functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); 590 va_end(args); 591 } CallNonvirtualVoidMethodV_JNIEnv592 void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, 593 jmethodID methodID, va_list args) 594 { functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); } CallNonvirtualVoidMethodA_JNIEnv595 void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, 596 jmethodID methodID, jvalue* args) 597 { functions->CallNonvirtualVoidMethodA(this, obj, clazz, methodID, args); } GetFieldID_JNIEnv598 jfieldID GetFieldID(jclass clazz, const char* name, const char* sig) 599 { return functions->GetFieldID(this, clazz, name, sig); } GetObjectField_JNIEnv600 jobject GetObjectField(jobject obj, jfieldID fieldID) 601 { return functions->GetObjectField(this, obj, fieldID); } GetBooleanField_JNIEnv602 jboolean GetBooleanField(jobject obj, jfieldID fieldID) 603 { return functions->GetBooleanField(this, obj, fieldID); } GetByteField_JNIEnv604 jbyte GetByteField(jobject obj, jfieldID fieldID) 605 { return functions->GetByteField(this, obj, fieldID); } GetCharField_JNIEnv606 jchar GetCharField(jobject obj, jfieldID fieldID) 607 { return functions->GetCharField(this, obj, fieldID); } GetShortField_JNIEnv608 jshort GetShortField(jobject obj, jfieldID fieldID) 609 { return functions->GetShortField(this, obj, fieldID); } GetIntField_JNIEnv610 jint GetIntField(jobject obj, jfieldID fieldID) 611 { return functions->GetIntField(this, obj, fieldID); } GetLongField_JNIEnv612 jlong GetLongField(jobject obj, jfieldID fieldID) 613 { return functions->GetLongField(this, obj, fieldID); } GetFloatField_JNIEnv614 jfloat GetFloatField(jobject obj, jfieldID fieldID) 615 { return functions->GetFloatField(this, obj, fieldID); } GetDoubleField_JNIEnv616 jdouble GetDoubleField(jobject obj, jfieldID fieldID) 617 { return functions->GetDoubleField(this, obj, fieldID); } SetObjectField_JNIEnv618 void SetObjectField(jobject obj, jfieldID fieldID, jobject value) 619 { functions->SetObjectField(this, obj, fieldID, value); } SetBooleanField_JNIEnv620 void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value) 621 { functions->SetBooleanField(this, obj, fieldID, value); } SetByteField_JNIEnv622 void SetByteField(jobject obj, jfieldID fieldID, jbyte value) 623 { functions->SetByteField(this, obj, fieldID, value); } SetCharField_JNIEnv624 void SetCharField(jobject obj, jfieldID fieldID, jchar value) 625 { functions->SetCharField(this, obj, fieldID, value); } SetShortField_JNIEnv626 void SetShortField(jobject obj, jfieldID fieldID, jshort value) 627 { functions->SetShortField(this, obj, fieldID, value); } SetIntField_JNIEnv628 void SetIntField(jobject obj, jfieldID fieldID, jint value) 629 { functions->SetIntField(this, obj, fieldID, value); } SetLongField_JNIEnv630 void SetLongField(jobject obj, jfieldID fieldID, jlong value) 631 { functions->SetLongField(this, obj, fieldID, value); } SetFloatField_JNIEnv632 void SetFloatField(jobject obj, jfieldID fieldID, jfloat value) 633 { functions->SetFloatField(this, obj, fieldID, value); } SetDoubleField_JNIEnv634 void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value) 635 { functions->SetDoubleField(this, obj, fieldID, value); } GetStaticMethodID_JNIEnv636 jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig) 637 { return functions->GetStaticMethodID(this, clazz, name, sig); } 638 #define CALL_STATIC_TYPE_METHOD(_jtype, _jname) \ 639 _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID, \ 640 ...) \ 641 { \ 642 _jtype result; \ 643 va_list args; \ 644 va_start(args, methodID); \ 645 result = functions->CallStatic##_jname##MethodV(this, clazz, \ 646 methodID, args); \ 647 va_end(args); \ 648 return result; \ 649 } 650 #define CALL_STATIC_TYPE_METHODV(_jtype, _jname) \ 651 _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID, \ 652 va_list args) \ 653 { return functions->CallStatic##_jname##MethodV(this, clazz, methodID, \ 654 args); } 655 #define CALL_STATIC_TYPE_METHODA(_jtype, _jname) \ 656 _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID, \ 657 jvalue* args) \ 658 { return functions->CallStatic##_jname##MethodA(this, clazz, methodID, \ 659 args); } 660 #define CALL_STATIC_TYPE(_jtype, _jname) \ 661 CALL_STATIC_TYPE_METHOD(_jtype, _jname) \ 662 CALL_STATIC_TYPE_METHODV(_jtype, _jname) \ 663 CALL_STATIC_TYPE_METHODA(_jtype, _jname) CALL_STATIC_TYPE_JNIEnv664 CALL_STATIC_TYPE(jobject, Object) 665 CALL_STATIC_TYPE(jboolean, Boolean) 666 CALL_STATIC_TYPE(jbyte, Byte) 667 CALL_STATIC_TYPE(jchar, Char) 668 CALL_STATIC_TYPE(jshort, Short) 669 CALL_STATIC_TYPE(jint, Int) 670 CALL_STATIC_TYPE(jlong, Long) 671 CALL_STATIC_TYPE(jfloat, Float) 672 CALL_STATIC_TYPE(jdouble, Double) 673 void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...) 674 { 675 va_list args; 676 va_start(args, methodID); 677 functions->CallStaticVoidMethodV(this, clazz, methodID, args); 678 va_end(args); 679 } CallStaticVoidMethodV_JNIEnv680 void CallStaticVoidMethodV(jclass clazz, jmethodID methodID, va_list args) 681 { functions->CallStaticVoidMethodV(this, clazz, methodID, args); } CallStaticVoidMethodA_JNIEnv682 void CallStaticVoidMethodA(jclass clazz, jmethodID methodID, jvalue* args) 683 { functions->CallStaticVoidMethodA(this, clazz, methodID, args); } GetStaticFieldID_JNIEnv684 jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig) 685 { return functions->GetStaticFieldID(this, clazz, name, sig); } GetStaticObjectField_JNIEnv686 jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) 687 { return functions->GetStaticObjectField(this, clazz, fieldID); } GetStaticBooleanField_JNIEnv688 jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) 689 { return functions->GetStaticBooleanField(this, clazz, fieldID); } GetStaticByteField_JNIEnv690 jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) 691 { return functions->GetStaticByteField(this, clazz, fieldID); } GetStaticCharField_JNIEnv692 jchar GetStaticCharField(jclass clazz, jfieldID fieldID) 693 { return functions->GetStaticCharField(this, clazz, fieldID); } GetStaticShortField_JNIEnv694 jshort GetStaticShortField(jclass clazz, jfieldID fieldID) 695 { return functions->GetStaticShortField(this, clazz, fieldID); } GetStaticIntField_JNIEnv696 jint GetStaticIntField(jclass clazz, jfieldID fieldID) 697 { return functions->GetStaticIntField(this, clazz, fieldID); } GetStaticLongField_JNIEnv698 jlong GetStaticLongField(jclass clazz, jfieldID fieldID) 699 { return functions->GetStaticLongField(this, clazz, fieldID); } GetStaticFloatField_JNIEnv700 jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) 701 { return functions->GetStaticFloatField(this, clazz, fieldID); } GetStaticDoubleField_JNIEnv702 jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) 703 { return functions->GetStaticDoubleField(this, clazz, fieldID); } SetStaticObjectField_JNIEnv704 void SetStaticObjectField(jclass clazz, jfieldID fieldID, jobject value) 705 { functions->SetStaticObjectField(this, clazz, fieldID, value); } SetStaticBooleanField_JNIEnv706 void SetStaticBooleanField(jclass clazz, jfieldID fieldID, jboolean value) 707 { functions->SetStaticBooleanField(this, clazz, fieldID, value); } SetStaticByteField_JNIEnv708 void SetStaticByteField(jclass clazz, jfieldID fieldID, jbyte value) 709 { functions->SetStaticByteField(this, clazz, fieldID, value); } SetStaticCharField_JNIEnv710 void SetStaticCharField(jclass clazz, jfieldID fieldID, jchar value) 711 { functions->SetStaticCharField(this, clazz, fieldID, value); } SetStaticShortField_JNIEnv712 void SetStaticShortField(jclass clazz, jfieldID fieldID, jshort value) 713 { functions->SetStaticShortField(this, clazz, fieldID, value); } SetStaticIntField_JNIEnv714 void SetStaticIntField(jclass clazz, jfieldID fieldID, jint value) 715 { functions->SetStaticIntField(this, clazz, fieldID, value); } SetStaticLongField_JNIEnv716 void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value) 717 { functions->SetStaticLongField(this, clazz, fieldID, value); } SetStaticFloatField_JNIEnv718 void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value) 719 { functions->SetStaticFloatField(this, clazz, fieldID, value); } SetStaticDoubleField_JNIEnv720 void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value) 721 { functions->SetStaticDoubleField(this, clazz, fieldID, value); } NewString_JNIEnv722 jstring NewString(const jchar* unicodeChars, jsize len) 723 { return functions->NewString(this, unicodeChars, len); } GetStringLength_JNIEnv724 jsize GetStringLength(jstring string) 725 { return functions->GetStringLength(this, string); } GetStringChars_JNIEnv726 const jchar* GetStringChars(jstring string, jboolean* isCopy) 727 { return functions->GetStringChars(this, string, isCopy); } ReleaseStringChars_JNIEnv728 void ReleaseStringChars(jstring string, const jchar* chars) 729 { functions->ReleaseStringChars(this, string, chars); } NewStringUTF_JNIEnv730 jstring NewStringUTF(const char* bytes) 731 { return functions->NewStringUTF(this, bytes); } GetStringUTFLength_JNIEnv732 jsize GetStringUTFLength(jstring string) 733 { return functions->GetStringUTFLength(this, string); } GetStringUTFChars_JNIEnv734 const char* GetStringUTFChars(jstring string, jboolean* isCopy) 735 { return functions->GetStringUTFChars(this, string, isCopy); } ReleaseStringUTFChars_JNIEnv736 void ReleaseStringUTFChars(jstring string, const char* utf) 737 { functions->ReleaseStringUTFChars(this, string, utf); } GetArrayLength_JNIEnv738 jsize GetArrayLength(jarray array) 739 { return functions->GetArrayLength(this, array); } NewObjectArray_JNIEnv740 jobjectArray NewObjectArray(jsize length, jclass elementClass, 741 jobject initialElement) 742 { return functions->NewObjectArray(this, length, elementClass, 743 initialElement); } GetObjectArrayElement_JNIEnv744 jobject GetObjectArrayElement(jobjectArray array, jsize index) 745 { return functions->GetObjectArrayElement(this, array, index); } SetObjectArrayElement_JNIEnv746 void SetObjectArrayElement(jobjectArray array, jsize index, jobject value) 747 { functions->SetObjectArrayElement(this, array, index, value); } NewBooleanArray_JNIEnv748 jbooleanArray NewBooleanArray(jsize length) 749 { return functions->NewBooleanArray(this, length); } NewByteArray_JNIEnv750 jbyteArray NewByteArray(jsize length) 751 { return functions->NewByteArray(this, length); } NewCharArray_JNIEnv752 jcharArray NewCharArray(jsize length) 753 { return functions->NewCharArray(this, length); } NewShortArray_JNIEnv754 jshortArray NewShortArray(jsize length) 755 { return functions->NewShortArray(this, length); } NewIntArray_JNIEnv756 jintArray NewIntArray(jsize length) 757 { return functions->NewIntArray(this, length); } NewLongArray_JNIEnv758 jlongArray NewLongArray(jsize length) 759 { return functions->NewLongArray(this, length); } NewFloatArray_JNIEnv760 jfloatArray NewFloatArray(jsize length) 761 { return functions->NewFloatArray(this, length); } NewDoubleArray_JNIEnv762 jdoubleArray NewDoubleArray(jsize length) 763 { return functions->NewDoubleArray(this, length); } GetBooleanArrayElements_JNIEnv764 jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy) 765 { return functions->GetBooleanArrayElements(this, array, isCopy); } GetByteArrayElements_JNIEnv766 jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy) 767 { return functions->GetByteArrayElements(this, array, isCopy); } GetCharArrayElements_JNIEnv768 jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy) 769 { return functions->GetCharArrayElements(this, array, isCopy); } GetShortArrayElements_JNIEnv770 jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy) 771 { return functions->GetShortArrayElements(this, array, isCopy); } GetIntArrayElements_JNIEnv772 jint* GetIntArrayElements(jintArray array, jboolean* isCopy) 773 { return functions->GetIntArrayElements(this, array, isCopy); } GetLongArrayElements_JNIEnv774 jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy) 775 { return functions->GetLongArrayElements(this, array, isCopy); } GetFloatArrayElements_JNIEnv776 jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy) 777 { return functions->GetFloatArrayElements(this, array, isCopy); } GetDoubleArrayElements_JNIEnv778 jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy) 779 { return functions->GetDoubleArrayElements(this, array, isCopy); } ReleaseBooleanArrayElements_JNIEnv780 void ReleaseBooleanArrayElements(jbooleanArray array, jboolean* elems, 781 jint mode) 782 { functions->ReleaseBooleanArrayElements(this, array, elems, mode); } ReleaseByteArrayElements_JNIEnv783 void ReleaseByteArrayElements(jbyteArray array, jbyte* elems, 784 jint mode) 785 { functions->ReleaseByteArrayElements(this, array, elems, mode); } ReleaseCharArrayElements_JNIEnv786 void ReleaseCharArrayElements(jcharArray array, jchar* elems, 787 jint mode) 788 { functions->ReleaseCharArrayElements(this, array, elems, mode); } ReleaseShortArrayElements_JNIEnv789 void ReleaseShortArrayElements(jshortArray array, jshort* elems, 790 jint mode) 791 { functions->ReleaseShortArrayElements(this, array, elems, mode); } ReleaseIntArrayElements_JNIEnv792 void ReleaseIntArrayElements(jintArray array, jint* elems, 793 jint mode) 794 { functions->ReleaseIntArrayElements(this, array, elems, mode); } ReleaseLongArrayElements_JNIEnv795 void ReleaseLongArrayElements(jlongArray array, jlong* elems, 796 jint mode) 797 { functions->ReleaseLongArrayElements(this, array, elems, mode); } ReleaseFloatArrayElements_JNIEnv798 void ReleaseFloatArrayElements(jfloatArray array, jfloat* elems, 799 jint mode) 800 { functions->ReleaseFloatArrayElements(this, array, elems, mode); } ReleaseDoubleArrayElements_JNIEnv801 void ReleaseDoubleArrayElements(jdoubleArray array, jdouble* elems, 802 jint mode) 803 { functions->ReleaseDoubleArrayElements(this, array, elems, mode); } GetBooleanArrayRegion_JNIEnv804 void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, 805 jboolean* buf) 806 { functions->GetBooleanArrayRegion(this, array, start, len, buf); } GetByteArrayRegion_JNIEnv807 void GetByteArrayRegion(jbyteArray array, jsize start, jsize len, 808 jbyte* buf) 809 { functions->GetByteArrayRegion(this, array, start, len, buf); } GetCharArrayRegion_JNIEnv810 void GetCharArrayRegion(jcharArray array, jsize start, jsize len, 811 jchar* buf) 812 { functions->GetCharArrayRegion(this, array, start, len, buf); } GetShortArrayRegion_JNIEnv813 void GetShortArrayRegion(jshortArray array, jsize start, jsize len, 814 jshort* buf) 815 { functions->GetShortArrayRegion(this, array, start, len, buf); } GetIntArrayRegion_JNIEnv816 void GetIntArrayRegion(jintArray array, jsize start, jsize len, 817 jint* buf) 818 { functions->GetIntArrayRegion(this, array, start, len, buf); } GetLongArrayRegion_JNIEnv819 void GetLongArrayRegion(jlongArray array, jsize start, jsize len, 820 jlong* buf) 821 { functions->GetLongArrayRegion(this, array, start, len, buf); } GetFloatArrayRegion_JNIEnv822 void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len, 823 jfloat* buf) 824 { functions->GetFloatArrayRegion(this, array, start, len, buf); } GetDoubleArrayRegion_JNIEnv825 void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, 826 jdouble* buf) 827 { functions->GetDoubleArrayRegion(this, array, start, len, buf); } SetBooleanArrayRegion_JNIEnv828 void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, 829 const jboolean* buf) 830 { functions->SetBooleanArrayRegion(this, array, start, len, buf); } SetByteArrayRegion_JNIEnv831 void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, 832 const jbyte* buf) 833 { functions->SetByteArrayRegion(this, array, start, len, buf); } SetCharArrayRegion_JNIEnv834 void SetCharArrayRegion(jcharArray array, jsize start, jsize len, 835 const jchar* buf) 836 { functions->SetCharArrayRegion(this, array, start, len, buf); } SetShortArrayRegion_JNIEnv837 void SetShortArrayRegion(jshortArray array, jsize start, jsize len, 838 const jshort* buf) 839 { functions->SetShortArrayRegion(this, array, start, len, buf); } SetIntArrayRegion_JNIEnv840 void SetIntArrayRegion(jintArray array, jsize start, jsize len, 841 const jint* buf) 842 { functions->SetIntArrayRegion(this, array, start, len, buf); } SetLongArrayRegion_JNIEnv843 void SetLongArrayRegion(jlongArray array, jsize start, jsize len, 844 const jlong* buf) 845 { functions->SetLongArrayRegion(this, array, start, len, buf); } SetFloatArrayRegion_JNIEnv846 void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, 847 const jfloat* buf) 848 { functions->SetFloatArrayRegion(this, array, start, len, buf); } SetDoubleArrayRegion_JNIEnv849 void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, 850 const jdouble* buf) 851 { functions->SetDoubleArrayRegion(this, array, start, len, buf); } RegisterNatives_JNIEnv852 jint RegisterNatives(jclass clazz, const JNINativeMethod* methods, 853 jint nMethods) 854 { return functions->RegisterNatives(this, clazz, methods, nMethods); } UnregisterNatives_JNIEnv855 jint UnregisterNatives(jclass clazz) 856 { return functions->UnregisterNatives(this, clazz); } MonitorEnter_JNIEnv857 jint MonitorEnter(jobject obj) 858 { return functions->MonitorEnter(this, obj); } MonitorExit_JNIEnv859 jint MonitorExit(jobject obj) 860 { return functions->MonitorExit(this, obj); } GetJavaVM_JNIEnv861 jint GetJavaVM(JavaVM** vm) 862 { return functions->GetJavaVM(this, vm); } GetStringRegion_JNIEnv863 void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf) 864 { functions->GetStringRegion(this, str, start, len, buf); } GetStringUTFRegion_JNIEnv865 void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf) 866 { return functions->GetStringUTFRegion(this, str, start, len, buf); } GetPrimitiveArrayCritical_JNIEnv867 void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy) 868 { return functions->GetPrimitiveArrayCritical(this, array, isCopy); } ReleasePrimitiveArrayCritical_JNIEnv869 void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode) 870 { functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); } GetStringCritical_JNIEnv871 const jchar* GetStringCritical(jstring string, jboolean* isCopy) 872 { return functions->GetStringCritical(this, string, isCopy); } ReleaseStringCritical_JNIEnv873 void ReleaseStringCritical(jstring string, const jchar* carray) 874 { functions->ReleaseStringCritical(this, string, carray); } NewWeakGlobalRef_JNIEnv875 jweak NewWeakGlobalRef(jobject obj) 876 { return functions->NewWeakGlobalRef(this, obj); } DeleteWeakGlobalRef_JNIEnv877 void DeleteWeakGlobalRef(jweak obj) 878 { functions->DeleteWeakGlobalRef(this, obj); } ExceptionCheck_JNIEnv879 jboolean ExceptionCheck() 880 { return functions->ExceptionCheck(this); } NewDirectByteBuffer_JNIEnv881 jobject NewDirectByteBuffer(void* address, jlong capacity) 882 { return functions->NewDirectByteBuffer(this, address, capacity); } GetDirectBufferAddress_JNIEnv883 void* GetDirectBufferAddress(jobject buf) 884 { return functions->GetDirectBufferAddress(this, buf); } GetDirectBufferCapacity_JNIEnv885 jlong GetDirectBufferCapacity(jobject buf) 886 { return functions->GetDirectBufferCapacity(this, buf); } 887 /* added in JNI 1.6 */ GetObjectRefType_JNIEnv888 jobjectRefType GetObjectRefType(jobject obj) 889 { return functions->GetObjectRefType(this, obj); } 890 #endif /*__cplusplus*/ 891 }; 892 /* 893 * JNI invocation interface. 894 */ 895 struct JNIInvokeInterface { 896 void* reserved0; 897 void* reserved1; 898 void* reserved2; 899 jint (*DestroyJavaVM)(JavaVM*); 900 jint (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*); 901 jint (*DetachCurrentThread)(JavaVM*); 902 jint (*GetEnv)(JavaVM*, void**, jint); 903 jint (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*); 904 }; 905 /* 906 * C++ version. 907 */ 908 struct _JavaVM { 909 const struct JNIInvokeInterface* functions; 910 #if defined(__cplusplus) DestroyJavaVM_JavaVM911 jint DestroyJavaVM() 912 { return functions->DestroyJavaVM(this); } AttachCurrentThread_JavaVM913 jint AttachCurrentThread(JNIEnv** p_env, void* thr_args) 914 { return functions->AttachCurrentThread(this, p_env, thr_args); } DetachCurrentThread_JavaVM915 jint DetachCurrentThread() 916 { return functions->DetachCurrentThread(this); } GetEnv_JavaVM917 jint GetEnv(void** env, jint version) 918 { return functions->GetEnv(this, env, version); } AttachCurrentThreadAsDaemon_JavaVM919 jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args) 920 { return functions->AttachCurrentThreadAsDaemon(this, p_env, thr_args); } 921 #endif /*__cplusplus*/ 922 }; 923 struct JavaVMAttachArgs { 924 jint version; /* must be >= JNI_VERSION_1_2 */ 925 const char* name; /* NULL or name of thread as modified UTF-8 str */ 926 jobject group; /* global ref of a ThreadGroup object, or NULL */ 927 }; 928 typedef struct JavaVMAttachArgs JavaVMAttachArgs; 929 /* 930 * JNI 1.2+ initialization. (As of 1.6, the pre-1.2 structures are no 931 * longer supported.) 932 */ 933 typedef struct JavaVMOption { 934 const char* optionString; 935 void* extraInfo; 936 } JavaVMOption; 937 typedef struct JavaVMInitArgs { 938 jint version; /* use JNI_VERSION_1_2 or later */ 939 jint nOptions; 940 JavaVMOption* options; 941 jboolean ignoreUnrecognized; 942 } JavaVMInitArgs; 943 #ifdef __cplusplus 944 extern "C" { 945 #endif 946 /* 947 * VM initialization functions. 948 * 949 * Note these are the only symbols exported for JNI by the VM. 950 */ 951 jint JNI_GetDefaultJavaVMInitArgs(void*); 952 jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*); 953 jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*); 954 #define JNIIMPORT 955 #ifdef _WIN32 956 #define JNIEXPORT // Not from Android, added for compatibility with Windows // __declspec(dllexport) not used because we use a .def 957 #else 958 #define JNIEXPORT __attribute__ ((visibility ("default"))) 959 #endif 960 #define JNICALL 961 /* 962 * Prototypes for functions exported by loadable shared libs. These are 963 * called by JNI, not provided by JNI. 964 */ 965 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved); 966 JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved); 967 #ifdef __cplusplus 968 } 969 #endif 970 /* 971 * Manifest constants. 972 */ 973 #define JNI_FALSE 0 974 #define JNI_TRUE 1 975 #define JNI_VERSION_1_1 0x00010001 976 #define JNI_VERSION_1_2 0x00010002 977 #define JNI_VERSION_1_4 0x00010004 978 #define JNI_VERSION_1_6 0x00010006 979 #define JNI_OK (0) /* no error */ 980 #define JNI_ERR (-1) /* generic error */ 981 #define JNI_EDETACHED (-2) /* thread detached from the VM */ 982 #define JNI_EVERSION (-3) /* JNI version error */ 983 #define JNI_COMMIT 1 /* copy content, do not free buffer */ 984 #define JNI_ABORT 2 /* free buffer w/o copying back */ 985 #endif /* JNI_H_ */ 986