返回
JNI访问Java类的静态成员
Android
2023-09-23 11:50:15
JNI访问Java类的静态成员
JNI访问Java类的静态成员主要包括Java静态成员的动态注册和回调两种方法。
Java静态成员的动态注册
Java静态成员的动态注册主要包括预备工作和生成动态注册代码。
预备工作
- 创建一个头文件,头文件中需要包含以下内容:
#include <jni.h>
#include <stdio.h>
- 在头文件中声明一个Java类的静态变量,例如:
extern jint g_iStaticVar;
- 在头文件中声明一个Java类的静态方法,例如:
extern void g_vStaticMethod();
生成动态注册代码
- 使用javah命令生成头文件,例如:
javah -jni Hello
- 在头文件中找到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);
- 在头文件中添加以下代码:
jint g_iStaticVar;
void g_vStaticMethod();
Java静态成员的回调
从JNI层访问Java类的静态变量
- 在JNI层使用JavaVM获取Java虚拟机,例如:
JNIEnv *env;
JavaVM *jvm;
jint res = JNI_GetCreatedJavaVMs(&jvm, 1, NULL);
res = jvm->GetEnv((void **)&env, JNI_VERSION_1_6);
- 在JNI层使用FindClass获取Java类的静态变量的字段ID,例如:
jclass cls = env->FindClass("Hello");
jfieldID fid = env->GetStaticFieldID(cls, "g_iStaticVar", "I");
- 在JNI层使用GetStaticIntField获取Java类的静态变量的值,例如:
jint value = env->GetStaticIntField(cls, fid);
从JNI层访问Java类的静态方法
- 在JNI层使用JavaVM获取Java虚拟机,例如:
JNIEnv *env;
JavaVM *jvm;
jint res = JNI_GetCreatedJavaVMs(&jvm, 1, NULL);
res = jvm->GetEnv((void **)&env, JNI_VERSION_1_6);
- 在JNI层使用FindClass获取Java类的静态方法的函数ID,例如:
jclass cls = env->FindClass("Hello");
jmethodID mid = env->GetStaticMethodID(cls, "g_vStaticMethod", "()V");
- 在JNI层使用CallStaticVoidMethod调用Java类的静态方法,例如:
env->CallStaticVoidMethod(cls, mid);