четверг, 7 января 2016 г.

JNI: почему env->FindClass возвращает nullptr


Несколько дней назад я начал работу над своим проектом, в котором нужно было вызывать Java методы из C++. Для этого, я использовал JNI. Но не всё так просто.

Я не буду рассказывать с какими проблемами я сталкивался, а лишь только опишу несколько нюансов, о том, почему метод FindClass может НЕ возвращать класс.


  1. FindClass принимает аргумент - имя класса. Оно отличается от того что в Java. В имени пакета вместо точки нужно использовать слеш. К примеру вместо "foo.bar.MyClass" нужно использовать "foo/bar/MyClass"
  2. Если в Ваш класс использует статическую инициализацию, и в процессе инициализации что-то пошло не так (вылетел рантайм), то вы об этом не узнаете. Вместо этого Вам просто не будет возвращаться объект класса.
  3. Если Вы используете JNI на Windows, в -Djava.class.path используйте обычные слеши, вместо бекслешей. К примеру "-Djava.class.path=D:\\MyJar.jar" - не правильно. Правильно будет так: "-Djava.class.path=D:/MyJar.jar"
  4. Никогда не бросайте рантаймы. JNI этого не любит. Лучше обработайте ошибку в какой-то финальной точке.
Полезные ссылки:

Комментариев нет:

Отправить комментарий

Оптимизация Firefox

Привет! Сегодня я расскажу как можно легко и быстро оптимизировать FireFox. Для начала, вбиваем в адресную строку about:config и нажимаем...