Pull to refresh

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

imageНесколько дней назад я начал работу над своим проектом, в котором нужно было вызывать 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 этого не любит. Лучше обработайте ошибку в какой-то финальной точке. Иначе JVM упадёт, и Вы можете об этом не узнать.

Полезные ссылки:
http://www.codeproject.com/Articles/993067/Calling-Java-from-Cplusplus-with-JNI
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.