java - nombre - jvm dll jinitiator
¿Debo colocar todas las DLL dependientes en la carpeta bin de JDK? (1)
Mi aplicación java depende de una DLL, y esa DLL además depende de libstdc++-6.dll
.
Lo intenté:
- colocó
libstdc++-6.dll
en una carpeta - y coloque la carpeta en% PATH%
Luego me encuentro con java.lang.Unsatisfied LinkError: The specified procedure could not be found
al iniciar la aplicación desde Eclipse.
Pero si pongo el libstdc++-6.dll
en la JDK''s bin folder
, diga C:/Java/jdk1.6.0_45_32bit/bin
. Funciona bien.
Pero no quiero contaminar la carpeta JDK. Recuerdo que Windows buscará% PATH% para localizar las DLL dependientes. ¿Por qué no puedo usar%% PATH% en este problema?
Actualización 1
Hay 2 variables de entorno% PATH% diferentes en Windows.
- Variables de usuario
- Variables del sistema
Simplemente descubrí eso:
Si pongo la carpeta de la DLL al usuario% PATH%, no se puede encontrar.
Si pongo la carpeta del DLL en System% PATH%, funciona.
¿Por qué?
Actualización 2
Inspirado por este hilo: variable de entorno PATH del sistema frente al usuario ... winmerge funciona solo si agrego la ruta al usuario PATH
Comienzo a preguntarme que tal vez mi%% de ruta de usuario sea demasiado larga . Así que moví la ruta de la carpeta que contiene mi DLL dependiente desde el final del usuario% PATH% al principio . ¡Ahora funciona!
Al principio, concluyo que uno que implementó el algoritmo de búsqueda DLL de Windows tiene algún problema de truncamiento. Y casi lo considero como otro molesto error de Windows.
Pero escribí otra aplicación de Windows que tiene dependencias DLL similares para confirmar mi suposición. Esa aplicación funciona bien! Así que tengo que revisar mi conclusión.
Revisé mi entrada User% PATH% uno por uno, y coloqué la carpeta en cada ubicación posible. Y finalmente, encuentro la causa raíz .
Tengo una entrada
C:/MinGW/bin
en User% PATH%, que contiene unlibstdc++-6.dll (977KB)
pero desafortunadamente, que no es compatible con el que necesito(825KB)
. Solo funciona si coloco mi carpeta antes de MinGW. Por lo tanto, en realidad se trata de una colisión DLL durante la resolución% PATH%.
Ahora este problema parece resuelto. Pero aparece otra, ¿tengo que cambiar de un lado a otro si quiero usar mi DLL y MinGW?
Actualización 3
Por favor, revise el comentario de @AndyThomas. Mencionó el uso de System.loadLibrary()
para DLL directos e indirectos. De esta manera, todo lo que debemos preocuparnos es la propiedad java.library.path
. Creo que es una solución única para todos.
Primero: ponga todos los archivos DLL que necesite en el mismo directorio
Luego: cargue libs nativas, para hacerlo tiene 3 opciones:
- Establezca las Opciones de VM mientras ejecuta su aplicación.
-Djava.library.path = "C: / Su directorio donde está presente Dll"
Ejemplo:
java -Djava.library.path = "C: / Su directorio donde está presente Dll" -jar app.jar
- Cargue la biblioteca nativa específica desde la aplicación:
a) Coloque el directorio que contiene el archivo aaa.dll directamente bajo el proyecto Java.
b) Y coloca esta línea en la parte superior del rastro de la pila de tu aplicación: System.loadLibrary ("aaa")
- Utiliza las opciones de VM desde tu aplicación:
System.setProperty ("java.library.path", "C: / Su directorio donde está presente Dll");