在做Android jni开发时,jni为我们提供了哪些函数、接口、变量,有时候一头雾水,今天就把jni.h中定义的所有内容列出来,供自己查阅:

/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * JNI specification, as defined by Sun: * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html * * Everything here is expected to be VM-neutral. */#ifndef JNI_H_#define JNI_H_#include <sys/cdefs.h>#include <stdarg.h>/* * Primitive types that match up with Java equivalents. */#ifdef HAVE_INTTYPES_H# include <inttypes.h>      /* C99 */typedef uint8_t         jboolean;       /* unsigned 8 bits */typedef int8_t          jbyte;          /* signed 8 bits */typedef uint16_t        jchar;          /* unsigned 16 bits */typedef int16_t         jshort;         /* signed 16 bits */typedef int32_t         jint;           /* signed 32 bits */typedef int64_t         jlong;          /* signed 64 bits */typedef float           jfloat;         /* 32-bit IEEE 754 */typedef double          jdouble;        /* 64-bit IEEE 754 */#elsetypedef unsigned char   jboolean;       /* unsigned 8 bits */typedef signed char     jbyte;          /* signed 8 bits */typedef unsigned short  jchar;          /* unsigned 16 bits */typedef short           jshort;         /* signed 16 bits */typedef int             jint;           /* signed 32 bits */typedef long long       jlong;          /* signed 64 bits */typedef float           jfloat;         /* 32-bit IEEE 754 */typedef double          jdouble;        /* 64-bit IEEE 754 */#endif/* "cardinal indices and sizes" */typedef jint            jsize;#ifdef __cplusplus/* * Reference types, in C++ */class _jobject {};class _jclass : public _jobject {};class _jstring : public _jobject {};class _jarray : public _jobject {};class _jobjectArray : public _jarray {};class _jbooleanArray : public _jarray {};class _jbyteArray : public _jarray {};class _jcharArray : public _jarray {};class _jshortArray : public _jarray {};class _jintArray : public _jarray {};class _jlongArray : public _jarray {};class _jfloatArray : public _jarray {};class _jdoubleArray : public _jarray {};class _jthrowable : public _jobject {};typedef _jobject*       jobject;typedef _jclass*        jclass;typedef _jstring*       jstring;typedef _jarray*        jarray;typedef _jobjectArray*  jobjectArray;typedef _jbooleanArray* jbooleanArray;typedef _jbyteArray*    jbyteArray;typedef _jcharArray*    jcharArray;typedef _jshortArray*   jshortArray;typedef _jintArray*     jintArray;typedef _jlongArray*    jlongArray;typedef _jfloatArray*   jfloatArray;typedef _jdoubleArray*  jdoubleArray;typedef _jthrowable*    jthrowable;typedef _jobject*       jweak;#else /* not __cplusplus *//* * Reference types, in C. */typedef void*           jobject;typedef jobject         jclass;typedef jobject         jstring;typedef jobject         jarray;typedef jarray          jobjectArray;typedef jarray          jbooleanArray;typedef jarray          jbyteArray;typedef jarray          jcharArray;typedef jarray          jshortArray;typedef jarray          jintArray;typedef jarray          jlongArray;typedef jarray          jfloatArray;typedef jarray          jdoubleArray;typedef jobject         jthrowable;typedef jobject         jweak;#endif /* not __cplusplus */struct _jfieldID;                       /* opaque structure */typedef struct _jfieldID* jfieldID;     /* field IDs */struct _jmethodID;                      /* opaque structure */typedef struct _jmethodID* jmethodID;   /* method IDs */struct JNIInvokeInterface;typedef union jvalue {    jboolean    z;    jbyte       b;    jchar       c;    jshort      s;    jint        i;    jlong       j;    jfloat      f;    jdouble     d;    jobject     l;} jvalue;typedef enum jobjectRefType {    JNIInvalidRefType = 0,    JNILocalRefType = 1,    JNIGlobalRefType = 2,    JNIWeakGlobalRefType = 3} jobjectRefType;typedef struct {    const char* name;    const char* signature;    void*       fnPtr;} JNINativeMethod;struct _JNIEnv;struct _JavaVM;typedef const struct JNINativeInterface* C_JNIEnv;#if defined(__cplusplus)typedef _JNIEnv JNIEnv;typedef _JavaVM JavaVM;#elsetypedef const struct JNINativeInterface* JNIEnv;typedef const struct JNIInvokeInterface* JavaVM;#endif/* * Table of interface function pointers. */struct JNINativeInterface {    void*       reserved0;    void*       reserved1;    void*       reserved2;    void*       reserved3;    jint        (*GetVersion)(JNIEnv *);    jclass      (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*,                        jsize);    jclass      (*FindClass)(JNIEnv*, const char*);    jmethodID   (*FromReflectedMethod)(JNIEnv*, jobject);    jfieldID    (*FromReflectedField)(JNIEnv*, jobject);    /* spec doesn't show jboolean parameter */    jobject     (*ToReflectedMethod)(JNIEnv*, jclass, jmethodID, jboolean);    jclass      (*GetSuperclass)(JNIEnv*, jclass);    jboolean    (*IsAssignableFrom)(JNIEnv*, jclass, jclass);    /* spec doesn't show jboolean parameter */    jobject     (*ToReflectedField)(JNIEnv*, jclass, jfieldID, jboolean);    jint        (*Throw)(JNIEnv*, jthrowable);    jint        (*ThrowNew)(JNIEnv *, jclass, const char *);    jthrowable  (*ExceptionOccurred)(JNIEnv*);    void        (*ExceptionDescribe)(JNIEnv*);    void        (*ExceptionClear)(JNIEnv*);    void        (*FatalError)(JNIEnv*, const char*);    jint        (*PushLocalFrame)(JNIEnv*, jint);    jobject     (*PopLocalFrame)(JNIEnv*, jobject);    jobject     (*NewGlobalRef)(JNIEnv*, jobject);    void        (*DeleteGlobalRef)(JNIEnv*, jobject);    void        (*DeleteLocalRef)(JNIEnv*, jobject);    jboolean    (*IsSameObject)(JNIEnv*, jobject, jobject);    jobject     (*NewLocalRef)(JNIEnv*, jobject);    jint        (*EnsureLocalCapacity)(JNIEnv*, jint);    jobject     (*AllocObject)(JNIEnv*, jclass);    jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);    jobject     (*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list);    jobject     (*NewObjectA)(JNIEnv*, jclass, jmethodID, jvalue*);    jclass      (*GetObjectClass)(JNIEnv*, jobject);    jboolean    (*IsInstanceOf)(JNIEnv*, jobject, jclass);    jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);    jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);    jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);    jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jbyte       (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);    jbyte       (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jbyte       (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jchar       (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);    jchar       (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jchar       (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jshort      (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);    jshort      (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jshort      (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);    jint        (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jint        (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);    jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);    jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;    jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;    jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;    jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;    jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;    jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);    void        (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);    void        (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);    jobject     (*CallNonvirtualObjectMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jobject     (*CallNonvirtualObjectMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    jobject     (*CallNonvirtualObjectMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jboolean    (*CallNonvirtualBooleanMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jboolean    (*CallNonvirtualBooleanMethodV)(JNIEnv*, jobject, jclass,                         jmethodID, va_list);    jboolean    (*CallNonvirtualBooleanMethodA)(JNIEnv*, jobject, jclass,                         jmethodID, jvalue*);    jbyte       (*CallNonvirtualByteMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jbyte       (*CallNonvirtualByteMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    jbyte       (*CallNonvirtualByteMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jchar       (*CallNonvirtualCharMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jchar       (*CallNonvirtualCharMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    jchar       (*CallNonvirtualCharMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jshort      (*CallNonvirtualShortMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jshort      (*CallNonvirtualShortMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    jshort      (*CallNonvirtualShortMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jint        (*CallNonvirtualIntMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jint        (*CallNonvirtualIntMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    jint        (*CallNonvirtualIntMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jlong       (*CallNonvirtualLongMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    jlong       (*CallNonvirtualLongMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    jlong       (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jfloat      (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...) __NDK_FPABI__;    jfloat      (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list) __NDK_FPABI__;    jfloat      (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*) __NDK_FPABI__;    jdouble     (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...) __NDK_FPABI__;    jdouble     (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list) __NDK_FPABI__;    jdouble     (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*) __NDK_FPABI__;    void        (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,                        jmethodID, ...);    void        (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,                        jmethodID, va_list);    void        (*CallNonvirtualVoidMethodA)(JNIEnv*, jobject, jclass,                        jmethodID, jvalue*);    jfieldID    (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);    jobject     (*GetObjectField)(JNIEnv*, jobject, jfieldID);    jboolean    (*GetBooleanField)(JNIEnv*, jobject, jfieldID);    jbyte       (*GetByteField)(JNIEnv*, jobject, jfieldID);    jchar       (*GetCharField)(JNIEnv*, jobject, jfieldID);    jshort      (*GetShortField)(JNIEnv*, jobject, jfieldID);    jint        (*GetIntField)(JNIEnv*, jobject, jfieldID);    jlong       (*GetLongField)(JNIEnv*, jobject, jfieldID);    jfloat      (*GetFloatField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;    jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;    void        (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);    void        (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);    void        (*SetByteField)(JNIEnv*, jobject, jfieldID, jbyte);    void        (*SetCharField)(JNIEnv*, jobject, jfieldID, jchar);    void        (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);    void        (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);    void        (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);    void        (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat) __NDK_FPABI__;    void        (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble) __NDK_FPABI__;    jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);    jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);    jobject     (*CallStaticObjectMethodV)(JNIEnv*, jclass, jmethodID, va_list);    jobject     (*CallStaticObjectMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jboolean    (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);    jboolean    (*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID,                        va_list);    jboolean    (*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID,                        jvalue*);    jbyte       (*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...);    jbyte       (*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list);    jbyte       (*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jchar       (*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...);    jchar       (*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list);    jchar       (*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jshort      (*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...);    jshort      (*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list);    jshort      (*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jint        (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);    jint        (*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list);    jint        (*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jlong       (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);    jlong       (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);    jlong       (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jfloat      (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;    jfloat      (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;    jfloat      (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;    jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;    jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;    jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;    void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);    void        (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);    void        (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);    jfieldID    (*GetStaticFieldID)(JNIEnv*, jclass, const char*,                        const char*);    jobject     (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);    jboolean    (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);    jbyte       (*GetStaticByteField)(JNIEnv*, jclass, jfieldID);    jchar       (*GetStaticCharField)(JNIEnv*, jclass, jfieldID);    jshort      (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);    jint        (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);    jlong       (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);    jfloat      (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;    jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;    void        (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);    void        (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);    void        (*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte);    void        (*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar);    void        (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);    void        (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);    void        (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);    void        (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat) __NDK_FPABI__;    void        (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble) __NDK_FPABI__;    jstring     (*NewString)(JNIEnv*, const jchar*, jsize);    jsize       (*GetStringLength)(JNIEnv*, jstring);    const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);    void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);    jstring     (*NewStringUTF)(JNIEnv*, const char*);    jsize       (*GetStringUTFLength)(JNIEnv*, jstring);    /* JNI spec says this returns const jbyte*, but that's inconsistent */    const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);    void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);    jsize       (*GetArrayLength)(JNIEnv*, jarray);    jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);    jobject     (*GetObjectArrayElement)(JNIEnv*, jobjectArray, jsize);    void        (*SetObjectArrayElement)(JNIEnv*, jobjectArray, jsize, jobject);    jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);    jbyteArray    (*NewByteArray)(JNIEnv*, jsize);    jcharArray    (*NewCharArray)(JNIEnv*, jsize);    jshortArray   (*NewShortArray)(JNIEnv*, jsize);    jintArray     (*NewIntArray)(JNIEnv*, jsize);    jlongArray    (*NewLongArray)(JNIEnv*, jsize);    jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);    jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize);    jboolean*   (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);    jbyte*      (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);    jchar*      (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);    jshort*     (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);    jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);    jlong*      (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);    jfloat*     (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);    jdouble*    (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);    void        (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,                        jboolean*, jint);    void        (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,                        jbyte*, jint);    void        (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,                        jchar*, jint);    void        (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,                        jshort*, jint);    void        (*ReleaseIntArrayElements)(JNIEnv*, jintArray,                        jint*, jint);    void        (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,                        jlong*, jint);    void        (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,                        jfloat*, jint);    void        (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,                        jdouble*, jint);    void        (*GetBooleanArrayRegion)(JNIEnv*, jbooleanArray,                        jsize, jsize, jboolean*);    void        (*GetByteArrayRegion)(JNIEnv*, jbyteArray,                        jsize, jsize, jbyte*);    void        (*GetCharArrayRegion)(JNIEnv*, jcharArray,                        jsize, jsize, jchar*);    void        (*GetShortArrayRegion)(JNIEnv*, jshortArray,                        jsize, jsize, jshort*);    void        (*GetIntArrayRegion)(JNIEnv*, jintArray,                        jsize, jsize, jint*);    void        (*GetLongArrayRegion)(JNIEnv*, jlongArray,                        jsize, jsize, jlong*);    void        (*GetFloatArrayRegion)(JNIEnv*, jfloatArray,                        jsize, jsize, jfloat*);    void        (*GetDoubleArrayRegion)(JNIEnv*, jdoubleArray,                        jsize, jsize, jdouble*);    /* spec shows these without const; some jni.h do, some don't */    void        (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,                        jsize, jsize, const jboolean*);    void        (*SetByteArrayRegion)(JNIEnv*, jbyteArray,                        jsize, jsize, const jbyte*);    void        (*SetCharArrayRegion)(JNIEnv*, jcharArray,                        jsize, jsize, const jchar*);    void        (*SetShortArrayRegion)(JNIEnv*, jshortArray,                        jsize, jsize, const jshort*);    void        (*SetIntArrayRegion)(JNIEnv*, jintArray,                        jsize, jsize, const jint*);    void        (*SetLongArrayRegion)(JNIEnv*, jlongArray,                        jsize, jsize, const jlong*);    void        (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,                        jsize, jsize, const jfloat*);    void        (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray,                        jsize, jsize, const jdouble*);    jint        (*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,                        jint);    jint        (*UnregisterNatives)(JNIEnv*, jclass);    jint        (*MonitorEnter)(JNIEnv*, jobject);    jint        (*MonitorExit)(JNIEnv*, jobject);    jint        (*GetJavaVM)(JNIEnv*, JavaVM**);    void        (*GetStringRegion)(JNIEnv*, jstring, jsize, jsize, jchar*);    void        (*GetStringUTFRegion)(JNIEnv*, jstring, jsize, jsize, char*);    void*       (*GetPrimitiveArrayCritical)(JNIEnv*, jarray, jboolean*);    void        (*ReleasePrimitiveArrayCritical)(JNIEnv*, jarray, void*, jint);    const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*);    void        (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*);    jweak       (*NewWeakGlobalRef)(JNIEnv*, jobject);    void        (*DeleteWeakGlobalRef)(JNIEnv*, jweak);    jboolean    (*ExceptionCheck)(JNIEnv*);    jobject     (*NewDirectByteBuffer)(JNIEnv*, void*, jlong);    void*       (*GetDirectBufferAddress)(JNIEnv*, jobject);    jlong       (*GetDirectBufferCapacity)(JNIEnv*, jobject);    /* added in JNI 1.6 */    jobjectRefType (*GetObjectRefType)(JNIEnv*, jobject);};/* * C++ object wrapper. * * This is usually overlaid on a C struct whose first element is a * JNINativeInterface*.  We rely somewhat on compiler behavior. */struct _JNIEnv {    /* do not rename this; it does not seem to be entirely opaque */    const struct JNINativeInterface* functions;#if defined(__cplusplus)    jint GetVersion()    { return functions->GetVersion(this); }    jclass DefineClass(const char *name, jobject loader, const jbyte* buf,        jsize bufLen)    { return functions->DefineClass(this, name, loader, buf, bufLen); }    jclass FindClass(const char* name)    { return functions->FindClass(this, name); }    jmethodID FromReflectedMethod(jobject method)    { return functions->FromReflectedMethod(this, method); }    jfieldID FromReflectedField(jobject field)    { return functions->FromReflectedField(this, field); }    jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic)    { return functions->ToReflectedMethod(this, cls, methodID, isStatic); }    jclass GetSuperclass(jclass clazz)    { return functions->GetSuperclass(this, clazz); }    jboolean IsAssignableFrom(jclass clazz1, jclass clazz2)    { return functions->IsAssignableFrom(this, clazz1, clazz2); }    jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic)    { return functions->ToReflectedField(this, cls, fieldID, isStatic); }    jint Throw(jthrowable obj)    { return functions->Throw(this, obj); }    jint ThrowNew(jclass clazz, const char* message)    { return functions->ThrowNew(this, clazz, message); }    jthrowable ExceptionOccurred()    { return functions->ExceptionOccurred(this); }    void ExceptionDescribe()    { functions->ExceptionDescribe(this); }    void ExceptionClear()    { functions->ExceptionClear(this); }    void FatalError(const char* msg)    { functions->FatalError(this, msg); }    jint PushLocalFrame(jint capacity)    { return functions->PushLocalFrame(this, capacity); }    jobject PopLocalFrame(jobject result)    { return functions->PopLocalFrame(this, result); }    jobject NewGlobalRef(jobject obj)    { return functions->NewGlobalRef(this, obj); }    void DeleteGlobalRef(jobject globalRef)    { functions->DeleteGlobalRef(this, globalRef); }    void DeleteLocalRef(jobject localRef)    { functions->DeleteLocalRef(this, localRef); }    jboolean IsSameObject(jobject ref1, jobject ref2)    { return functions->IsSameObject(this, ref1, ref2); }    jobject NewLocalRef(jobject ref)    { return functions->NewLocalRef(this, ref); }    jint EnsureLocalCapacity(jint capacity)    { return functions->EnsureLocalCapacity(this, capacity); }    jobject AllocObject(jclass clazz)    { return functions->AllocObject(this, clazz); }    jobject NewObject(jclass clazz, jmethodID methodID, ...)    {        va_list args;        va_start(args, methodID);        jobject result = functions->NewObjectV(this, clazz, methodID, args);        va_end(args);        return result;    }    jobject NewObjectV(jclass clazz, jmethodID methodID, va_list args)    { return functions->NewObjectV(this, clazz, methodID, args); }    jobject NewObjectA(jclass clazz, jmethodID methodID, jvalue* args)    { return functions->NewObjectA(this, clazz, methodID, args); }    jclass GetObjectClass(jobject obj)    { return functions->GetObjectClass(this, obj); }    jboolean IsInstanceOf(jobject obj, jclass clazz)    { return functions->IsInstanceOf(this, obj, clazz); }    jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)    { return functions->GetMethodID(this, clazz, name, sig); }#define CALL_TYPE_METHOD(_jtype, _jname)                                    \    __NDK_FPABI__                                                           \    _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)       \    {                                                                       \        _jtype result;                                                      \        va_list args;                                                       \        va_start(args, methodID);                                           \        result = functions->Call##_jname##MethodV(this, obj, methodID,      \                    args);                                                  \        va_end(args);                                                       \        return result;                                                      \    }#define CALL_TYPE_METHODV(_jtype, _jname)                                   \    __NDK_FPABI__                                                           \    _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,           \        va_list args)                                                       \    { return functions->Call##_jname##MethodV(this, obj, methodID, args); }#define CALL_TYPE_METHODA(_jtype, _jname)                                   \    __NDK_FPABI__                                                           \    _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID,           \        jvalue* args)                                                       \    { return functions->Call##_jname##MethodA(this, obj, methodID, args); }#define CALL_TYPE(_jtype, _jname)                                           \    CALL_TYPE_METHOD(_jtype, _jname)                                        \    CALL_TYPE_METHODV(_jtype, _jname)                                       \    CALL_TYPE_METHODA(_jtype, _jname)    CALL_TYPE(jobject, Object)    CALL_TYPE(jboolean, Boolean)    CALL_TYPE(jbyte, Byte)    CALL_TYPE(jchar, Char)    CALL_TYPE(jshort, Short)    CALL_TYPE(jint, Int)    CALL_TYPE(jlong, Long)    CALL_TYPE(jfloat, Float)    CALL_TYPE(jdouble, Double)    void CallVoidMethod(jobject obj, jmethodID methodID, ...)    {        va_list args;        va_start(args, methodID);        functions->CallVoidMethodV(this, obj, methodID, args);        va_end(args);    }    void CallVoidMethodV(jobject obj, jmethodID methodID, va_list args)    { functions->CallVoidMethodV(this, obj, methodID, args); }    void CallVoidMethodA(jobject obj, jmethodID methodID, jvalue* args)    { functions->CallVoidMethodA(this, obj, methodID, args); }#define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                            \    __NDK_FPABI__                                                           \    _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz,        \        jmethodID methodID, ...)                                            \    {                                                                       \        _jtype result;                                                      \        va_list args;                                                       \        va_start(args, methodID);                                           \        result = functions->CallNonvirtual##_jname##MethodV(this, obj,      \                    clazz, methodID, args);                                 \        va_end(args);                                                       \        return result;                                                      \    }#define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                           \    __NDK_FPABI__                                                           \    _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz,       \        jmethodID methodID, va_list args)                                   \    { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz,   \        methodID, args); }#define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)                           \    __NDK_FPABI__                                                           \    _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz,       \        jmethodID methodID, jvalue* args)                                   \    { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz,   \        methodID, args); }#define CALL_NONVIRT_TYPE(_jtype, _jname)                                   \    CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                                \    CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                               \    CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)    CALL_NONVIRT_TYPE(jobject, Object)    CALL_NONVIRT_TYPE(jboolean, Boolean)    CALL_NONVIRT_TYPE(jbyte, Byte)    CALL_NONVIRT_TYPE(jchar, Char)    CALL_NONVIRT_TYPE(jshort, Short)    CALL_NONVIRT_TYPE(jint, Int)    CALL_NONVIRT_TYPE(jlong, Long)    CALL_NONVIRT_TYPE(jfloat, Float)    CALL_NONVIRT_TYPE(jdouble, Double)    void CallNonvirtualVoidMethod(jobject obj, jclass clazz,        jmethodID methodID, ...)    {        va_list args;        va_start(args, methodID);        functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args);        va_end(args);    }    void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,        jmethodID methodID, va_list args)    { functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); }    void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,        jmethodID methodID, jvalue* args)    { functions->CallNonvirtualVoidMethodA(this, obj, clazz, methodID, args); }    jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)    { return functions->GetFieldID(this, clazz, name, sig); }    jobject GetObjectField(jobject obj, jfieldID fieldID)    { return functions->GetObjectField(this, obj, fieldID); }    jboolean GetBooleanField(jobject obj, jfieldID fieldID)    { return functions->GetBooleanField(this, obj, fieldID); }    jbyte GetByteField(jobject obj, jfieldID fieldID)    { return functions->GetByteField(this, obj, fieldID); }    jchar GetCharField(jobject obj, jfieldID fieldID)    { return functions->GetCharField(this, obj, fieldID); }    jshort GetShortField(jobject obj, jfieldID fieldID)    { return functions->GetShortField(this, obj, fieldID); }    jint GetIntField(jobject obj, jfieldID fieldID)    { return functions->GetIntField(this, obj, fieldID); }    jlong GetLongField(jobject obj, jfieldID fieldID)    { return functions->GetLongField(this, obj, fieldID); }    __NDK_FPABI__    jfloat GetFloatField(jobject obj, jfieldID fieldID)    { return functions->GetFloatField(this, obj, fieldID); }    __NDK_FPABI__    jdouble GetDoubleField(jobject obj, jfieldID fieldID)    { return functions->GetDoubleField(this, obj, fieldID); }    void SetObjectField(jobject obj, jfieldID fieldID, jobject value)    { functions->SetObjectField(this, obj, fieldID, value); }    void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value)    { functions->SetBooleanField(this, obj, fieldID, value); }    void SetByteField(jobject obj, jfieldID fieldID, jbyte value)    { functions->SetByteField(this, obj, fieldID, value); }    void SetCharField(jobject obj, jfieldID fieldID, jchar value)    { functions->SetCharField(this, obj, fieldID, value); }    void SetShortField(jobject obj, jfieldID fieldID, jshort value)    { functions->SetShortField(this, obj, fieldID, value); }    void SetIntField(jobject obj, jfieldID fieldID, jint value)    { functions->SetIntField(this, obj, fieldID, value); }    void SetLongField(jobject obj, jfieldID fieldID, jlong value)    { functions->SetLongField(this, obj, fieldID, value); }    __NDK_FPABI__    void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)    { functions->SetFloatField(this, obj, fieldID, value); }    __NDK_FPABI__    void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)    { functions->SetDoubleField(this, obj, fieldID, value); }    jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)    { return functions->GetStaticMethodID(this, clazz, name, sig); }#define CALL_STATIC_TYPE_METHOD(_jtype, _jname)                             \    __NDK_FPABI__                                                           \    _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID,     \        ...)                                                                \    {                                                                       \        _jtype result;                                                      \        va_list args;                                                       \        va_start(args, methodID);                                           \        result = functions->CallStatic##_jname##MethodV(this, clazz,        \                    methodID, args);                                        \        va_end(args);                                                       \        return result;                                                      \    }#define CALL_STATIC_TYPE_METHODV(_jtype, _jname)                            \    __NDK_FPABI__                                                           \    _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID,    \        va_list args)                                                       \    { return functions->CallStatic##_jname##MethodV(this, clazz, methodID,  \        args); }#define CALL_STATIC_TYPE_METHODA(_jtype, _jname)                            \    __NDK_FPABI__                                                           \    _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID,    \        jvalue* args)                                                       \    { return functions->CallStatic##_jname##MethodA(this, clazz, methodID,  \        args); }#define CALL_STATIC_TYPE(_jtype, _jname)                                    \    CALL_STATIC_TYPE_METHOD(_jtype, _jname)                                 \    CALL_STATIC_TYPE_METHODV(_jtype, _jname)                                \    CALL_STATIC_TYPE_METHODA(_jtype, _jname)    CALL_STATIC_TYPE(jobject, Object)    CALL_STATIC_TYPE(jboolean, Boolean)    CALL_STATIC_TYPE(jbyte, Byte)    CALL_STATIC_TYPE(jchar, Char)    CALL_STATIC_TYPE(jshort, Short)    CALL_STATIC_TYPE(jint, Int)    CALL_STATIC_TYPE(jlong, Long)    CALL_STATIC_TYPE(jfloat, Float)    CALL_STATIC_TYPE(jdouble, Double)    void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...)    {        va_list args;        va_start(args, methodID);        functions->CallStaticVoidMethodV(this, clazz, methodID, args);        va_end(args);    }    void CallStaticVoidMethodV(jclass clazz, jmethodID methodID, va_list args)    { functions->CallStaticVoidMethodV(this, clazz, methodID, args); }    void CallStaticVoidMethodA(jclass clazz, jmethodID methodID, jvalue* args)    { functions->CallStaticVoidMethodA(this, clazz, methodID, args); }    jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)    { return functions->GetStaticFieldID(this, clazz, name, sig); }    jobject GetStaticObjectField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticObjectField(this, clazz, fieldID); }    jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticBooleanField(this, clazz, fieldID); }    jbyte GetStaticByteField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticByteField(this, clazz, fieldID); }    jchar GetStaticCharField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticCharField(this, clazz, fieldID); }    jshort GetStaticShortField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticShortField(this, clazz, fieldID); }    jint GetStaticIntField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticIntField(this, clazz, fieldID); }    jlong GetStaticLongField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticLongField(this, clazz, fieldID); }    __NDK_FPABI__    jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticFloatField(this, clazz, fieldID); }    __NDK_FPABI__    jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)    { return functions->GetStaticDoubleField(this, clazz, fieldID); }    void SetStaticObjectField(jclass clazz, jfieldID fieldID, jobject value)    { functions->SetStaticObjectField(this, clazz, fieldID, value); }    void SetStaticBooleanField(jclass clazz, jfieldID fieldID, jboolean value)    { functions->SetStaticBooleanField(this, clazz, fieldID, value); }    void SetStaticByteField(jclass clazz, jfieldID fieldID, jbyte value)    { functions->SetStaticByteField(this, clazz, fieldID, value); }    void SetStaticCharField(jclass clazz, jfieldID fieldID, jchar value)    { functions->SetStaticCharField(this, clazz, fieldID, value); }    void SetStaticShortField(jclass clazz, jfieldID fieldID, jshort value)    { functions->SetStaticShortField(this, clazz, fieldID, value); }    void SetStaticIntField(jclass clazz, jfieldID fieldID, jint value)    { functions->SetStaticIntField(this, clazz, fieldID, value); }    void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)    { functions->SetStaticLongField(this, clazz, fieldID, value); }    __NDK_FPABI__    void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)    { functions->SetStaticFloatField(this, clazz, fieldID, value); }    __NDK_FPABI__    void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)    { functions->SetStaticDoubleField(this, clazz, fieldID, value); }    jstring NewString(const jchar* unicodeChars, jsize len)    { return functions->NewString(this, unicodeChars, len); }    jsize GetStringLength(jstring string)    { return functions->GetStringLength(this, string); }    const jchar* GetStringChars(jstring string, jboolean* isCopy)    { return functions->GetStringChars(this, string, isCopy); }    void ReleaseStringChars(jstring string, const jchar* chars)    { functions->ReleaseStringChars(this, string, chars); }    jstring NewStringUTF(const char* bytes)    { return functions->NewStringUTF(this, bytes); }    jsize GetStringUTFLength(jstring string)    { return functions->GetStringUTFLength(this, string); }    const char* GetStringUTFChars(jstring string, jboolean* isCopy)    { return functions->GetStringUTFChars(this, string, isCopy); }    void ReleaseStringUTFChars(jstring string, const char* utf)    { functions->ReleaseStringUTFChars(this, string, utf); }    jsize GetArrayLength(jarray array)    { return functions->GetArrayLength(this, array); }    jobjectArray NewObjectArray(jsize length, jclass elementClass,        jobject initialElement)    { return functions->NewObjectArray(this, length, elementClass,        initialElement); }    jobject GetObjectArrayElement(jobjectArray array, jsize index)    { return functions->GetObjectArrayElement(this, array, index); }    void SetObjectArrayElement(jobjectArray array, jsize index, jobject value)    { functions->SetObjectArrayElement(this, array, index, value); }    jbooleanArray NewBooleanArray(jsize length)    { return functions->NewBooleanArray(this, length); }    jbyteArray NewByteArray(jsize length)    { return functions->NewByteArray(this, length); }    jcharArray NewCharArray(jsize length)    { return functions->NewCharArray(this, length); }    jshortArray NewShortArray(jsize length)    { return functions->NewShortArray(this, length); }    jintArray NewIntArray(jsize length)    { return functions->NewIntArray(this, length); }    jlongArray NewLongArray(jsize length)    { return functions->NewLongArray(this, length); }    jfloatArray NewFloatArray(jsize length)    { return functions->NewFloatArray(this, length); }    jdoubleArray NewDoubleArray(jsize length)    { return functions->NewDoubleArray(this, length); }    jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy)    { return functions->GetBooleanArrayElements(this, array, isCopy); }    jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy)    { return functions->GetByteArrayElements(this, array, isCopy); }    jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)    { return functions->GetCharArrayElements(this, array, isCopy); }    jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy)    { return functions->GetShortArrayElements(this, array, isCopy); }    jint* GetIntArrayElements(jintArray array, jboolean* isCopy)    { return functions->GetIntArrayElements(this, array, isCopy); }    jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy)    { return functions->GetLongArrayElements(this, array, isCopy); }    jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy)    { return functions->GetFloatArrayElements(this, array, isCopy); }    jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy)    { return functions->GetDoubleArrayElements(this, array, isCopy); }    void ReleaseBooleanArrayElements(jbooleanArray array, jboolean* elems,        jint mode)    { functions->ReleaseBooleanArrayElements(this, array, elems, mode); }    void ReleaseByteArrayElements(jbyteArray array, jbyte* elems,        jint mode)    { functions->ReleaseByteArrayElements(this, array, elems, mode); }    void ReleaseCharArrayElements(jcharArray array, jchar* elems,        jint mode)    { functions->ReleaseCharArrayElements(this, array, elems, mode); }    void ReleaseShortArrayElements(jshortArray array, jshort* elems,        jint mode)    { functions->ReleaseShortArrayElements(this, array, elems, mode); }    void ReleaseIntArrayElements(jintArray array, jint* elems,        jint mode)    { functions->ReleaseIntArrayElements(this, array, elems, mode); }    void ReleaseLongArrayElements(jlongArray array, jlong* elems,        jint mode)    { functions->ReleaseLongArrayElements(this, array, elems, mode); }    void ReleaseFloatArrayElements(jfloatArray array, jfloat* elems,        jint mode)    { functions->ReleaseFloatArrayElements(this, array, elems, mode); }    void ReleaseDoubleArrayElements(jdoubleArray array, jdouble* elems,        jint mode)    { functions->ReleaseDoubleArrayElements(this, array, elems, mode); }    void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,        jboolean* buf)    { functions->GetBooleanArrayRegion(this, array, start, len, buf); }    void GetByteArrayRegion(jbyteArray array, jsize start, jsize len,        jbyte* buf)    { functions->GetByteArrayRegion(this, array, start, len, buf); }    void GetCharArrayRegion(jcharArray array, jsize start, jsize len,        jchar* buf)    { functions->GetCharArrayRegion(this, array, start, len, buf); }    void GetShortArrayRegion(jshortArray array, jsize start, jsize len,        jshort* buf)    { functions->GetShortArrayRegion(this, array, start, len, buf); }    void GetIntArrayRegion(jintArray array, jsize start, jsize len,        jint* buf)    { functions->GetIntArrayRegion(this, array, start, len, buf); }    void GetLongArrayRegion(jlongArray array, jsize start, jsize len,        jlong* buf)    { functions->GetLongArrayRegion(this, array, start, len, buf); }    void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len,        jfloat* buf)    { functions->GetFloatArrayRegion(this, array, start, len, buf); }    void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,        jdouble* buf)    { functions->GetDoubleArrayRegion(this, array, start, len, buf); }    void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,        const jboolean* buf)    { functions->SetBooleanArrayRegion(this, array, start, len, buf); }    void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,        const jbyte* buf)    { functions->SetByteArrayRegion(this, array, start, len, buf); }    void SetCharArrayRegion(jcharArray array, jsize start, jsize len,        const jchar* buf)    { functions->SetCharArrayRegion(this, array, start, len, buf); }    void SetShortArrayRegion(jshortArray array, jsize start, jsize len,        const jshort* buf)    { functions->SetShortArrayRegion(this, array, start, len, buf); }    void SetIntArrayRegion(jintArray array, jsize start, jsize len,        const jint* buf)    { functions->SetIntArrayRegion(this, array, start, len, buf); }    void SetLongArrayRegion(jlongArray array, jsize start, jsize len,        const jlong* buf)    { functions->SetLongArrayRegion(this, array, start, len, buf); }    void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,        const jfloat* buf)    { functions->SetFloatArrayRegion(this, array, start, len, buf); }    void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,        const jdouble* buf)    { functions->SetDoubleArrayRegion(this, array, start, len, buf); }    jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,        jint nMethods)    { return functions->RegisterNatives(this, clazz, methods, nMethods); }    jint UnregisterNatives(jclass clazz)    { return functions->UnregisterNatives(this, clazz); }    jint MonitorEnter(jobject obj)    { return functions->MonitorEnter(this, obj); }    jint MonitorExit(jobject obj)    { return functions->MonitorExit(this, obj); }    jint GetJavaVM(JavaVM** vm)    { return functions->GetJavaVM(this, vm); }    void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)    { functions->GetStringRegion(this, str, start, len, buf); }    void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)    { return functions->GetStringUTFRegion(this, str, start, len, buf); }    void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy)    { return functions->GetPrimitiveArrayCritical(this, array, isCopy); }    void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode)    { functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); }    const jchar* GetStringCritical(jstring string, jboolean* isCopy)    { return functions->GetStringCritical(this, string, isCopy); }    void ReleaseStringCritical(jstring string, const jchar* carray)    { functions->ReleaseStringCritical(this, string, carray); }    jweak NewWeakGlobalRef(jobject obj)    { return functions->NewWeakGlobalRef(this, obj); }    void DeleteWeakGlobalRef(jweak obj)    { functions->DeleteWeakGlobalRef(this, obj); }    jboolean ExceptionCheck()    { return functions->ExceptionCheck(this); }    jobject NewDirectByteBuffer(void* address, jlong capacity)    { return functions->NewDirectByteBuffer(this, address, capacity); }    void* GetDirectBufferAddress(jobject buf)    { return functions->GetDirectBufferAddress(this, buf); }    jlong GetDirectBufferCapacity(jobject buf)    { return functions->GetDirectBufferCapacity(this, buf); }    /* added in JNI 1.6 */    jobjectRefType GetObjectRefType(jobject obj)    { return functions->GetObjectRefType(this, obj); }#endif /*__cplusplus*/};/* * JNI invocation interface. */struct JNIInvokeInterface {    void*       reserved0;    void*       reserved1;    void*       reserved2;    jint        (*DestroyJavaVM)(JavaVM*);    jint        (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);    jint        (*DetachCurrentThread)(JavaVM*);    jint        (*GetEnv)(JavaVM*, void**, jint);    jint        (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*);};/* * C++ version. */struct _JavaVM {    const struct JNIInvokeInterface* functions;#if defined(__cplusplus)    jint DestroyJavaVM()    { return functions->DestroyJavaVM(this); }    jint AttachCurrentThread(JNIEnv** p_env, void* thr_args)    { return functions->AttachCurrentThread(this, p_env, thr_args); }    jint DetachCurrentThread()    { return functions->DetachCurrentThread(this); }    jint GetEnv(void** env, jint version)    { return functions->GetEnv(this, env, version); }    jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args)    { return functions->AttachCurrentThreadAsDaemon(this, p_env, thr_args); }#endif /*__cplusplus*/};struct JavaVMAttachArgs {    jint        version;    /* must be >= JNI_VERSION_1_2 */    const char* name;       /* NULL or name of thread as modified UTF-8 str */    jobject     group;      /* global ref of a ThreadGroup object, or NULL */};typedef struct JavaVMAttachArgs JavaVMAttachArgs;/* * JNI 1.2+ initialization.  (As of 1.6, the pre-1.2 structures are no * longer supported.) */typedef struct JavaVMOption {    const char* optionString;    void*       extraInfo;} JavaVMOption;typedef struct JavaVMInitArgs {    jint        version;    /* use JNI_VERSION_1_2 or later */    jint        nOptions;    JavaVMOption* options;    jboolean    ignoreUnrecognized;} JavaVMInitArgs;#ifdef __cplusplusextern "C" {#endif/* * VM initialization functions. * * Note these are the only symbols exported for JNI by the VM. */#if 0  /* In practice, these are not exported by the NDK so don't declare them */jint JNI_GetDefaultJavaVMInitArgs(void*);jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);#endif#define JNIIMPORT#define JNIEXPORT  __attribute__ ((visibility ("default")))#define JNICALL __NDK_FPABI__/* * Prototypes for functions exported by loadable shared libs.  These are * called by JNI, not provided by JNI. */JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved);JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved);#ifdef __cplusplus}#endif/* * Manifest constants. */#define JNI_FALSE   0#define JNI_TRUE    1#define JNI_VERSION_1_1 0x00010001#define JNI_VERSION_1_2 0x00010002#define JNI_VERSION_1_4 0x00010004#define JNI_VERSION_1_6 0x00010006#define JNI_OK          (0)         /* no error */#define JNI_ERR         (-1)        /* generic error */#define JNI_EDETACHED   (-2)        /* thread detached from the VM */#define JNI_EVERSION    (-3)        /* JNI version error */#define JNI_COMMIT      1           /* copy content, do not free buffer */#define JNI_ABORT       2           /* free buffer w/o copying back */#endif  /* JNI_H_ */

更多相关文章

  1. C语言函数以及函数的使用
  2. sscanf函数引起android 5.0卡死,C++中慎用C库函数
  3. Android实现自己的回调函数
  4. Android库so文件及skia函数的调用
  5. mac 下Android及ant的环境变量配置
  6. Mac上如何使用adb命令进行操作?(Android studio 环境变量配置)

随机推荐

  1. android imageView 自适应大小
  2. Android config.gradle
  3. Android Base64字符串转换成图片
  4. android 导入工程出现很多错误 cannot be
  5. .NET跨平台机制一(mono for android配置教
  6. Android控件笔记——在界面中显示图片
  7. Android学习笔记_72_Spinner的用法
  8. android webview 面试
  9. Android应用程序组件Content Provider的
  10. android获得手机的电量