对于JNI,我有两个jobject jobj1和jobj2,如何测试它们是同一类的实例?
我想测试两个jobject jobj1和jobj2是否是同一类的实例。
JNIEXPORT jboolean JNICALL TestTwoObjectEqual
(JNIEnv *env, jclass jclazz, jobject jobj1, jobject jobj2);
I tried jclass cls_arraylist1 = env->GetObjectClass(jobj1);
jclass cls_arraylist2 = env->GetObjectClass(jobj2);
然后比较* cls_arraylist1 == * cls_arraylist2,但未定义==。
如何测试jobj1和jobj2是否是同一JAVA类的实例。
最佳答案
bool testTwoObjectEqual(JNIEnv *env, jobject jobj1, jobject jobj2) {
jclass cls1 = env->GetObjectClass(jobj1);
jclass cls2 = env->GetObjectClass(jobj2);
bool res = env->IsInstanceOf(jobj1, cls2) && env->IsInstanceOf(jobj2, cls1);
env->FreeLocalRef(cls1);
env->FreeLocalRef(cls2);
return res;
}
如果可以从 jobj1 的类派生 jobj2 ,则可以轻松地使此测试不太严格。但是也许两个对象都来自同一个基类就可以了,例如从 java.util.ArrayList —开始,那么您必须将此类提供给您的测试方法。
如果您想知道 jobj1 和 jobj2 是相同类型的 ArrayList ,则必须检查这些列表的元素,因为有关泛型的信息仅在编译时:
PS 我不太明白为什么要为此任务使用专用的本机方法。正如其他(已删除的)答案所建议的那样,这是Java中的一种语言,它们更易于理解并且没有性能问题。该函数仅与更大的JNI库的构建块相关,因此您需要在返回之前释放所有本地引用。
关于java - 是否有任何方法可以测试来自同一类的两个jobject?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53913104/