Принятый ответ и другие ответы верны.
Но чтобы быть более понятным, вы всегда можете проверить
if (someJObject == NULL) {}
для локальных и глобальных ссылок.
Что касается слабой глобальной ссылки, вы должны использовать
(*env)->IsSameObject(env, someJObject, NULL)
, поскольку исходный объект на стороне Java уже может быть собран мусором, в то время как someJObject на стороне C все еще имеет старое ссылочное значение.
Поэтому можно с уверенностью сказать, что последний всегда будет работать в обоих случаях.
Но здесь есть еще одна вещь, на которую стоит обратить внимание. Вы не должны вызывать какие-либо функции JNI на основе значения результата IsSameObject () , если это слабая глобальная ссылка.
Это связано с тем, что объект можно собирать мусором в любое время, даже после получения значения TRUE от IsSameObject () .
Вы можете получить то, что я имею в виду от здесь и здесь .
Итак, лично я думаю, что вы можете выбрать все, что захотите, если только вы не имеете дело с какими-то особыми случаями со слабыми глобальными ссылками. В простых случаях первое легче читать и даже дешевле, чем вызывать функцию JNI.