有什么方法可以测试来自同一类的两个jobject?

时间:2018-12-24 11:55:44

标签: java c++ java-native-interface

对于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类的实例。

1 个答案:

答案 0 :(得分:1)

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 ,则必须检查这些列表中的元素,因为有关泛型的信息仅是编译时:

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

PS 我真的不明白为什么要为此任务使用专用的本机方法。正如其他(已删除的)答案所建议的那样,这是Java中的一种语言,它们更易于理解并且没有性能问题。此功能仅与更大的JNI库的构建块有关,因此您需要在返回之前释放所有本地引用。