JNI函数(二)

Posted by Haiden on April 5, 2019

十、访问静态域

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接口指针
classjava 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接口指针
classjava 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接口指针
classjava 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 NULLJNI_TRUE表示返回一份copyJNI_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接口指针
stringJava 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 NULLJNI_TRUE表示返回一份copyJNI_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接口指针
stringJava 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虚拟机会返回内部指向字符串元素的指针,否则返回一个复制值。GetStringCriticalReleaseStringCritical 这些函数的使用必须非常小心,在这两个函数之间,本地代码必须不能调用任何可能阻塞当前线程的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接口指针
arrayJava数组
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 COPYJNI_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接口指针
arrayjava数组
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接口指针
arrayjava数组
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:目标数组
isCopyJNI_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: 之前获取的原始数组指针
mode0  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 *envjobject objectOrClass

14.2 UnregisterNatives

注销一个类的所有本地方法,这个类会回到之前被链接或注册本地方法之前的状态。

1
2
3
4
5
6
7
8
jint UnregisterNatives(JNIEnv *env, jclass clazz);
---------------------
//参数:
env JNI接口指针
clazzjava 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.Methodjava.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接口指针
fieldjava.lang.reflect.Field 对象

//返回值:
目标成员域的fieldID

17.3 ToReflectedMethod

转换 cls 的 methodID 为 java.lang.reflect.Methodjava.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,失败返回负数。