JNI 函数(八)反射支持、获取虚拟机
一、反射支持
如果程序员知道方法和属性的名称和类型,则直接使用 JNI 调用 Java 方法或者访问 Java 字段。Java 核心反射 API 允许在运行时反射 Java 类。JNI 提供了 JNI 中使用的字段和方法 ID 与 Java Core Reflection API 中使用的字段和方法对象之间的一组转换函数。
(一)、转化获取方法ID
函数原型:jmethodID FromReflectedMethod(JNIEnv *env,jobject method);
将 java.lang.reflect.Method 或者 java.lang.reflect.Constructor 对象转换为方法 ID
参数:
env:JNIEnv 接口指针
method:java.lang.reflect.Method 或者 java.lang.reflect.Constructor 对象
返回:
方法 ID
(二)、转化获取属性ID
函数原型:jfield FromReflectedField(JNIEnv *env,jobject field);
将 java.lang.reflect.Field 转化域 ID
参数:
env:JNIEnv 接口指针
field:java.lang.reflect.Field 对象
返回:
域 ID
(三)、反转化并获取方法对象
函数原型:jobject ToReflectedMethod(JNIEnv *env,jclass clazz,jmethodID methodID, jboolean isStatic);
将源自 cls 的方法 ID 转化为 java.lang.reflect.Method 或者 java.lang.reflect.Constructor 对象。如果方法 ID 指向一个静态属性,isStatic 必须设置为 JNI_TRUE,否则为 JNI_FALSE。
参数:
env:JNIEnv 接口指针
clazz:Java 类对象
methodID:Java 类对应的方法 id
isStatic:是否是静态方法
返回
对应 Java 层 java.lang.reflect.Method 或者 java.lang.reflect.Constructor 对象。如果失败,则返回 0
异常:
如果内存不足,则抛出 OutOfMemoryError。
(四)、反转化并获取属性对象
函数原型:jobject ToReflectedField(JNIEnv *env,jclass cls,jfieldID field,jboolean isStatic)
将来源于 cls 的属性 ID 转化为 java.lang.reflect.Field 对象。如果属性 ID 指向一个静态属性,isStatic 必须设置为 JNI_TRUE,否则为 JNI_FALSE。
参数:
env:JNIEnv 接口指针
cls:Java 类对象
methodID:Java 对应的属性 ID
isStatic:是否是静态属性
返回:
成功返回 java.lang.reflect.Field 对象,失败返回 0
异常:
如果内存不足,则抛出 OutOfMemoryError
二、获取虚拟机
函数原型:jint GetJavaVM(JNIEnv *env, JavaVM **vm);
返回当前线程对应的 java 虚拟机接口。返回的结果保存在 vm。
参数:
env:JNI 接口指针
vm:保存虚拟机指针
返回:
成功返回 0,失败返回负数