Пример программы JNA java.lang.NoClassDefFoundError
-
21-09-2019 - |
Вопрос
Я могу скомпилировать этот пример кода JNA (из шага 2 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]);
}
}
}
...с использованием 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.
Как мне заставить это работать?
Решение
В этом примере (как и в подавляющем большинстве классов 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
Обратите внимание на разделители путей в первом случае и точки во втором.
Другие советы
Либо просто удалите эту строку и перекомпилируйте (в данном случае это нормально, поскольку вы просто пробуете какой-нибудь образец)
package com.sun.jna.examples;
или узнайте, что такое пакеты в Java и как с ними обращаться (сообщения ChssPly76s в качестве начала).
Лучше выберите второй вариант, так как рано или поздно (возможно, раньше) вам все равно придется иметь дело с пакетами.Так что просто найдите время, чтобы прочитать об этом.
Вот хороший пример (на испанском языке): http://bdevmex.blogspot.mx/2013/01/comunicar-aplicaciones-mediante-jna.html Я надеюсь, что это поможет вам
В Eclipse под Java Build path > Order and export
, выбирать export jna.jar
.