L'appel d'une DLL à partir d'un Applet via JNI
J'ai une "preuve de concept" morceau de travail qui croise dans certains territoire inconnu.
Je suis chargé de la connexion d'un TPE machine à une application en cours d'exécution comme une applet dans un navigateur sur notre intranet.
J'ai ignoré les TPE dll pour le moment, et de créer un simple JNI décorées DLL dans mon choix de langue (Delphi) qui enregistre tout une chaîne de caractères dans un fichier texte dans c:\ et je peux l'appeler avec succès à partir d'un local d'une application Java.
Cependant, lorsque je créer une applet de faire la même chose, les compiler dans un .JAR, signe le POT & essayez d'appeler la méthode dans l'applet via Javascript sur une page web, il échoue.
Un senior Java gars, je travaille avec ne pense pas qu'il sera possible d'obtenir que cela fonctionne, car il est intrinsèquement "mauvais" pour permettre une applet pour ce faire.
Il y a une entrée, vous pouvez mettre en java.la politique de fichier pour permettre à la fonction loadLibrary. ainsi que allPermission & j'ai essayé une multitude de variations le long de ces lignes en vain la production de la suite de trace de l'erreur 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 de clé semble être Causé par: java.de sécurité.AccessControlException: accès refusé (java.lang.RuntimePermission loadLibrary.DLoggerImpl)", ce qui implique un problème d'autorisations. Il se pourrait que je me fais de la politique de fichier incorrecte ou la signature de mal - ou des trucs comme ça ou il se peut que Java est câblé pour ne pas permettre à ces sortes de permissions pour un Applet en raison du risque de sécurité.
Ma question est suis-je perdre mon temps? Peut-il être fait & si oui, comment?
Merci d'avance
Mike
OriginalL'auteur mcottle | 2009-11-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez certainement accomplir cette tâche. Je dispose d'une applet dans la production qui fait exactement cela. Même si votre applet est signé, vous devez toujours utiliser le Contrôleur d'Accès pour accéder à la dll, vous ne peut pas simplement appeler "loadlibrary". Vous pouvez ajouter ceci à la Java de la politique de fichier mais ce n'est pas recommandé en raison de la 1. Vous n'avez probablement pas d'accès pour les utilisateurs java de configuration. 2. Même si c'est pour votre propre entreprise, la gestion de la politique de fichier est une douleur que les utilisateurs pourront télécharger des JRE et votre politique de fichier est soit écrasé ou ignoré.
Vous meilleur pari est de signer votre pot, assurez-vous de l'enveloppe de votre charger la bibliothèque de code dans un cadre privilégié, bloc de code comme celui-ci.
Vous pouvez Également utiliser le Système.loadlibrary(mydll.dll) mais il faut avoir de la dll du dossier sur le chemin d'accès dans windows afin de l'applet peut le trouver.
Si vous avez besoin d'une source d'échantillons pour l'appel de la JNI fonctions permettez-moi de savoir que je peux attraper.
OriginalL'auteur Keibosh
La seule chose que je peux suggérer, c'est de prendre un coup d'oeil au code source pour la zone et d'essayer de les déchiffrer, si elle ne permet pas en raison de l'absence de l'autorisation ou parce que ce n'est pas permise à tous. Vous n'avez pas les numéros de ligne malheureusement, de sorte que le rend un peu plus difficile.
OriginalL'auteur Michael Wiles
Je suis sûr que vous ne peut pas charger une bibliothèque native à partir d'une Applet, sauf si elle est "signé", et ensuite l'utilisateur va obtenir une acceptation de la boîte de dialogue pour autoriser ou interdire. C'est, en supposant que vous pouvez faire JNI à tous dans une applet... jamais essayé.
Bonne chance.
OriginalL'auteur cjstehno