具有基本类型的JNI GetObjectClass

问题描述 投票:1回答:1

我有以下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(...

java jvm java-native-interface jvmti
1个回答
0
投票

用不是对象类型的GetObjectField调用jfieldID是非法的。对于原始字段,您需要调用其他Get[Type]Field函数之一,其中[Type]Int /Long/Boolean/ etc。>

由于您已经拥有jvmti_env,找到jfieldID类型的最简单方法是调用JVM TI GetFieldName函数。其中,它返回字段签名,即字段的类型。

唯一的问题是,jfieldID应始终与字段的所有者jclass伴随,因为字段ID是相对于特定类的。通常,当您获得jfieldID时,您已经知道其持有者类别。如果没有,在您的情况下,您有jObjectInstance-一个具有此字段的对象,因此可以使用JNI GetObjectClass函数从该实例派生holder类。

© www.soinside.com 2019 - 2024. All rights reserved.