
Я не буду рассказывать с какими именно проблемами я сталкивался, а лишь только опишу несколько нюансов, о том, почему метод FindClass может НЕ возвращать класс.
- FindClass принимает аргумент — имя класса. Оно отличается от того что в Java. В имени пакета вместо точки нужно использовать слеш. К примеру вместо "foo.bar.MyClass" нужно использовать "foo/bar/MyClass"
- Если в Ваш класс использует статическую инициализацию, и в процессе инициализации что-то пошло не так (вылетел рантайм), то вы об этом не узнаете. Вместо этого Вам просто не будет возвращаться объект класса.
- Если Вы используете JNI на Windows, в -Djava.class.path используйте обычные слеши, вместо бекслешей. К примеру "-Djava.class.path=D:\\MyJar.jar" — не правильно. Правильно будет так: "-Djava.class.path=D:/MyJar.jar"
- Никогда не бросайте рантаймы. 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