Java JNA 本机库调用 NoClassDefFoundError

Posted

技术标签:

【中文标题】Java JNA 本机库调用 NoClassDefFoundError【英文标题】:Java JNA Native Library Call NoClassDefFoundError 【发布时间】:2016-07-02 12:48:24 【问题描述】:

我想使用 Java 将文件放入 Windows 中的回收站。以便用户能够恢复它。

因此我使用库 JNA from Github (jna-platform-4.2.2.jar) 来访问本机 Windows 函数。

我的代码:

public static boolean moveToTrashBin(File file)

    FileUtils fileUtils = FileUtils.getInstance();

    if(fileUtils.hasTrash())   // returns true
        try
            fileUtils.moveToTrash(new File[]file);   // throws Exception
            return true;
         catch (IOException e) 
            e.printStackTrace();
        
    

    return false;

没有编译时错误,但是当我尝试运行它时,fileUtils.moveToTrash(..) 行会抛出以下 NoClassDefFoundError 和 ClassNotFoundExeption:

线程“AWT-EventQueue-0”中的异常java.lang.NoClassDefFoundError: com/sun/jna/win32/StdCallLibrary 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:760) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:455) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:73) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:367) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:361) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:360) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:760) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:455) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:73) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:367) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:361) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:360) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 com.sun.jna.platform.win32.W32FileUtils.moveToTrash(W32FileUtils.java:28) 在 DropboxFix.Gui.Tools.moveToTrashBin(Tools.java:21) 在 DropboxFix.Gui.Gui.btnDeleteFoundOnClick(Gui.java:208) 在 DropboxFix.Gui.Gui.access$1600(Gui.java:34) 在 DropboxFix.Gui.Gui$6.actionPerformed(Gui.java:357) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 在 java.awt.Component.processMouseEvent(Component.java:6525) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3322) 在 java.awt.Component.processEvent(Component.java:6290) 在 java.awt.Container.processEvent(Container.java:2234) 在 java.awt.Component.dispatchEventImpl(Component.java:4881) 在 java.awt.Container.dispatchEventImpl(Container.java:2292) 在 java.awt.Component.dispatchEvent(Component.java:4703) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 在 java.awt.Container.dispatchEventImpl(Container.java:2278) 在 java.awt.Window.dispatchEventImpl(Window.java:2739) 在 java.awt.Component.dispatchEvent(Component.java:4703) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751) 在 java.awt.EventQueue.access$500(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:702) 在 java.awt.EventQueue$3.run(EventQueue.java:696) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 在 java.awt.EventQueue$4.run(EventQueue.java:724) 在 java.awt.EventQueue$4.run(EventQueue.java:722) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:721) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 原因:java.lang.ClassNotFoundException: com.sun.jna.win32.StdCallLibrary 在 java.net.URLClassLoader$1.run(URLClassLoader.java:372) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:361) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:360) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 66 更多

我使用 IntelliJ 作为 IDE,并在“项目结构 -> 库 -> 添加”下添加了库。

我该如何解决这个问题?

【问题讨论】:

其实是NoClassDefFoundError @JornVernee 抱歉,已修复。 【参考方案1】:

我发现了错误,只需将第二个库 jna-4.2.2.jar 从网站添加到我的项目中..

我现在工作!

【讨论】:

以上是关于Java JNA 本机库调用 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

使用 JNA 本机等待调用检测线程中断 (Windows)

使用 JNA 将本机 C 函数映射到 Java 接口时的指针问题

java使用JNA框架调用dll动态库

JNA:本机库依赖项和JAR提取

无法使用 JNA 找出本机类型的映射

java通过JNA调用动态库