JNA exemple de programme java.lang.NoClassDefFoundError
Je peux compiler ce JNA exemple de code (à partir 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]);
}
}
}
...à l'aide de javac -classpath .:jna.jar -g HelloWorld.java
sans erreur. (J'ai téléchargé jna.jar et le mettre dans le même répertoire que HelloWorld.java pour l'instant.)
Mais lorsque je l'exécute à l'aide de java -classpath .:jna.jar HelloWorld
, j'obtiens:
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 obtenir exactement la même exception sur Mac OS X et Linux.
Comment puis-je l'obtenir?
OriginalL'auteur Daryl Spitzer | 2009-11-20
Vous devez vous connecter pour publier un commentaire.
Cet exemple (ainsi que la grande majorité des classes java) utilise des packages:
Afin de compiler /exécuter correctement, vous devez exécuter javac /java à partir du dossier "racine" (par exemple le dossier où "com" est situé):
Disons que vous avez un dossier appelé
examples
. Vous mettriez à la fois lajna.jar
et le code source en elle gardant la structure du dossier:Vous compilez et exécutez l'aide de:
Note les séparateurs de chemin dans le premier cas et de points dans le second.
Rob, ne serait pas d'ajouter l'option "-d ." lors de la compilation de mettre le fichier de la classe dans le répertoire courant. Il semble que par défaut de la mettre avec le .fichier source de java. Pourquoi ne voudrais-je pas le faire?
drapeau ne doit spécifier le dossier de destination, mais il n'a rien à voir avec "souffler structure de répertoire basé sur l'emballage". Ce dernier est toujours le cas.
vous ne voulez pas le faire dans un projet réel, garder votre source séparément de construire des artefacts est une bonne idée pour de nombreuses raisons (comme ce qui rend beaucoup plus facile à vérifier vos sources dans VCS). Pour vos besoins, mais que l'exécution d'un exemple), c'est très bien comme il est.
J'ai essayé de supprimer les fichiers de classe et de la compilation avec
javac -classpath .:jna.jar -g -d . com/sun/jna/examples/HelloWorld.java
, mais "HelloWorld.class" & "HelloWorld$CLibrary.class" sont toujours créés en com/sun/jna/exemples/ (avec HelloWorld.java).OriginalL'auteur ChssPly76
Soit simplement supprimer cette ligne et de le recompiler (ce qui est bien dans ce cas que vous essayez juste quelques exemples)
ou de lire sur ce que les packages en java sont et comment ils doivent être traités (ChssPly76s Postes en tant que starter).
Mieux choisir la deuxième option, car tôt ou tard (probablement plus tôt), vous devrez composer avec les forfaits de toute façon. Il suffit donc de prendre le temps de la lire.
OriginalL'auteur jitter
Dans Eclipse, sous
Java Build path > Order and export
, sélectionnezexport jna.jar
.OriginalL'auteur user2408280
Ici est un bon exemple (en espagnol), http://bdevmex.blogspot.mx/2013/01/comunicar-aplicaciones-mediante-jna.html j'espère que cela peut vous aider à
OriginalL'auteur Sergio