我有以下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,boolean等)?] >我是JNI / JVMTI的新手,因此,如果答案很明显,请多多包涵。
谢谢!
我有以下JNI / JVMTI代码:jfieldID field = ...; jobject fieldValue =(** jni_env)-> GetObjectField(jni_env,jObjectInstance,field); jclass fieldClass =(* jni_env)-> GetObjectClass(...
用不是对象类型的GetObjectField
调用jfieldID
是非法的。对于原始字段,您需要调用其他Get[Type]Field
函数之一,其中[Type]
为Int
/Long
/Boolean
/ etc。>
由于您已经拥有jvmti_env
,找到jfieldID
类型的最简单方法是调用JVM TI GetFieldName函数。其中,它返回字段签名,即字段的类型。
唯一的问题是,jfieldID
应始终与字段的所有者jclass
伴随,因为字段ID是相对于特定类的。通常,当您获得jfieldID
时,您已经知道其持有者类别。如果没有,在您的情况下,您有jObjectInstance
-一个具有此字段的对象,因此可以使用JNI GetObjectClass函数从该实例派生holder类。