J'ai une «preuve de concept» qui traverse un territoire que je ne connais pas. Je suis chargé de connecter une machine EFTPOS à une application exécutée en tant qu'applet dans un navigateur sur notre intranet. J'ai ignoré la DLL EFTPOS pour le moment et créé une simple DLL décorée JNI dans la langue de mon choix (Delphi) qui enregistre simplement une chaîne dans un fichier texte dans c: \ et je peux l'appeler avec succès à partir d'un application Java locale.Appel d'une DLL à partir d'une applet via JNI
Cependant, lorsque je crée une applet pour faire la même chose, compilez-la en .JAR, signez le JAR & essayez d'appeler la méthode dans l'applet via Javascript sur une page web où elle échoue.
Un type Java senior avec lequel je travaille ne pense pas qu'il sera possible de faire fonctionner cela parce que c'est intrinsèquement "maléfique" de permettre à une applet de le faire.
Il existe une entrée que vous pouvez placer dans un fichier java.policy pour autoriser loadLibrary. ainsi que allPermission & J'ai essayé tout un tas de variations le long de ces lignes en vain produire la trace d'erreur suivant dans la console Java:
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 ligne clé semble être « Causé par: java. security.AccessControlException: accès refusé (java.lang.RuntimePermission loadLibrary.DLoggerImpl) "ce qui implique un problème d'autorisations. Il se peut que le fichier de stratégie soit incorrect - ou que la signature ne soit pas correcte - ou qu'il se peut que Java soit câblé pour ne pas autoriser ce type d'autorisation pour une applet en raison du risque de sécurité.
Ma question est de savoir si je perds mon temps? Peut-il être fait & si oui, comment?
Merci d'avance
Mike
Je pense qu'il était utile de mentionner qu'avec notre applet java qui charge les DLL, un grand pourcentage (95%) des clients peut exécuter l'applet sans aucun problème. Il doit donc y avoir une autre explication pour ce comportement, une sorte de combinaison navigateur/JVM/OS qui provoque cet effet. – davidecr