【发布时间】:2020-06-03 16:31:14
【问题描述】:
我有以下 JNI/JVMTI 代码:
jfieldID field = ...;
jobject fieldValue = (*jni_env)->GetObjectField(jni_env, jObjectInstance, field);
jclass fieldClass = (*jni_env)->GetObjectClass(jni_env, fieldValue);
char* signature_ptr;
char* generic_ptr;
(*jvmti_env)->GetClassSignature(jvmti_env, fieldClass, &signature_ptr, &generic_ptr);
只要 field 是引用类型(java.lang.Object 和子类型),此代码就可以工作。如果 field 是原始类型,它会在尝试执行 GetObjectClass 时使 JVM 崩溃。
我的问题是:如何使用 field 和 fieldValue 来确定它是否是原始类型以及是否是原始类型,哪个(int,long ,布尔值等)?
我是 JNI/JVMTI 的新手,所以如果答案很明显,请多多包涵。
谢谢!
【问题讨论】:
-
您是如何获得
jfieldID field的? JNIGetFieldID函数需要字段名和签名,所以通常在获取jfieldID时,你已经知道了字段的类型。 -
JVMTI GetClassFields 中有一个方法可以返回一个 jclass 的所有字段。
标签: java jvm java-native-interface jvmti