2009-11-20 4 views
3

je peux compiler ce code exemple JNA (de l'étape 2 de https://github.com/twall/jna/#getting_started):exemple de programme JNA java.lang.NoClassDefFoundError

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 lancer cette opération?

Répondre

9

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 » (dossier, par exemple où "com" se trouve):

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

/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 le dernier.

+0

Lors de la compilation, vous souhaitez également inclure le -d. drapeau aussi pour s'assurer qu'il souffle la base de la structure du répertoire sur le paquet. Sinon, le fichier de classe sera simplement dans le répertoire courant. –

+0

Rob, n'ajouterait pas "-d." lors de la compilation, placez le fichier de classe dans le répertoire courant. Il semble que ce soit par défaut pour le mettre avec le fichier source .java. Pourquoi je ne voudrais pas faire ça? –

+0

@Rob - L'indicateur "-d" spécifie le dossier cible mais n'a rien à voir avec "souffler la structure du répertoire en fonction du paquet". Ce dernier est ** toujours ** le cas. – ChssPly76

3

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 (Messages de ChssPly76s comme démarreur).

Mieux vaut choisir la deuxième option plus tôt ou plus tard (probablement plus tôt) vous devrez faire face à des paquets de toute façon. Alors, prenez le temps de lire à ce sujet.

-1

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

Questions connexes