Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JNI, запуск java проложения из С файла 
:(
    Опции темы
leonidv
Дата 25.11.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



Привет всем!
я впринципе в java новичек есть такая проблема как запусть java приложение из С файла откомпилированого в exe  
проблемма в том что после запуска JVM и вызова main() метода и выполнения его, все закрываеться  smile 

юзал поиск ничего дельного не нашел

вот код java 
Код

public class Prog {
    public static void main(String args[]){
   
    System.out.println("this class run from C"+args[0]);
    try{
    Thread.currentThread().wait(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
   
}

вот код С
Код

#include <jni.h>


main() {
    JNIEnv *env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    JavaVMOption options[2];
    jint res;
    jclass cls;
    jmethodID mid;
    jstring jstr;
    jobjectArray args;

   
  
    options[0].optionString="-Djava.class.path=.";
    vm_args.version = JNI_VERSION_1_2;
    vm_args.options=options;

    JNI_GetDefaultJavaVMInitArgs(&vm_args);

    res = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
 
    if (res < 0) {
        fprintf(stderr, "Can't create Java VM\n");
        exit(1);
    }

    cls = (*env)->FindClass(env, "Prog");
    if (cls == 0) {
        fprintf(stderr, "Can't find Prog class\n");
        exit(1);
    }
 
    mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
    if (mid == 0) {
        fprintf(stderr, "Can't find Prog.main\n");
        exit(1);
    }

    jstr = (*env)->NewStringUTF(env, " from C!");
    if (jstr == 0) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }
    args = (*env)->NewObjectArray(env, 1, 
                        (*env)->FindClass(env, "java/lang/String"), jstr);
    if (args == 0) {
        fprintf(stderr, "Out of memory\n");
        exit(1);
    }
    (*env)->CallStaticVoidMethod(env, cls, mid, args);
    
    
}

PM MAIL   Вверх
ivg
Дата 25.11.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Как узнали что метод main() выполняется? В консоли появилась строка:
Код

this class run from C from C!
?
если да, то там же должно появиться что вроде этого:
Код

java.lang.IllegalMonitorStateException: current thread not owner
    at java.lang.Object.wait(Native Method)
    at Prog.main(Prog.java:6)
 
Вы ожидаете, что вот эта строка
Код

Thread.currentThread().wait(1000);

усыпит поток, но это не так, надо:
Код

Тhread.sleep(1000); // 1 сек.


PM MAIL   Вверх
leonidv
Дата 25.11.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



Цитата

Как узнали что метод main() выполняется? В консоли появилась строка:

да и никаких ошибок не появилось

по полводу 
Thread.currentThread().wait(1000);
согласен smile 

вообще идея была сделать GUI приложение а не этот простои пример он впринципе и так работает 

были идеии сделать через 
jint AttachCurrentThread(JavaVM *vm, void **penv,void *args);

но насколько я понял это просто добавляет еще один поток, поправьте если не прав

PM MAIL   Вверх
ivg
Дата 25.11.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Вариант с запуском java из .bat файла не рассматривали? Не устраивает?
Вариант запуска java.exe из .exe как отдельный процесс?
Или нужно именно в ваш процесс грузить jvm.dll?
PM MAIL   Вверх
leonidv
Дата 25.11.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



ну вообще из *.bat файля я делал мне интересно сделать чтоб именно из exe запускался,
вариант с программами типа exe4j я не рассматриваю потомучто интересно сделать это самому

а про запуск java.exe из exe можно по подробнее?
PM MAIL   Вверх
ivg
Дата 25.11.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(leonidv @  25.11.2007,  22:14 Найти цитируемый пост)
ну вообще из *.bat файля я делал мне интересно сделать чтоб именно из exe запускался,
вариант с программами типа exe4j я не рассматриваю потомучто интересно сделать это самому

Чисто академический интерес?  smile 
Цитата(leonidv @  25.11.2007,  22:14 Найти цитируемый пост)
а про запуск java.exe из exe можно по подробнее? 

Ну это вам лучше в форуме C/C++ по WinAPI спросить как запустить отдельный процесс из своего кода, просто в качестве командной строки нового процесса указываете строку какую вы бы набирали в консоли для запуска вашего java приложения.
Что же касается загрузки jvm.dll в ваш процесс, тем более раз академический интерес, скачайте исходники JDK и посмотрите как релизована на C/C++ java.exe или javaw.exe ну или другой код, который OpenSource и запускает из .exe java приложения.
PM MAIL   Вверх
leonidv
Дата 25.11.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



Цитата

Чисто академический интерес?  

ну интерес больше акадкмический чем практический потомучто мне кажеться наиболее удобным использовать *.jar в таких случаях но с exe как то более привычно smile

 
Цитата

Что же касается загрузки jvm.dll в ваш процесс...

ну по идее в моем примере jvm.dll и так используеться потомучто после компиляции C файла он не будет работать без указания расположения  jvm.dll в переменной PATH или наличая его в тойже папке(вариант c тойже папкой не проверял)

PM MAIL   Вверх
w1nd
Дата 26.11.2007, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Исходники java-launcher'а поставляются с jdk. Думаю, понятно - для каких целей. Вы их смотрели?


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
leonidv
Дата 28.11.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



да смотрел, но нечего интересного я не нашел виртуальная машина запускаеться в конечном итоге также как и в моем примере

я думаю что дело в опциях при инициализации jvm smile 

PM MAIL   Вверх
w1nd
Дата 28.11.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(leonidv @  28.11.2007,  00:04 Найти цитируемый пост)
да смотрел, но нечего интересного я не нашел виртуальная машина запускаеться в конечном итоге также как и в моем примере

Да ну? Где же тогда в вашем коде вызов DestroyJavaVM?


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
leonidv
Дата 28.11.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.9.2007

Репутация: нет
Всего: нет



да действительно работает smile 

не думал что DestroyJavaVM() сиграет такую важную роль

пасибо за подсказку smile 

PM MAIL   Вверх
w1nd
Дата 29.11.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(leonidv @  28.11.2007,  23:58 Найти цитируемый пост)
не думал что DestroyJavaVM() сиграет такую важную роль

Надо не думать, а соображать smile А если серьёзно, то стоило обратить внимания на комментарии в коде стандартного загрузчика:

Код
    /*
     * Wait for all non-daemon threads to end, then destroy the VM.
     * <...>
     */


Это сообщение отредактировал(а) w1nd - 29.11.2007, 01:01


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.