java - Cómo incluir la biblioteca nativa(JNI) en juego 2.1 RC2?
playframework playframework-2.0 (3)
Tuve el mismo problema con la biblioteca de OpenCV. Encontré la solución aquí: http://answers.opencv.org/question/16689/jni-error-on-playframework-v211/
DEBES ejecutar tu aplicación con el comando "reproducir inicio", no con "ejecutar ejecutar".
El comando "play run" inicia su aplicación en modo de desarrollo y el comando "play start" comienza en modo de producción. No conozco cada diferencia entre ellos, pero una cosa obvia es
Solo cuando utilizamos "inicio de reproducción", se inicia una nueva aplicación JVM para usted y carga las bibliotecas nativas especificadas por System.load (...)
Si ejecuta su aplicación de reproducción con el comando "play start", funcionará. Desafortunadamente "play run" no carga libs.
Estoy usando Play Framework 2.1 RC2
para construir una aplicación que utiliza TFS Java SDK
. TFS APIs
requieren un conjunto de dlls nativos (por ejemplo, native_auth.dll
) para ser incluidos.
¿Cómo hago para que las bibliotecas nativas estén disponibles cuando la aplicación se está ejecutando? ¿Dónde puedo especificar las dlls nativas que se incluirán?
Actualización: Intenté static
bloque static
System.load("full path")
y lo app.classloader().loadClass("NativeUtils.class");
usando app.classloader().loadClass("NativeUtils.class");
, pero aun así obtengo la excepción:
java.lang.UnsatisfiedLinkError: com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.nativeGetEnvironmentVariable(Ljava/lang/String;)Ljava/lang/String; at com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.nativeGetEnvironmentVariable(Native Method) at com.microsoft.tfs.jni.internal.platformmisc.NativePlatformMisc.getEnvironmentVariable(NativePlatformMisc.java:134) at com.microsoft.tfs.jni.PlatformMiscUtils.getEnvironmentVariable(PlatformMiscUtils.java:52) at com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.shouldAcceptUntrustedCertificates(DefaultHTTPClientFactory.java:288) at com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.configureClientParams(DefaultHTTPClientFactory.java:324) at com.microsoft.tfs.core.config.httpclient.DefaultHTTPClientFactory.newHTTPClient(DefaultHTTPClientFactory.java:137) at com.microsoft.tfs.core.TFSConnection.getHTTPClient(TFSConnection.java:1041) at com.microsoft.tfs.core.TFSConnection.getWebService(TFSConnection.java:874) at com.microsoft.tfs.core.config.client.DefaultClientFactory$9.newClient(DefaultClientFactory.java:265) at com.microsoft.tfs.core.config.client.DefaultClientFactory.newClient(DefaultClientFactory.java:90) at com.microsoft.tfs.core.TFSConnection.getClient(TFSConnection.java:1470) at com.microsoft.tfs.core.TFSTeamProjectCollection.getWorkItemClient(TFSTeamProjectCollection.java:370)
¡Gracias de antemano por sus entradas!
No encontré una solución a un problema, aparte de ejecutar el inicio de reproducción y ejecutarlo como inicio de reproducción mientras el desarrollo apesta, así que he creado un problema: https://github.com/playframework/playframework/issues/2212 . Si encuentra el problema, puede agregar un comentario describiendo la situación. Añadiendo un comentario, se lo sube en la lista de problemas. En la parte superior, el problema es una mayor probabilidad de que se solucione.
Al usar System.loadLibrary
, lo único que especificamos es el nombre del archivo DLL
que queremos. La JVM lo buscará en la "ruta de la biblioteca Java". Esta es una ruta que viene dada por la propiedad del sistema java.library.path
(y, por lo tanto, se puede modificar en la línea de comando java.exe usando la opción -D). El valor predeterminado de esto parece estar relacionado con la ruta de Windows
, aunque parece estar un tanto codificado, y no estoy muy seguro de cómo o por qué. En otras palabras, no estoy seguro de cómo la JVM de Windows crea el valor inicial de java.library.path
.
Por lo tanto, debe especificar speciry -Djava.library.path=<path to your dlls>
al ejecutar su aplicación. Más detalles sobre eso está aquí .