Есть ли метод для проверки двух рабочих мест из одного класса? - PullRequest
0 голосов
/ 24 декабря 2018

Для JNI у меня есть два jobject jobj1 и jobj2, как я могу проверить, что они являются экземплярами одного и того же класса?

Я хочу проверить, являются ли два jobject jobj1 и jobj2 экземплярами одного и того же класса.class.

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 голосов
/ 24 декабря 2018
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 может быть производным из класса jobj1 .Но, возможно, все в порядке, что оба объекта получены из одного и того же базового класса, например, из java.util.ArrayList - тогда вы должны предоставить этот класс в свой метод тестирования.

Если вы хотите знать, что jobj1 и jobj2 являются ArrayList s одного типа, вы должны проверить элементы этих списков, потому что информация оОбобщение только во время компиляции:

  • проверить, что jobj1 является экземпляром ArrayList
  • проверить, что jobj2 является экземпляром ArrayList
  • получить первый ненулевой элементjobj1, jel1
  • получить первый ненулевой элемент jobj2, jel2
  • проверить, что класс jel1 равен классу jel2

PS Я не очень понимаю, почему вы хотите использовать выделенный нативный метод для этой задачи;как предлагают другие (удаленные) ответы, в Java это одна строка, и их легче понять, и у них нет проблем с производительностью.Эта функция уместна только как строительный блок большей библиотеки JNI, поэтому перед возвращением вам нужно освободить все локальные ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...