Tengo una pieza de trabajo de "prueba de concepto" que se cruza en un territorio desconocido. Tengo la tarea de conectar una máquina EFTPOS a una aplicación que se ejecuta como un applet en un navegador en nuestra intranet.Llamar a un archivo DLL desde un applet a través de JNI
He ignorado el DLL de EFTPOS por el momento y he creado una DLL decorada con JNI simple en mi lenguaje de elección (Delphi) que simplemente registra una cadena en un archivo de texto en c: \ y puedo invocarlo con éxito desde aplicación local de Java.
Sin embargo, cuando creo un applet para hacer lo mismo, compilarlo en .JAR, firmar el JAR & intente llamar al método en el applet a través de Javascript en una página web que falla.
Un chico senior de Java con el que estoy trabajando no cree que sea posible hacer que esto funcione porque es intrínsecamente "malo" permitir que un applet lo haga.
Hay una entrada que puede colocar en un archivo java.policy para permitir loadLibrary. así como AllPermission & He intentado toda una serie de variaciones a lo largo de esas líneas todo fue en la producción de la siguiente traza de error en la consola de Java vano:
java.lang.ExceptionInInitializerError
at app.TestApplet.LogAString(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.com.MethodDispatcher.invoke(Unknown Source)
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.DLoggerImpl)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkLink(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at app.DLogger.<clinit>(Unknown Source)
... 16 more
java.lang.Exception: java.lang.ExceptionInInitializerError
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
La línea clave parece ser "Causado por: java. security.AccessControlException: acceso denegado (java.lang.RuntimePermission loadLibrary.DLoggerImpl) "que implica un problema de permisos. Podría ser que estoy obteniendo el archivo de política incorrecto - o la firma incorrecta - o cosas así o podría ser que Java está cableado para no permitir ese tipo de permisos para un Applet debido al riesgo de seguridad.
Mi pregunta es ¿estoy perdiendo el tiempo? ¿Se puede hacer & si es así, cómo?
Gracias en la anticipación
Mike
Creo que vale la pena mencionar que con nuestro applet java que carga archivos DLL, un gran porcentaje (95%) de los clientes puede ejecutar el applet sin ningún problema. Entonces debe haber alguna otra explicación para este comportamiento, algún tipo de combinación de navegador/JVM/OS que cause este efecto. – davidecr