2009-11-20 2 views
3

я могу скомпилировать этот ЮНА пример кода (из шага 2 https://github.com/twall/jna/#getting_started):ЮНА пример программы 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]); 
     } 
    } 
} 

... используя javac -classpath .:jna.jar -g HelloWorld.java без ошибок. (Я скачал jna.jar и поместить его в тот же каталог, Helloworld.java на данный момент.)

Но когда я запускаю его с помощью java -classpath .:jna.jar HelloWorld, я получаю:

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) 

я получаю точно такое же исключение на Mac OS X и Linux.

Как это сделать?

ответ

9

Этот пример (как и подавляющее большинство классов Java) использует пакеты:

package com.sun.jna.examples; 

Для того, чтобы скомпилировать/запустить его правильно, вы должны запустить JAVAC/Java из папки «корневой» (например, папку где находится «com»):

Предположим, у вас есть папка с именем examples. Вы бы поставили как jna.jar и исходный код в нем сохраняя структуру папок:

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

Вы скомпилировать и запустить с помощью:

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

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

Примечания разделителей пути в первом случае и точках в последний.

+0

При компиляции вы также хотите включить -d. чтобы убедиться, что он удаляет базу каталогов на пакете. В противном случае файл класса будет только в текущем каталоге. –

+0

Роб, не добавлял бы «-d». при компиляции класть файл класса в текущий каталог. По умолчанию он по умолчанию помещается в исходный файл .java. Почему я не хочу этого делать? –

+0

@Rob - флаг «-d» задает целевую папку, но не имеет ничего общего с «выдуванием структуры каталога на основе пакета». Последнее всегда ** - случай. – ChssPly76

3

Либо просто удалите эту строку и перекомпилировать (что хорошо в этом случае, как вы просто попробовать некоторый образец)

package com.sun.jna.examples; 

или прочитать о том, какие пакеты в Java и как они должны быть обработаны (ChssPly76s Сообщения как стартер).

Лучше выбрать второй вариант, как только рано или поздно (возможно, скорее) вам все равно придется иметь дело с пакетами. Так что просто найдите время, чтобы прочитать его.

-1

В Eclipse, под Java Build path > Order and export, выберите export jna.jar.

Смежные вопросы