JNI 函数(八)反射支持、获取虚拟机

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,失败返回负数

原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/14136192.html