2010-11-11 32 views
2

J'utilise une applet déployée via JWS (Java Web Start). Cette applet a des fonctionnalités natives incluses: JNA. User32, Kernel32 et Gdi32. Lorsque je lance l'applet via JWS, je reçois ce qui suit:Une bonne façon d'utiliser les bibliothèques natives dans JNA avec Applet déployé par JWS (java web start)

basic: LD - All JAR files signed: file:/C:/JavaApplication6/dist/launch.jnlp 
basic: passing security checks; secureArgs:false, allSigned:false 
basic: continuing launch in this VM 
network: LDUpdater: started background update check 
basic: JNLP2ClassLoader.findClass: winToJnaApi.NewApplet: try again .. 
basic: JNLP2ClassLoader.getPermissions() .. 
basic: Plugin2ClassLoader.getPermissions CeilingPolicy allPerms 
security: JAVAWS AppPolicy Permission requested for: file:/C:/JavaApplication6/dist/JavaApplication6.jar 
basic: JNLP2ClassLoader.getPermissions() X 
basic: Applet loaded. 
basic: Applet resized and added to parent container 
basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 194323 us, pluginInit dt 462062 us, TotalTime: 656385 us 
basic: JNLP2ClassLoader.findClass: winToJnaApi.APIManipulation: try again .. 
basic: JNLP2ClassLoader.findClass: winToJnaApi.User32Extended: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.win32.StdCallLibrary$StdCallCallback: try again .. 
basic: JNLP2ClassLoader.getPermissions() .. 
basic: Plugin2ClassLoader.getPermissions CeilingPolicy allPerms 
security: JAVAWS AppPolicy Permission requested for: file:/C:/JavaApplication6/dist/lib/jna.jar 
basic: JNLP2ClassLoader.getPermissions() X 
basic: JNLP2ClassLoader.findClass: com.sun.jna.Callback: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.win32.StdCall: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.AltCallingConvention: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.Library: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.Native: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.Callback$UncaughtExceptionHandler: try again .. 
basic: JNLP2ClassLoader.findClass: com.sun.jna.Native$3: try again .. 

Ceci est étrange, correct? Si je vérifie mes jars avec jarsigner, ils semblent tous être signés (j'utilise la signature automatique par Netbeans mais ça ne marche pas même si je les signe manuellement). Comme je suis assez nouveau à l'applet et à la technologie JWS, je me demande si l'essai à nouveau ... signifie que JNLP n'a pas pu trouver la classe appropriée. Ce qui est encore plus étrange est que si je définis une méthode native dans l'applet, par exemple une méthode qui en cliquant sur un bouton de l'applet me donne une boîte de message Windows, cela fonctionne si je clique sur le bouton de l'applet , mais si j'essaye d'invoquer la même fonction par javascript, il échoue. Donc, voici mon fichier .jnlp:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <jnlp codebase="file:/C:/JavaApplication6/dist/" href="launch.jnlp" spec="1.0+"> 
     <information> 
      <title>JavaApplication6</title> 
      <description>blalbla</description> 
      <description kind="short">JavaApplication6</description> 

     </information> 
    <update check="background"/> 
    <security> 
    <all-permissions/> 
    </security> 
     <resources> 
    <j2se java-vm-args="-Djava.security.policy=applet.policy" version="1.5+"/> 
    <jar href="JavaApplication6.jar" main="true"/> 


     <jar href="lib/jna.jar"/> 
    <jar href="lib/platform.jar"/> 
    </resources> 
     <applet-desc height="300" main-class="winToJnaApi.NewApplet" name="JavaApplication6" width="300"> 

     </applet-desc> 
    </jnlp> 

Selon quelques informations que je trouve que je dois convertir user32_x86 répertoire du jna.jar dans un bocal sur lui-même et l'inclure comme href nativelib dans mon jnlp, mais ne fonctionne pas. En outre, essayer d'encapsuler tous les appels aux fonctions natives dans l'applet avec doPrivileged ne fonctionne pas non plus.

Toute aide serait appréciée

Répondre

3

J'ai réussi à se débarrasser des messages d'essayer à nouveau.

Le problème est que JWS a des problèmes si ses fichiers archive et/ou base de code ne sont pas signés par la même autorité. Avec moi, le problème était que j'utilisais BouncyCastle et qu'il était déjà signé. Je l'ai désinscrit en utilisant jarsigner, puis je laisse signer tous les pots à Netbeans. Si vous ne désinscrivez pas les bibliothèques signées, Netbeans les ignorera et JWS se plaindra. Donc, n'utilisez jarsigner que pour vérifier si vos bocaux sont signés, utilisez jarsigner sur tous vos bocaux pour trouver qui les a signés. S'il y a des discordances, vous obtiendrez ce message. À votre santé.

+0

Toutes les fonctions d'applet que vous prévoyez d'appeler à partir de JavaScript doivent être enveloppées dans un bloc doPrivileged. – technomage

+1

dans mon cas ce n'était pas le problème, mais plutôt le fait qu'il y avait des pots parmi mes pots qui n'étaient pas signés par la même autorité. TOUS les pots doivent être explicitement signés par LE MÊME auteur. –