如何测试 jobject Class<?> 引用是否属于特定的 class (JNI)
How to test if a jobject Class<?> reference is of a specific class (JNI)
在 JNI 中,如何测试作为 Class<?>
引用的 jobject
是否与 jclass
给出的 class 匹配?
示例:
我有以下 Class<?>
引用作为本机方法参数传递到 JNI 中:
jobject classRef
我可以从 class ref 中得到 jclass
class 描述符,如下所示:
jclass classRefDescriptor = (*env)->GetObjectClass(env, classRef);
然后我可以获得对 int.class
的 jclass
引用,如下所示:
jclass Integer_class = (*env)->FindClass(env, "java/lang/Integer");
jclass int_class = (*env)->GetStaticObjectField(env, Integer_class,
(*env)->GetStaticFieldID(env, Integer_class, "TYPE", "Ljava/lang/Class;"));
现在我想测试 classRef
是否与 int_class
相同 class 引用。
我尝试执行以下操作,基于 Java 如何让您测试 if (myObject.getClass() == int.class) { ... }
:
if (classRefDescriptor == int_class) { ... }
但这不起作用,两个 jclass
值相差几位。
有什么建议吗?
如果 classRef
实际上是一个 Class<T>
对象,那么 GetObjectClass()
将 return 一个匹配 Class<Class>
的 jclass
实例。
为什么不简单地使用 equals
?
jclass clsClass = env->GetObjectClass(classRef); /* Class<Class> */
jmethodID midClassEquals = env->GetMethodID(clsClass, "equals", "(Ljava/lang/Object;)Z");
jboolean areEqual = env->CallBooleanMethod(classRef, midClassEquals, int_class);
在 JNI 中,如何测试作为 Class<?>
引用的 jobject
是否与 jclass
给出的 class 匹配?
示例:
我有以下 Class<?>
引用作为本机方法参数传递到 JNI 中:
jobject classRef
我可以从 class ref 中得到 jclass
class 描述符,如下所示:
jclass classRefDescriptor = (*env)->GetObjectClass(env, classRef);
然后我可以获得对 int.class
的 jclass
引用,如下所示:
jclass Integer_class = (*env)->FindClass(env, "java/lang/Integer");
jclass int_class = (*env)->GetStaticObjectField(env, Integer_class,
(*env)->GetStaticFieldID(env, Integer_class, "TYPE", "Ljava/lang/Class;"));
现在我想测试 classRef
是否与 int_class
相同 class 引用。
我尝试执行以下操作,基于 Java 如何让您测试 if (myObject.getClass() == int.class) { ... }
:
if (classRefDescriptor == int_class) { ... }
但这不起作用,两个 jclass
值相差几位。
有什么建议吗?
如果 classRef
实际上是一个 Class<T>
对象,那么 GetObjectClass()
将 return 一个匹配 Class<Class>
的 jclass
实例。
为什么不简单地使用 equals
?
jclass clsClass = env->GetObjectClass(classRef); /* Class<Class> */
jmethodID midClassEquals = env->GetMethodID(clsClass, "equals", "(Ljava/lang/Object;)Z");
jboolean areEqual = env->CallBooleanMethod(classRef, midClassEquals, int_class);