十、访问静态域
10.1 GetStaticFieldID
返回类的静态域的fieldID,这个静态域通过字段名和签名来指定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
----------------------------
//参数:
env :JNI接口指针
clazz :java class object
name:静态域的名称
sig :静态域的签名
//返回值:
返回fieldID,无法指定的静态域没有找到则返回 NULL
//抛出异常:
NoSuchFieldError :如果指定的静态域没有被找到
ExceptionInInitializerError:如果类在初始化的过程中出现异常。
10.2 GetStaticField
一系列函数用于获取不同类型的静态域。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID);
jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID);
------------------------
//参数:
env :JNI接口指针
class:java class对象
fieldId: 静态域的fieldId.
//返回值:
返回静态域的值。
10.3 SetStaticField
一系列设置不同类型静态域的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
void SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
-----------------------------
//参数:
env :JNI接口指针
class:java class对象
fieldId: 静态域的fieldId.
value:静态域的新值
十一、调用静态方法
11.1 GetStaticMethodID
返回类的静态方法的methodID,静态方法按方法名和签名来指定。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig);
---------------------------
//参数:
env :JNI接口指针
class:java class对象。
name:静态方法名(MUTF-8编码字符串)
sig:静态方法签名(MUTF-8编码字符串)
//返回值:
返回静态方法的methodID,或操作失败返回 NULL
//抛出异常:
NoSucMethodError :如果指定的方法没有被找到
ExceptionInInitializerError: 如果在初始化类的过程中出现异常
OutOfMemoryError ; 如果系统内存不足时。
11.2 CallStaticMethod(MethodA, MethodV)
一系列调用不同类型的静态方法的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
NativeType CallStatic<type>Method(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
NativeType CallStatic<type>MethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
NativeType CallStatic<type>MethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
-----------------------------
//参数:
env :JNI接口指针
clazz: Java class对象
methodId: 静态方法methodID
//返回值:
返回Java静态方法返回的结果。
十二、操作字符串
12.1 NewString
使用unicode字符串数组来构造一个 java.lang.String
对象。
1
2
3
4
5
6
7
8
9
10
11
12
jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);
-------------------------
//参数:
env :JNI接口指针
unicodeChars :指向unicode字符串的指针
len : unicode字符串的长度
//返回值:
返回一个Java String对象,当字符串无法被构造时返回 NULL
//抛出异常:
OutOfMemoryError 如果系统内存不足时。
12.2 GetStringLength
返回Java String的长度(unicode字符串数组的长度)
1
2
3
4
5
6
7
8
jsize GetStringLength(JNIEnv *env, jstring string);
-------------------------
//参数:
env :JNI接口指针
string:需要获取长度的字符串
//返回值:
Java String的长度
12.3 GetStringChars
返回Java String对象的unicode字符串数组的指针。这个指针一直在调用 ReleaseStringchars()
方法前都有效。
1
2
3
4
5
6
7
8
9
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);
-----------------------
//参数:
env :JNI接口指针
string:目标Java String对象
isCopy :NULL或JNI_TRUE表示返回一份copy,JNI_FALSE表示不copy,直接返回指向Java String的原始地址
//返回值:
返回unicode 字符串的指针。操作失败而返回 NULL
12.4 ReleaseStringChars
通知虚拟机本地代码不再需要访问 chars
1
2
3
4
5
6
void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars);
----------------------------
//参数:
env :JNI接口指针
string:一个java字符串对象
chars:指向unicode字符串的指针
12.5 NewStringUTF
根据一个MUTF-8编码的字符串数组来构建一个 java.lang.String
对象。
1
2
3
4
5
6
7
8
9
10
11
jstring NewStringUTF(JNIEnv *env, const char *bytes);
-------------------------
//参数:
env :JNI接口指针
bytes:指向MUTF-8编码字符串的指针。
//返回值:
返回一个Java String对象,或失败时返回 NULL
//抛出异常:
OutOfMemoryError 如果系统内存不足时。
12.6 GetStringUTFLength
返回代表字符串的MUTF-8编码字符串数组长度
1
2
3
4
5
6
7
8
jsize GetStringUTFLength(JNIEnv *env, jstring string);
------------------------
//参数:
env :JNI接口指针
string:Java String对象
//返回值:
返回字符串的MUTF-8编码字符串数组的长度。
12.7 GetStringUTFChars
回一个指针,指向代表字符串MUTF-8编码的字节数组。这个数组的指针一个在调用 ReleaseStrinUTFChars()
前有效。
1
2
3
4
5
6
7
8
9
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
--------------------------
//参数:
env :JNI接口指针
string:目标Java String对象
isCopy :NULL或JNI_TRUE表示返回一份copy,JNI_FALSE表示不copy,直接返回指向Java String的原始地址
//返回值:
返回指向MUTF-8字符串的指针,或失败返回 NULL
12.8 ReleaseStringUTFChars
通知Java虚拟机本地代码不需要访问 utf
了。
1
2
3
4
5
6
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);
-------------------------
//参数:
env :JNI接口指针
string:Java String对象
utf:指向MUTF-8字符串的指针
12.9 GetStringRegion
从 start
偏移量开始拷贝len
个unicode字符到指定的 buf
缓存中。
1
2
3
4
5
6
7
8
9
10
11
oid GetStringRegion(JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
----------------------
//参数:
env :JNI接口指针
str: 目标Java String对象
start : 偏移量
len:拷贝的长度
buf : 拷贝到的目标缓存buffer
//抛出异常:
StringIndexOutOfBoundsException 当指针越界时
12.10 GetStringUTFRegion
从 start
偏移量开始拷贝len
个unicode字符,将其转换成MUTF-8编码,放置到指定的 buf
缓存中。
1
2
3
4
5
6
7
8
9
10
11
void GetStringUTFRegion(JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
------------------------
//参数:
env :JNI接口指针
str: 目标Java String对象
start : 偏移量
len:拷贝的长度
buf : 拷贝到的目标缓存buffer
//抛出异常:
StringIndexOutOfBoundsException 当指针越界时
12.11 GetStringCritical
和GetStringChars函数类似,如果可能,Java虚拟机会返回内部指向字符串元素的指针,否则返回一个复制值。GetStringCritical
和 ReleaseStringCritical
这些函数的使用必须非常小心,在这两个函数之间,本地代码必须不能调用任何可能阻塞当前线程的JNI函数。
1
2
3
4
5
6
7
8
9
const jchar * GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy);
--------------------
//参数:
env :JNI接口指针
jstring : 目标Java字符串对象
isCopy :是否复制值。
//返回值:
虚拟机内部指向字符串元素的指针。
12.12 ReleaseStringCritical
释放由 GetStringCritical
函数调用获得的字符串指针。
1
2
3
4
5
6
void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar *carray);
----------------------
//参数:
env :JNI接口指针
string:字符串对象
carray: 获取到的字符串指针。
十三、操作数组
13.1 GetArrayLength
返回数组(array)的元素个数。
1
2
3
4
5
6
7
8
jsize GetArrayLength(JNIEnv *env, jarray array);
------------------------
//参数:
env :JNI接口指针
array:目标Java数组对象
//返回值:
返回数组的长度
13.2 NewObjectArray
构造一个新的 elementClass
类型的数组,并设置其初始值。
1
2
3
4
5
6
7
8
9
10
11
12
13
jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement);
-----------------------
//参数:
env :JNI接口指针
length:数组长度
elementClass :数组元素的class
initialElement:初始化数组元素
//返回值:
返回一个Java数组对象,如果数组不能被构造则返回 NULL。
//抛出异常:
OutOfMemoryError :如果系统内存不足时。
13.3 GetObjectArrayElement
返回数组的index处的元素对象。
1
2
3
4
5
6
7
8
9
10
11
12
jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index);
-----------------------
//参数:
env :JNI接口指针
array:Java数组
index:数组下标
//返回值:
返回一个Java对象。
//抛出异常:
ArrayIndexOutOfBoundsException: 如果index数组越界时。
13.4 SetObjectArrayElement
设置数组的某个值。
1
2
3
4
5
6
7
8
9
10
11
void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value);
------------------------
//参数:
env :JNI接口指针
array:一个Java数组
index:数组下标
value:设置的新值
//抛出异常:
ArrayIndexOutOfBoundsException ,如果 index 数组越界时。
ArrayStoreException ,如果 value 类型错误时。
13.5 NewArray
一组函数用于构造各种不同基本类型的数组对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
jbooleanArray NewBooleanArray(JNIEnv *env, jsize length);
jbyteArray NewByteArray(JNIEnv *env, jsize length);
jcharArray NewCharArray(JNIEnv *env, jsize length);
jshortArray NewShortArray(JNIEnv *env, jsize length);
jintArray NewIntArray(JNIEnv *env, jsize length);
jlongArray NewLongArray(JNIEnv *env, jsize length);
jfloatArray NewFloatArray(JNIEnv *env, jsize length);
jdoubleArray NewDoubleArray(JNIEnv *env, jsize length);
------------------------
//参数:
env :JNI接口指针
length:数组长度
//返回值:
返回Java数组,数组无法被构造则返回 NULL。
13.6 GetArrayElements
一组函数用于获取各种不同基本类型数组的元素。对于返回值的修改不一定会对原始数组产生影响,直到调用了相应的 Release<Type>ArrayElements()
才可能影响到原始数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
jboolean GetBooleanArrayElements(JNIEnv *env, jbooleanArray array, jboolean *isCopy);
jbyte GetByteArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy);
jchar GetCharArrayElements(JNIEnv *env, jcharArray array, jboolean *isCopy);
jshort GetShortArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy);
jint GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy);
jlong GetLongArrayElements(JNIEnv *env, jlongArray array, jboolean *isCopy);
jfloat GetFloatArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy);
jdouble GetDoubleArrayElements(JNIEnv *env, jdoubleArray array, jboolean *isCopy);
-------------------------
//参数:
env :JNI接口指针
array:目标数组
isCopy: NULL或 JNI_FALSE 不COPY,JNI_TRUE 返回COPY值。
//返回值:
返回数组某个元素的指针。或失败返回 NULL 。
13.7 ReleaseArrayElements
一组函数通知虚拟机本地代码不再需要访问数组中的元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
void ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
void ReleaseCharArrayElements(JNIEnv *env, jcharArray array, jchar *elems, jint mode);
void ReleaseShortArrayElements(JNIEnv *env, jshortArray array, jshort *elems, jint mode);
void ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems, jint mode);
void ReleaseLongArrayElements(JNIEnv *env, jlongArray array, jlong *elems, jint mode);
void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
------------------------
//参数:
env :JNI接口指针
mode = 0 , 将内容复制回原始数组,并释放 elems (通常情况下都传入0即可)
mode = JNI_COMMIT ,将内容复制回原始数组,但不释放 elems
mode = JNI_ABORT ,不将内容复制回原始数组,并释放 elems
13.8 GetArrayRegion
一组函数用来复制基本类型数据的一部分值到buffer。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start, jsize len, jboolean *buf);
void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
---------------------------
//参数:
env :JNI接口指针
array:java数组
start :起始的下标
len:需要复制的元素个数
buf:目标buffer
//抛出异常:
ArrayIndexOutOfBoundsException :如果数组越界时。
13.9 SetArrayRegion
一组从buffer复制回基本类型数组的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start, jsize len, const jboolean *buf);
void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);
void SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);
void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);
void SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);
void SetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);
void SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);
void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);
---------------------------
//参数:
env :JNI接口指针
array:java数组
start :起始的下标
len:需要复制的元素个数
buf:数据源buffer
//抛出异常:
ArrayIndexOutOfBoundsException :如果数组越界时。
13.10 GetPrimitiveArrayCritical
和 Get<type>ArrayElements
函数类似,但如果可能的话,Java虚拟机会返回一个基本类型数组的原始指针,否则返回一个copy值得指针。
1
2
3
4
5
6
void * GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy);
---------------------------
//参数:
env :JNI接口指针
array:目标数组
isCopy:JNI_TRUE复制值,JNI_FALSE不复制。
13.11 ReleasePrimitiveArrayCritical
释放由 GetPrimitiveArrayCritical
函数获取的数组原始指针。
1
2
3
4
5
6
7
void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode);
------------------------------
//参数:
env :JNI接口指针
array:目标数组
carray: 之前获取的原始数组指针
mode:0 或 JNI_COMMIT 或 JNI_ABORT
十四、注册本地方法
14.1 RegisterNatives
给clazz注册一个本地方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
--------------------
//参数:
env :JNI接口指针
clazz:指定的java class对象
methods:原生方法列表
nMethods: 原生方法列表数量
//返回值:
成功返回0, 失败返回负数
//抛出异常:
NoSuchMethodError: 如果指定的方法没有找到,或者方法不是native。
JNINativeMethod定义为:
1
2
3
4
5
typedef struct {
char *name;
char *signature;
void *fnPtr;
} JNINativeMethod;
这些本地函数必须至少有2个参数,且前2个参数必须依次是:JNIEnv *env
,jobject objectOrClass
14.2 UnregisterNatives
注销一个类的所有本地方法,这个类会回到之前被链接或注册本地方法之前的状态。
1
2
3
4
5
6
7
8
jint UnregisterNatives(JNIEnv *env, jclass clazz);
---------------------
//参数:
env :JNI接口指针
clazz:java class对象
//返回值:
成功返回0, 失败返回负数。
十五、操作监视器(同步锁)
15.1 MonitorEnter
进入一个obj的监视区monitor。即使用 obj 作为锁对象(可能是对象锁,也可能是类锁),obj必须不能为 null。
为了避免死锁,使用 MonitorEnter
方法来进入监视区,必须使用MonitorExit
来退出,或调用 DetachCurrentThread
来明确释放JNI监视区。
1
2
3
4
5
6
7
8
jint MonitorEnter(JNIEnv *env, jobject obj);
--------------------
//参数:
env :JNI接口指针
obj:一个普通的java对象或class对象。
//返回值:
成功返回0,失败返回负数。
15.2 MonitorExit
当前线程必须持有obj的monitor,当前线程进入monitor的计数器减1,如果计数器的值变为了0,则当前线程释放monitor。
本地代码不能使用 MonitorExit
函数来退出一个通过Java虚拟机 monitorexit
指令或一个同步方法进入的monitor。
1
2
3
4
5
6
7
8
9
10
11
jint MonitorExit(JNIEnv *env, jobject obj);
--------------------
//参数:
env :JNI接口指针
obj:一个java对象或一个class对象
//返回值:
成功返回0,失败返回负数。
//排除异常:
IllegalMonitorStateException如果当前线程还没持有monitor。
十六、NIO支持
16.1 NewDirectByteBuffer
分配并返回一个 java.nio.ByteBuffer
,指向一块内存,地址开始于 address
,并有 capacity
个bytes的内存空间。
1
2
3
4
5
6
7
8
9
10
11
12
jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
----------------------
//参数:
env :JNI接口指针
address:内存空间起始地址(必须不为 NULL )
capacity:内存空间的大小(字节数)(必须为整数)
//返回值:
返回刚创建的 java.nio.ByteBuffer 对象的局部引用。如果有异常抛出或者虚拟机不允许JNI访问直接的buffer,则返回 NULL
//抛出异常:
OutOfMemoryError: 如果分配 ByteBuffer 对象失败时。
16.2 GetDirectBufferAddress
获取给定的 java.nio.Buffer
的起始内存地址。这个函数通过buffer对象允许本地代码访问Java代码可访问的同一块内存地址。
1
2
3
4
5
6
7
8
oid* GetDirectBufferAddress(JNIEnv* env, jobject buf);
-----------------------
//参数:
env :JNI接口指针
buf:给定的 java.nio.Buffer 对象(必须不能为 NULL )
//返回值:
返回buffer指向的起始内存地址。如果内存地址是undefined的,如果给定的jobject不是 java.nio.Buffer 或者如果虚拟机不支持JNI访问直接的buffer,则返回 NULL 。
16.3 GetDirectBufferCapacity
获取并返回给定 java.nio.Buffer
对象的内存空间大小(capacity)。capacity是内存空间包含的元素的个数.
1
2
3
4
5
6
7
8
9
jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf);
----------------------
//参数:
env :JNI接口指针
buf : 给定的buffer对象。(必须不能为 NULL )
//返回值:
返回buffer对应的内存空间的capacity。如果给定的jobject不是 java.nio.Buffer ,或者虚拟机不允许JNI访问direct buffer,则返回 -1 。
十七、反射支持
17.1 FromReflectedMethod
通过 java.lang.reflect.Method
或 java.lang.reflect.Constructor
来获取其反射的目标方法对应的 methodId.
1
2
3
4
5
6
7
8
jmethodID FromReflectedMethod(JNIEnv *env, jobject method);
----------------------
//参数:
env :JNI接口指针
jobject:一个 java.lang.reflect.Method 或 java.lang.reflect.Constructor 对象。
//返回值:
反射的目标方法的methodID
17.2 FromReflectedField
通过 java.lang.reflect.Field
对象来获取fieldID.
1
2
3
4
5
6
7
8
jfieldID FromReflectedField(JNIEnv *env, jobject field);
---------------------
//参数:
env :JNI接口指针
field:java.lang.reflect.Field 对象
//返回值:
目标成员域的fieldID
17.3 ToReflectedMethod
转换 cls 的 methodID 为 java.lang.reflect.Method
或java.lang.reflect.Constructor
对象。
1
2
3
4
5
6
7
8
9
10
jobject ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
-----------------------
//参数:
env :JNI接口指针
cls:目标方法的java类对象
jmethodId :目标方法的methodID
isStatic:目标方法为静态的则比较将 isStatic 设置为 JNI_TRUE ,否则设置为 JNI_FALSE 。
//返回值:
java.lang.reflect.Method 或java.lang.reflect.Constructor对象
17.4 ToReflectedField
转换 cls 的 fieldID 为 java.lang.reflect.Field
对象。
1
2
3
4
5
6
7
8
9
10
jobject ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
-------------------------
//参数:
env :JNI接口指针
cls:目标方法的java类对象
jmethodId :目标方法的methodID
isStatic:目标方法为静态的则比较将 isStatic 设置为 JNI_TRUE ,否则设置为 JNI_FALSE 。
//返回值:
java.lang.reflect.Field 对象
十八、Java虚拟机接口
18.1 GetJavaVM
返回关联到当前线程的Java虚拟机接口指针。
1
2
3
4
5
6
7
8
jint GetJavaVM(JNIEnv *env, JavaVM **vm);
----------------------
//参数:
env :JNI接口指针
vm: 用于存放返回的Java虚拟机指针
//返回值:
成功返回0,失败返回负数。