JNI: Как я могу проверить, является ли jobject нулевым объектом в нативном коде c - PullRequest
32 голосов
/ 27 февраля 2010

JNI: Как я могу проверить, является ли jobject нулевым объектом в нативном коде c

Ответы [ 3 ]

31 голосов
/ 02 марта 2010

Поскольку объекты в коде Java и C фактически используют одни и те же области памяти (объект, передаваемый в собственный код, является одной и той же ссылкой на память в обоих мирах), простой

if (someJObject == NULL) {}

в коде C должно быть просто отлично, я думаю. Я еще не проверял это: -)

22 голосов
/ 03 сентября 2016

Комментарий Stewori заслуживает того, чтобы быть ответом, поэтому вот он:

(*env)->IsSameObject(env, someJObject, NULL) 

Я думаю, что этот тест завершается успешно, когда сравнение значений завершается неудачно, когда ссылочным типом является JNIWeakGlobalRefType, вместо локального или глобального ref.

2 голосов
/ 11 мая 2018

Принятый ответ и другие ответы верны. Но чтобы быть более понятным, вы всегда можете проверить

if (someJObject == NULL) {}

для локальных и глобальных ссылок.

Что касается слабой глобальной ссылки, вы должны использовать

(*env)->IsSameObject(env, someJObject, NULL)

, поскольку исходный объект на стороне Java уже может быть собран мусором, в то время как someJObject на стороне C все еще имеет старое ссылочное значение. Поэтому можно с уверенностью сказать, что последний всегда будет работать в обоих случаях.

Но здесь есть еще одна вещь, на которую стоит обратить внимание. Вы не должны вызывать какие-либо функции JNI на основе значения результата IsSameObject () , если это слабая глобальная ссылка. Это связано с тем, что объект можно собирать мусором в любое время, даже после получения значения TRUE от IsSameObject () . Вы можете получить то, что я имею в виду от здесь и здесь .

Итак, лично я думаю, что вы можете выбрать все, что захотите, если только вы не имеете дело с какими-то особыми случаями со слабыми глобальными ссылками. В простых случаях первое легче читать и даже дешевле, чем вызывать функцию JNI.

...