Использую JNI для вызова Java.
JNI_CreateJavaVM возвращает JNIEnv, получить класс из него не могу (FindClass возвращает ноль), то ли строку с названием класса неправильно формирую, или опции для вызова JNI_CreateJavaVM неправильно сформировал. Можно как-то понять, что загрузилось в JNIEnv, получить полный список классов или загруженных модулей?
Здравствуйте, Didi, Вы писали:
D>Использую JNI для вызова Java. D>JNI_CreateJavaVM возвращает JNIEnv, получить класс из него не могу (FindClass возвращает ноль), то ли строку с названием класса неправильно формирую, или опции для вызова JNI_CreateJavaVM неправильно сформировал. Можно как-то понять, что загрузилось в JNIEnv, получить полный список классов или загруженных модулей?
jclass cls = env->FindClass(...);
if (env->ExceptionCheck()) { env->ExceptionDescribe(); // Отпечатает вам эксепшн со стэком в консоль.
}
Понять "что загрузилось" в JNIEnv нельзя. Единственный способ — приаттачить тред, и потом через тот же JNI дергать какие-нибудь managed-бины, системные свойства ("java.classpath"), класслоадеры, и т.д.. Но для этого вам надо FindClass еще с десяток раз вызвать будет, а вы пока с одним совладать не можете.
D>Понять "что загрузилось" в JNIEnv нельзя. Единственный способ — приаттачить тред, и потом через тот же JNI дергать какие-нибудь managed-бины, системные свойства ("java.classpath"), класслоадеры, и т.д.. Но для этого вам надо FindClass еще с десяток раз вызвать будет, а вы пока с одним совладать не можете.
Спасибо, как всегда проблема в ассоциациях — считал, что в Java есть некий аналого Reflection .NET, когда можно восстановить весь интерфейс класса из его типа.
Не могу понять как передать null в определенный метод.
jmethodID stop = env->GetMethodID(ss_type, "stop", "(Ljava/awt/Container;)V");
jobject obj = env->NewObject(ss_type, constructor);
env->CallVoidMethod(obj, stop , nullptr); // что я должен передать в функцию, чтобы вызвать stop(null)
Последняя строка вызывает ошибку, думаю, что не правильно передан null — не могу найти как передать его правильно
Здравствуйте, Didi, Вы писали:
D>Последняя строка вызывает ошибку, думаю, что не правильно передан null — не могу найти как передать его правильно
Ну так какую она ошибку вызывает?
D>>Последняя строка вызывает ошибку, думаю, что не правильно передан null — не могу найти как передать его правильно D>Ну так какую она ошибку вызывает?
Exception in thread "main" java.lang.RuntimeException: При создании презентации произошла ошибка
at mod.Sim.stop(Sim.java:319)
получено при помощи env->ExceptionDescribe();
Если с null сделано правильно, буду рыть в др. сторону
D>>>Последняя строка вызывает ошибку, думаю, что не правильно передан null — не могу найти как передать его правильно D>>Ну так какую она ошибку вызывает? D>
D>Exception in thread "main" java.lang.RuntimeException: При создании презентации произошла ошибка
D> at mod.Sim.stop(Sim.java:319)
D>
D>получено при помощи env->ExceptionDescribe(); D>Если с null сделано правильно, буду рыть в др. сторону
У вас в Java вылетел экспешн. Подключайтесь дебаггером, ставьте брейкпоинт в методе stop(), и смотрите в чем дело. С JNI сейчас проблем нет, метод был вызван.