Lancer java à partir d'un programme C

Résolu
Messages postés
91
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
5 août 2005
-
Messages postés
2
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
6 juillet 2005
-
Salut,

Tout est dans le titre ! Ou presque... Je suis sous windows et je cherche à lancer un programme java (graphique) à partir d'un exécutable (C compilé). J'ai fait tout ça, mais le problème que est qu'il y a en permanence une fenêtre dos (cmd.exe) derrière le programme java.
Je fait l'appel dans mon programme C avec la fonction system(). Malheureusement j'ai appris que cette fonction lance forcement cmd.exe. J'ai essayé aussi avec exclp() mais dans ce cas j'ai une belle erreur windows !
Est-ce que quelqu'un a une idée ?
Fabrice

28 réponses

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Pourquoi n'utilises-tu pas JNI (Java Native Interface) au lieu de la fonction système?

Core Breaker :)
Messages postés
91
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
5 août 2005

Ben parce que la JNI ne le permet pas tout simplement ! J'ai pas le temps d'expliquer pourquoi, pour plus d'info lire la javadoc sur la JNI
Fabrice
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Alors dis moi pourquoi j'y suis arrivé plusieurs fois et pourquoi le programme java.exe y arrive !!

Core Breaker :)
Messages postés
91
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
5 août 2005

on ne peut pas appeler java à partir du C directement, il faut d'abord lancer la machine virtuelle. Une fois la machine virtuelle lancée et connue du programme C (il doit connaitre la bonne machine virtuel JNIEnv) alors les échanges peuvent être effectués sans problèmes dans les 2 sens.
Si tu arrives à appeler une classe java à partir d'un executable C (le main dans le .c), je demande à voir...

Fabrice
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Effectivement, le main du .c instancie une machine virtuelle car c'est elle qui va charger une classe java en mémoire par son loader, il n'y a pas d'autre moyen de lancer un prog java, même JPython instancie une machine virtuelle. Si tu veux exécuter un prog java directement sans machine virtuelle, tu dois toi même programmer une machine virtuelle JAVA car un fichier .class contient du byte code qui n'est pas directment exécutable par un processeur de PC.
Même ton idée de départ, c'est à dire lancer un processus JAVA, devra instancier un machine virtuelle JAVA

JNI propose des fonctions pour instancier une machine virtuelle et donc fabriquer un JNIEnv, c'est comme ça que j'ai fait et java.exe fais. Si tu lance un processus JAVA, c'est donc comme ça qu'on fait, c'est le seul moyen d'exécuter un programme java.

Je n'ai pas besoin pour le programme de connaitre la machine virtuelle, il en crée une nouvelle, comme si tu lancais un 2ème processus JAVA.EXE

Core Breaker :)
Messages postés
91
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
5 août 2005

ok, ça me va. Mais t'as un exemple de création de machine virtuelle par un programme C ? Ou une doc ? Merci
Fabrice
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
JNI Propose une fonction JNI_CreateJavaVM pour créer une instance de JVM, de plus dans le src.jar du JDK, il y a un java.c qui est le source de JAVA.EXE, qui l'utilise.

sinon, je posterai ici un tel exemple pour ceux que ça intéresse
je dois retrouver mais anciennes archives, car ça fait longtemps que je l'ai fait.

Core Breaker :)
Messages postés
2
Date d'inscription
jeudi 12 mai 2005
Statut
Membre
Dernière intervention
6 juillet 2005

le C est portable
bonjour les degats !!!