gpt4 book ai didi

java - 有什么方法可以测试两个 jobject 是否来自同一个类(class)?

转载 作者:行者123 更新时间:2023-11-30 04:53:26 25 4
gpt4 key购买 nike

对于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;
}

如果 jobj2 可能是 derived 来自 jobj1 的类,您可以轻松地降低此测试的严格性。但是也许这两个对象都是 派生 来自同一个基类,例如来自 java.util.ArrayList — 那么您必须将此类提供给您的测试方法。

如果你想知道jobj1jobj2是同一类型的ArrayList,你必须检查这些列表的元素,因为关于泛型的信息只是编译时的:

  • 检查 jobj1 是 ArrayList 的实例
  • 检查 jobj2 是 ArrayList 的实例
  • 获取jobj1的第一个非空元素jel1
  • 获取jobj2的第一个非空元素jel2
  • 检查 jel1 的类是否等于 jel2 的类

PS 我真的不明白为什么要为这个任务使用专用的本地方法;正如其他(已删除)答案所建议的那样,这是 Java 中的单行代码,它们更容易理解并且没有性能问题。此函数仅作为更大的 JNI 库的构建 block 相关,因此您需要在返回之前释放所有本地引用。

关于java - 有什么方法可以测试两个 jobject 是否来自同一个类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53913104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com