world reservada palabra nazareno hello descargar java jni

java - reservada - jni types



Bibliotecas dependientes JNI (4)

  • Si tiene un nombre de DLL ''MyNativeDLL.dll'' entonces debería usar ''MyNativeDLL'' en su llamada de LoadLibrary.
  • Use Dependency Walker para verificar si MyNativeDLL.dll necesita algún archivo.
  • Si los hay, inclúyalos en la misma carpeta que MyNativeDLL.dll; uno lo hace funcionar intente poner los archivos necesarios adicionales en la carpeta System32.

Estoy ejecutando una biblioteca a través de JNI (no lo escribí), e internamente llama a otra DLL. Me sale un error que dice "No puedo encontrar bibliotecas dependientes" a menos que ponga la ruta de la otra DLL en la variable PATH del sistema (estoy en Windows XP). Me gustaría poder manejar esto en la línea de comandos de java, y ya he intentado agregarlo a -Djava.library.path y al classpath, ninguno de los cuales funcionó (esperaba que -Djava.library.path funcionara pero no classpath, pero ninguno funcionó). ¿Hay alguna forma de hacer esto?

Gracias,

Jeff


Inyecté exitosamente una carpeta en la variable PATH usando JNA. Esto puede usarse como una solución alternativa si desea implementar sus archivos DLL dependientes junto con su aplicación sin contaminar el entorno global ni interferir con el orden de carga explícito de DLL.

Sin embargo, no me queda claro cómo afecta el ciclo de vida del cargador de clases. Solo he probado esta técnica en el sistema de módulos NetBeans, pero si miras el código de clase de ClassLoader para loadLibrary, verás que almacena en caché algunas variables de ruta. Puede o no ser necesario crear un nuevo cargador de clases para cargar la biblioteca.

La desventaja es que necesitas usar JNA o JNI. Además, parece un truco bastante grave. Vea aquí un ejemplo de cómo establecer una variable de entorno usando JNA.


Esto me ayudó mucho. También se gestionó la carga de un dll JNI construido utilizando cygwin:

primero:

/* conditioned if OS is windows because also need it to work in Linux env. */ System.loadLibrary("cygwin1");

entonces:

System.loadLibrary("mylib");

En Windows, esto requiere configurar java.library.path para que coincida con las ubicaciones de ambas bibliotecas.

Si se ejecuta desde Eclipse, esta configuración puede reemplazarse por "Ubicación de bibliotecas nativas" en la ruta de compilación de Java (en la configuración de las bibliotecas de JRE).

Sin embargo, sigue encontrando esto un poco complicado.


Pude hacer que esto funcionara sin poner ningún archivo DLL en la RUTA utilizando System.load () en todas las DLL en orden inverso de dependencia. Para que quede claro, estaba llamando a System.load () en todas las DLL dependientes, no solo en las DLL JNI. No tiene que llamar a System.load () en las DLL que vienen con Windows (están en la RUTA).

Estaba haciendo esto en una aplicación web donde un archivo incluía archivos DLL que se estaban desempaquetando. Tu situación parece más simple, así que creo que debería funcionar. En general, seguí la solución aquí: ¿Cómo hacer un archivo JAR que incluye archivos DLL?