[java] Dois-je placer toutes les DLL dépendantes dans le dossier bin du JDK?



Answers

Question

Mon application Java dépend d'une DLL, et cette DLL dépend en outre de libstdc++-6.dll .

J'ai essayé de:

  • placé le libstdc++-6.dll dans un dossier
  • et placez le dossier dans le% PATH%

Ensuite, je rencontre le java.lang.Unsatisfied LinkError: The specified procedure could not be found lors du lancement de l'application à partir d'Eclipse.

Mais si je mets le libstdc++-6.dll dans le JDK's bin folder , disons C:\Java\jdk1.6.0_45_32bit\bin . Ça fonctionne bien.

Mais je ne veux pas polluer le dossier JDK. Je me souviens que Windows recherche% PATH% pour localiser les DLL dépendantes. Pourquoi ne puis-je pas utiliser% PATH% dans ce problème?

Mise à jour 1

Il existe 2 variables d'environnement% PATH% différentes dans Windows.

  • Variables utilisateur
  • Variables système

Je trouve juste accidentellement que:

  • Si je mets le dossier de la DLL à l'utilisateur% PATH%, il ne peut pas être trouvé.

  • Si je place le dossier de la DLL sur System% PATH%, cela fonctionne.

Pourquoi?

Mise à jour 2

Inspiré par ce fil: Variable environnementale système / utilisateur PATH ... winmerge ne fonctionne que si j'ajoute le chemin à l'utilisateur PATH

Je commence à me demander peut-être que mon User% Path% est trop long . J'ai donc déplacé le chemin du dossier contenant ma DLL dépendante de la fin de User% PATH% au début . Ça fonctionne maintenant!

Au début, je conclus que celui qui a implémenté l'algorithme de recherche DLL de Windows a un problème de troncature. Et je le considère presque comme un autre bug Windows ennuyeux.

Mais j'ai écrit une autre application Windows qui a des dépendances DLL similaires pour confirmer ma conjecture. Cette application fonctionne bien! Donc je dois revoir ma conclusion.

J'ai vérifié mon entrée utilisateur% PATH% un par un, et placez le dossier à chaque emplacement possible. Et enfin, je trouve la cause première .

J'ai une entrée C:\MinGW\bin dans l'utilisateur% PATH%, qui contient une libstdc++-6.dll (977KB) mais malheureusement, ce qui n'est pas compatible avec celui dont j'ai besoin (825KB) . Cela ne fonctionne que si je place mon dossier avant MinGW. Il s'agit donc en fait d'une collision de DLL pendant la résolution% PATH%.

Maintenant, ce problème semble résolu. Mais un autre vient, ai-je besoin de basculer en arrière si je veux utiliser à la fois ma DLL et le MinGW?

Mise à jour 3

S'il vous plaît vérifier le commentaire par @AndyThomas. Il a mentionné l'utilisation de System.loadLibrary() pour les DLL directes et indirectes. De cette façon, tout ce dont nous avons besoin est la propriété java.library.path . Je pense que c'est une solution une fois pour toutes.




Links



Tags

java java   dll   jni