Question

Je peux compiler le code d'exemple JNA (de l'étape 2 de https://github.com/ twall / jna / # Getting_Started):

package com.sun.jna.examples;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {

    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                               CLibrary.class);

        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i=0;i < args.length;i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

... en utilisant javac -classpath .:jna.jar -g HelloWorld.java sans erreur. (Je l'ai téléchargé jna.jar et le mettre dans le même répertoire que HelloWorld.java pour l'instant.)

Mais quand je le lance à l'aide java -classpath .:jna.jar HelloWorld, je reçois:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/sun/jna/examples/HelloWorld)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

Je reçois la même exception exacte sur Mac OS X et Linux.

Comment puis-je obtenir ce à courir?

Était-ce utile?

La solution

Cet exemple (ainsi que grande majorité des classes java) utilise des paquets:

package com.sun.jna.examples;

Pour compiler / exécuter correctement, vous devez exécuter javac / java à partir du dossier « racine » (par exemple le dossier où se trouve « com »):

Disons que vous avez un dossier appelé examples. Vous mettriez à la fois le jna.jar et le code source dans la structure il dossier préserver :

/examples
 jna.jar
 /com
   /sun
      /jna
         /examples
           HelloWorld.java

Vous compilez et exécutez en utilisant:

javac -classpath .:jna.jar -g com/sun/jna/examples/HelloWorld.java

java -classpath .:jna.jar com.sun.jna.examples.HelloWorld

Notez les séparateurs de chemin dans le premier cas et des points dans ce dernier.

Autres conseils

soit juste supprimer cette ligne et recompiler (ce qui est bien dans ce cas que vous essayez juste quelques-uns échantillon)

package com.sun.jna.examples;

ou lire sur les paquets en java et comment ils doivent être manipulés (ChssPly76s messages en entrée).

Mieux vaut choisir la deuxième option que tôt ou tard (probablement plus tôt), vous aurez à traiter avec des paquets de toute façon. Il suffit donc de prendre le temps de lire sur le sujet.

Voici un bon exemple (en espagnol), http: //bdevmex.blogspot.mx/2013/01/comunicar-aplicaciones-mediante-jna.html J'espère que cela peut vous aider

Dans Eclipse, sous Java Build path > Order and export, sélectionnez export jna.jar.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top