JNI С++ -> Java
От: Didi  
Дата: 16.01.15 19:37
Оценка:
Использую JNI для вызова Java.
JNI_CreateJavaVM возвращает JNIEnv, получить класс из него не могу (FindClass возвращает ноль), то ли строку с названием класса неправильно формирую, или опции для вызова JNI_CreateJavaVM неправильно сформировал. Можно как-то понять, что загрузилось в JNIEnv, получить полный список классов или загруженных модулей?
Re: JNI С++ -> Java
От: devcoach  
Дата: 17.01.15 20:57
Оценка:
Здравствуйте, 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 еще с десяток раз вызвать будет, а вы пока с одним совладать не можете.
Re[2]: JNI С++ -> Java
От: Didi  
Дата: 18.01.15 12:15
Оценка:
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 — не могу найти как передать его правильно
Re[3]: JNI С++ -> Java
От: devcoach  
Дата: 18.01.15 13:22
Оценка:
Здравствуйте, Didi, Вы писали:

D>Последняя строка вызывает ошибку, думаю, что не правильно передан null — не могу найти как передать его правильно

Ну так какую она ошибку вызывает?
Re[4]: JNI С++ -> Java
От: Didi  
Дата: 18.01.15 14:12
Оценка:
D>>Последняя строка вызывает ошибку, думаю, что не правильно передан null — не могу найти как передать его правильно
D>Ну так какую она ошибку вызывает?
Exception in thread "main" java.lang.RuntimeException: При создании презентации произошла ошибка
        at mod.Sim.stop(Sim.java:319)

получено при помощи env->ExceptionDescribe();
Если с null сделано правильно, буду рыть в др. сторону
Re[5]: JNI С++ -> Java
От: devcoach  
Дата: 18.01.15 18:22
Оценка: +1
Здравствуйте, Didi, Вы писали:


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 сейчас проблем нет, метод был вызван.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.