Je travaille sur un système hérité qui a une application VB6 qui doit appeler du code Java. La solution que nous utilisons est que l'application VB appelle une DLL C++ qui utilise JNI pour appeler le code Java. Un peu génial, mais ça fonctionne plutôt bien. Cependant, je passe à une nouvelle boîte de dev, et je viens de rencontrer un sérieux problème avec cela. L'application VB intégrée fonctionne correctement sur la nouvelle boîte, mais lorsque j'essaie de l'exécuter à partir de VB, la DLL ne parvient pas à charger la machine virtuelle, obtenant un code retour de -4 (JNI_ENOMEM) à partir de JNI_CreateJavaVM.JNI_ENOMEM de JNI_CreateJavaVM lors de l'appel d'une DLL utilisant JNI à partir de VB6
L'application construite et VB appellent exactement la même DLL, et je l'ai essayé avec Java 1.5 et 1.6. J'ai essayé les suggestions here (en redirigeant stdout et stderr vers des fichiers, en ajoutant une option vfprint, en ajoutant une option -Xcheck: jni), mais en vain. Je n'arrive pas à obtenir des informations supplémentaires sur le jvm. Pour autant que je sache, la nouvelle boîte est configurée à peu près la même que l'ancienne (logiciel installé, Path, Classpath, etc.), et les deux exécutent la même version de Windows Server 2003. La nouvelle machine est un x64 boîte avec plus de mémoire (4 Go plutôt que 2 Go), mais il fonctionne sous Windows 32 bits.
Avez-vous des suggestions ou des idées sur quoi regarder? Réécrire le tout d'une manière plus saine n'est pas une option - j'ai besoin de trouver un moyen de faire en sorte que la dll charge la jvm sans penser que c'est trop loin de la mémoire. Toute aide serait très appréciée.
Est-ce que vous passez des options à la JVM pour définir la taille maximale du segment de mémoire et/ou de la perm max? La somme de ces deux tailles doit être disponible en tant que bloc contigu pour que la JVM puisse démarrer. – kschneid
À l'origine, nous utilisions simplement les valeurs par défaut (juste en passant un chemin de classe). J'ai essayé de passer différentes valeurs pour -Xmx et -Xms. Jusqu'à 52 m, l'appel dll a simplement provoqué la fermeture de VB (sans message d'erreur). A partir de 53m, j'obtiens le code de retour JNI_ENOMEM.Il y a certainement beaucoup de mémoire disponible, et à moins que VB ne fasse quelque chose de vraiment bizarre avec l'allocation de mémoire pour les DLL, il devrait y avoir assez de mémoire contiguë disponible pour une JVM avec un tas de 53 Mo. Et tout cela fonctionne très bien sur ma vieille boîte de dev (et sur toutes les autres machines que nous avons utilisées). –