У меня есть класс Java, который может быть разделен на подклассы, чтобы добавить дополнительное поле. Существует соответствующий метод C ++ JNI, который будет взаимодействовать с этим полем. Однако я хочу, чтобы код JNI обрабатывал как базовый класс, так и подкласс, что означает, что он должен определять, присутствует ли поле.
Мой (упрощенный) код JNI выглядит так:
fid = j.GetFieldID( jc, UTF8_SECPARM, SIG_SECPARM );
if ( fid == 0 ) return;
... continue with fid ...
Хотя метод GetFieldID () возвращает NULL, приложение получает исключение на некотором последующем этапе обработки, который, по-видимому, не связан с этим кодом. Тем не менее, это как-то связано, потому что, если я просто вернусь к методу GetFieldID (), не будет никаких исключений.
Как можно надежно проверить наличие поля или метода в объекте из кода JNI?
Оказывается, что хотя метод GetFieldID () возвращает NULL, существует также сгенерированное исключение Java, которое необходимо обработать.
Решение состоит в том, чтобы проверить исключение и очистить (или обработать) его. Самое простое решение это:
fid = j.GetFieldID( jc, UTF8_SECPARM, SIG_SECPARM );
if ( JNI_TRUE == j.ExceptionCheck() ) {
j.ExceptionClear();
return;
}
... continue with fid ...
Других решений пока нет …