IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[JNI] Création d'une jvm impossible


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut [JNI] Création d'une jvm impossible
    Bonjour,

    Je suis en train de réaliser un petit programme qui permettrai d'utiliser du code java (classe déjà existante) dans un logiciel réalisé en C/C++ sous Visual C++ 6. Pour ce faire j'ai fait pas mal de recherche qui m'on conduit sur le chemin de JNI (utiliser le plus souvent pour faire l'inverse mais bon).

    J'ai donc trouvé un exemple (ici) sur lequel je m'inspire mais sans parvenir à créer la JVM…

    J’ai créer un projet de base en Win32 Console Application. J’ai lié les répertoires C:\j2sdk1.4.2_07\include et C:\j2sdk1.4.2_07\include\win32 pour jni.h ainsi que jni_md.h. Après l’avoir fait il me manque jvm.lib… Je met cette librairie dans le projet… Aucune erreur… A l’exécution j’ai un message d’erreur qui dit "Erreur manque jvm.dll" (en gros )… je fais une recherche, en trouve plusieurs mais je ne sait pas lequel prendre et comment l’inclure au projet…

    J’ai tester d’en mettre une dans system32 puis dans mon répertoire de projet et je n’ai plus l’erreur mais toujours aucune jvm de créer…

    Voici mon code pour réaliser cette exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include "stdafx.h"
    #include <iostream.h>
    #include <jni.h>
     
    JNIEnv          *env;
    JavaVM          *jvm;
    jclass          cls;
    jmethodID       mid;
    jobject         obj;
    jint            res;
    JavaVMInitArgs  vm_args;
    JavaVMOption    options[1];
     
    int creationJVM()
    {
    	jint res;
     
    	char classpath[1024];
     
    	sprintf(classpath, "%s", "-Djava.class.path=.:./lib");
    	options[0].optionString = classpath;
    	vm_args.version = JNI_VERSION_1_4;
    	vm_args.options = options;
    	vm_args.nOptions = 1;
    	vm_args.ignoreUnrecognized = 1;
     
    	res = JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args);
     
    	if (res < 0)
    	{
    		return 0;
    	}
     
    	return 1;
    }
     
    int main(int argc, char* argv[])
    {
    	int testCrea;
    	testCrea = creationJVM();
     
    	if (testCrea == 0)
    	{
    		cout << "Impossible de créer la JVM." << endl;
    	}
     
    	//cls = env->FindClass("TestJni");
     
    	if (!cls)
    	{
    		cout << "Impossible de charger TestJni.class" << endl;
    		return 0;
    	}
     
    	//jvm->DestroyJavaVM();
     
    	return 0;
    }
    Résultat de l'execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Impossible de crÚer la JVM.
    Impossible de charger TestJni.class
    Press any key to continue
    En espérant pouvoir avoir de l’aide de votre part… (et avoir été clair )

    Hannubis

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je ne connais pas du tout JNI, mais essaie peut-etre de charger la dll dynamiquement avec LoadLibrary, plutot que de passer par les libs

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Merci pour ta réponse rapide nico-pyright(c) !!! je vais tester ca ... même si j'ai des doutes !! On va voir je vous tiens au jus

    Hannubis

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par nico-pyright(c)
    je ne connais pas du tout JNI, mais essaie peut-etre de charger la dll dynamiquement avec LoadLibrary, plutot que de passer par les libs
    Ne marche pas qd même . D'autres idées??

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Personne n'a utilisé ca ?? personne peut m'aider ??

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    je pense que une personne sur le site de la jni serait plus apte a te repondre

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Tout les site qui parle la jni fond l'inverse a peu prés !!! et je n'ai pas trouvé de site propre a la jni sauf celui que j'ai cité dans mon premier post mais j'arrive pas a la faire marcher qd même...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Apres de nombreuse recherche je n'ai toujours rien trouvé de plus et j'en suis toujours au même point.

    N'y a t il personne qui est déjà utilisé jni pour un cas comme celui ci ?? Personne peut m'aider ??

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Voici un code qui fonctionne. Il est important de fournir le "jvm.dll" exact du JRE installé sur ta machine, avec son path absolu dans l'appel du LoadLibrary().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #ifdef __BORLANDC__
      #pragma argsused
    #endif
     
    #ifdef _WIN32
    #define PATH_SEPARATOR ';'
    #else
    #define PATH_SEPARATOR ':'
    #endif
     
    #include <jni.h>
    #include <windows.h>
     
     
    /**
    *  You can find all installed JVMs' information in the Registry:
    *  HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
    */
     
     
    // typedef of functions needed to create the JVM dynamically
    typedef jint (JNICALL GetCreatedJavaVMs_t)( JavaVM**, jsize, jsize* );
    typedef jint (JNICALL CreateJavaVM_t)( JavaVM**, void **, void* );
     
    // pointer declaration of those functions
    GetCreatedJavaVMs_t *GetCreatedJavaVMs;
    CreateJavaVM_t *CreateJavaVM;
     
    // handling reference to jvm.dll
    HINSTANCE hJvmDll;
     
     
    int main( int argc, char * argv[] )
    {
      jsize  nVMs;
      // pointer to the Virtual Machine instance interface
      JavaVM *jvm = (JavaVM *)0;
      // pointer to the thread instances interface which invokes Native APIs
      JNIEnv *env = (JNIEnv *)0;
     
      JavaVMInitArgs vm_args;
     
      jint status = -1;
      jclass cls;
      jmethodID mid;
      jint square, argsres;
      jboolean bNot;
     
      JavaVMOption options[1];
      options[0].optionString = "-Djava.class.path=.";
    //  options[1].optionString = "-verbose";
     
     
      size_t bufLen = 1;
      jvm = (JavaVM *) malloc( sizeof(JavaVM) * bufLen );
     
      char debugStr[256];
     
      hJvmDll =
       LoadLibrary( "C:\\Program Files\\Java\\jre1.5.0_04\\bin\\client\\jvm.dll" );
     
      if ( hJvmDll != NULL )
      {
         GetCreatedJavaVMs =
           (GetCreatedJavaVMs_t*)GetProcAddress( hJvmDll, "JNI_GetCreatedJavaVMs" );
     
         CreateJavaVM =
           (CreateJavaVM_t*)GetProcAddress( hJvmDll, "JNI_CreateJavaVM" );
     
         if ( GetCreatedJavaVMs != NULL && CreateJavaVM != NULL)
            {
              status = GetCreatedJavaVMs( &jvm, bufLen, &nVMs);
     
              if ( status == JNI_OK )
              {
                  sprintf( debugStr, "There are %d VM(s) running\r\n", nVMs );
                  printf(debugStr);
              }
     
              if (nVMs == 0)
              {
                 vm_args.version = JNI_VERSION_1_4;
                 vm_args.options = options;
                 vm_args.nOptions = 1;
                 vm_args.ignoreUnrecognized = JNI_TRUE;
     
                 status = CreateJavaVM( &jvm, (void**) &env, &vm_args );
                 if ( status == JNI_OK )
                 {
                    sprintf( debugStr, "Launching VM okay.\r\n" );
                    printf(debugStr);
                 }
              }
            }
      }
     
     
      if (status == JNI_OK)
      {
          cls = (env)->FindClass("Sample2");
          if(cls !=0)
          {   mid = (env)->GetStaticMethodID( cls, "intMethod", "(I)I");
    	        if(mid !=0)
    	        {  square = (env)->CallStaticIntMethod(cls, mid, 5);
    		       printf("Result of intMethod: %d\n", square);
    	        }
     
    	        mid = (env)->GetStaticMethodID(cls, "booleanMethod", "(Z)Z");
    	        if(mid !=0)
     	        {  bNot = (env)->CallStaticBooleanMethod(cls, mid, 1);
     		       printf("Result of booleanMethod: %d\n", bNot);
     	        }
          }
          (jvm)->DestroyJavaVM();
          return 0;
      }
      else
         return status;
    }
    Bonne chance.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par ahpoon
    Voici un code qui fonctionne. Il est important de fournir le "jvm.dll" exact du JRE installé sur ta machine, avec son path absolu dans l'appel du LoadLibrary().

    ...

    Bonne chance.
    Salut ahpoon et merci pour ta réponse et ton code. D'apres les test de celui ci la jvm est créé. Mais apres avec l'appel a la méthode java ca n'a pas l'air de marcher.

    Pourrais-tu me dire comment procéder pour le code en java, ou le mettre ... ??

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Le code JAVA qui va avec mon exemple sample2.cpp.

    Compile ce code et place son "byte code" dans le meme emplacement que l"exec produit en C++.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    /*
     * Created on Mar 20, 2006
     *
     * To change the template for this generated file go to
     * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
     */
     
    /**
     * @author user
     *
     * To change the template for this generated type comment go to
     * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
     */
    public class Sample2 {
    	public static int intMethod(int n)
    	{
    		return n*n;
    	}
     
    	public static boolean booleanMethod(boolean bool)
    	{
    		return !bool;
    	}
     
    	public static void main(String[] args) {
    		System.out.println(Sample2.intMethod(3));
    		System.out.println(Sample2.booleanMethod(false));		 
    	}
    }

Discussions similaires

  1. Réponses: 7
    Dernier message: 31/07/2009, 11h53
  2. NetBeans, création d'une application java impossible
    Par kokusho dans le forum NetBeans
    Réponses: 2
    Dernier message: 25/11/2007, 16h33
  3. Réponses: 4
    Dernier message: 31/07/2007, 18h02
  4. Réponses: 7
    Dernier message: 12/05/2006, 17h21
  5. [Plugin][MYECLIPSE]Impossible de trouver une JVM
    Par tolsam dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 08/08/2004, 20h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo