2009-11-20 172 views
3

我可以編譯該JNA示例代碼(從https://github.com/twall/jna/#getting_started步驟2):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]); 
     } 
    } 
} 

...用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。標誌以及確保它吹出包裝上的目錄結構。否則,類文件將只在當前目錄中。 – 2009-11-20 23:04:23

+0

Rob,不會添加「-d」。編譯時將類文件放在當前目錄中。它似乎默認將它放在.java源文件中。爲什麼我不想這樣做? – 2009-11-20 23:15:54

+0

@Rob - 「-d」標誌指定了目標文件夾,但它與「根據軟件包吹出目錄結構」無關。後者是**總是**的情況。 – ChssPly76 2009-11-20 23:17:09

3

要麼只是刪除此行並重新編譯(在這種情況下,罰款,你只是嘗試一些樣品)

package com.sun.jna.examples; 

或什麼Java包是讀了,他們怎麼也得處理( ChssPly76s發佈作爲首發)。

最好選擇第二個選項是遲早(可能更早),你總得去面對與封裝。所以現在請花時間閱讀它。

-1

在Eclipse中,Java Build path > Order and export下,選擇export jna.jar