【问题标题】:JNA example program java.lang.NoClassDefFoundErrorJNA 示例程序 java.lang.NoClassDefFoundError
【发布时间】:2010-12-18 22:13:00
【问题描述】:

我可以编译这个 JNA 示例代码(来自https://github.com/twall/jna/#getting_started 的第 2 步):

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 jna noclassdeffounderror


    【解决方案1】:

    此示例(以及绝大多数 java 类)使用包:

    package com.sun.jna.examples;
    

    为了正确编译/运行它,您需要从“根”文件夹(例如“com”所在的文件夹)运行 javac / java:

    假设您有一个名为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
    

    注意前一种情况下的路径分隔符和后一种情况下的点。

    【讨论】:

    • 编译时,您还想包含 -d 。标志以及确保它吹出基于包的目录结构。否则类文件只会在当前目录中。
    • Rob,不会添加“-d”。编译时将类文件放在当前目录中。它似乎默认将其与 .java 源文件放在一起。为什么我不想这样做?
    • @Rob -“-d”标志确实指定了目标文件夹,但它与“根据包吹出目录结构”无关。后者总是如此。
    • @Daryl - 您可能不想在实际项目中这样做;将源代码与构建工件分开是一个好主意,原因有很多(比如更容易将源代码检查到 VCS 中)。不过,出于您的目的(运行一个示例),它完全没问题。
    • 我尝试删除类文件并使用javac -classpath .:jna.jar -g -d . com/sun/jna/examples/HelloWorld.java 编译,但“HelloWorld.class”和“HelloWorld$CLibrary.class”仍然在 com/sun/jna/examples/ 中创建(使用 HelloWorld .java).
    【解决方案2】:

    要么删除这一行并重新编译(在这种情况下很好,因为你只是尝试一些示例)

    package com.sun.jna.examples;
    

    或阅读 java 中的包是什么以及如何处理它们(ChssPly76s Posts as a starter)。

    最好选择第二个选项,因为您迟早(可能更早)将不得不处理包裹。所以现在就花点时间阅读一下吧。

    【讨论】:

      【解决方案3】:

      在 Eclipse 中,在 Java Build path &gt; Order and export 下,选择 export jna.jar

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        相关资源
        最近更新 更多