返回

JNI访问Java类的静态成员

Android

JNI访问Java类的静态成员

JNI访问Java类的静态成员主要包括Java静态成员的动态注册和回调两种方法。

Java静态成员的动态注册

Java静态成员的动态注册主要包括预备工作和生成动态注册代码。

预备工作

  1. 创建一个头文件,头文件中需要包含以下内容:
#include <jni.h>
#include <stdio.h>
  1. 在头文件中声明一个Java类的静态变量,例如:
extern jint g_iStaticVar;
  1. 在头文件中声明一个Java类的静态方法,例如:
extern void g_vStaticMethod();

生成动态注册代码

  1. 使用javah命令生成头文件,例如:
javah -jni Hello
  1. 在头文件中找到Java类的静态变量和静态方法的声明,例如:
JNIEXPORT jint JNICALL Java_Hello_getStaticVar(JNIEnv *, jclass);
JNIEXPORT void JNICALL Java_Hello_setStaticVar(JNIEnv *, jclass, jint);
JNIEXPORT void JNICALL Java_Hello_staticMethod(JNIEnv *, jclass);
  1. 在头文件中添加以下代码:
jint g_iStaticVar;
void g_vStaticMethod();

Java静态成员的回调

从JNI层访问Java类的静态变量

  1. 在JNI层使用JavaVM获取Java虚拟机,例如:
JNIEnv *env;
JavaVM *jvm;
jint res = JNI_GetCreatedJavaVMs(&jvm, 1, NULL);
res = jvm->GetEnv((void **)&env, JNI_VERSION_1_6);
  1. 在JNI层使用FindClass获取Java类的静态变量的字段ID,例如:
jclass cls = env->FindClass("Hello");
jfieldID fid = env->GetStaticFieldID(cls, "g_iStaticVar", "I");
  1. 在JNI层使用GetStaticIntField获取Java类的静态变量的值,例如:
jint value = env->GetStaticIntField(cls, fid);

从JNI层访问Java类的静态方法

  1. 在JNI层使用JavaVM获取Java虚拟机,例如:
JNIEnv *env;
JavaVM *jvm;
jint res = JNI_GetCreatedJavaVMs(&jvm, 1, NULL);
res = jvm->GetEnv((void **)&env, JNI_VERSION_1_6);
  1. 在JNI层使用FindClass获取Java类的静态方法的函数ID,例如:
jclass cls = env->FindClass("Hello");
jmethodID mid = env->GetStaticMethodID(cls, "g_vStaticMethod", "()V");
  1. 在JNI层使用CallStaticVoidMethod调用Java类的静态方法,例如:
env->CallStaticVoidMethod(cls, mid);