“线程中的异常”;“主要”;java.lang.UnsatifiedLink错误:在资源路径中找不到JNIDSpatch(/com/sun/jna/win32-x86/JNIDSpatch.dll)

“线程中的异常”;“主要”;java.lang.UnsatifiedLink错误:在资源路径中找不到JNIDSpatch(/com/sun/jna/win32-x86/JNIDSpatch.dll),java,jar,jna,Java,Jar,Jna,我有一个小测试程序,可以在JBuilder6调试器中完美运行。当我创建一个.jar文件并运行它时,我得到一个错误 >java -jar testadll.jar Start of DLL test Exception in thread "main" java.lang.UnsatisfiedLinkError: jnidispatch (/com/sun /jna/win32-x86/jnidispatch.dll) not found in resource path at c

我有一个小测试程序,可以在JBuilder6调试器中完美运行。当我创建一个.jar文件并运行它时,我得到一个错误

>java -jar testadll.jar
Start of DLL test
Exception in thread "main" java.lang.UnsatisfiedLinkError: jnidispatch (/com/sun
/jna/win32-x86/jnidispatch.dll) not found in resource path
    at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:708)
    at com.sun.jna.Native.loadNativeLibrary(Native.java:685)
    at com.sun.jna.Native.<clinit>(Native.java:109)
    at testadll.TestThisDLL$PenniesLib.<clinit>(TestThisDLL.java:24)
    at testadll.TestThisDLL.main(TestThisDLL.java:33)

显然,您已经将JNA的类与自己的jar文件合并,但忽略了它的本机支持。确保将原始
jna.jar
中的所有文件(不仅仅是类文件)复制到新目标,并保留其原始路径


具体来说,jar文件必须包括com/sun/jna/win32-x86/jnidispatch.dll。如果您想包括对其他平台的支持,那么必须包括com/sun/jna/*/jnidspatch。

您显然已经将jna的类与您自己的jar文件合并,但忽略了它的本机支持。确保将原始
jna.jar
中的所有文件(不仅仅是类文件)复制到新目标,并保留其原始路径


具体来说,jar文件必须包括com/sun/jna/win32-x86/jnidispatch.dll。如果您想包括对其他平台的支持,那么还必须包括com/sun/jna/*/jnidspatch。

您应该使用支持64位的jna.jar版本
jna-4.1.0.jar或jna-3.4.0.jar。

您应该使用支持64位的jna.jar版本
jna-4.1.0.jar或jna-3.4.0.jar。

您是否在类路径中包含了文件
jna.jar
?您是否在类路径中包含了文件
jna.jar
?我找不到让JBuilder 6这样做的方法。我通过使用WinZip并将jna.jar的内容提取到与TestaDLL.jar相同的目录来实现它。然后,我通过运行jar-uf0 TestaDll.jar com\sun\jna\win32-x86\jnidispatch.dll更新了TestaDll.jar。这是最简单的方法吗?在JBuilder支持论坛上提问。大多数IDE都允许您自定义jar文件中的内容。请阅读关于如何在jar文件中包含非类文件的部分。我找不到让JBuilder 6这样做的方法。我通过使用WinZip并将jna.jar的内容提取到与TestaDLL.jar相同的目录来实现它。然后,我通过运行jar-uf0 TestaDll.jar com\sun\jna\win32-x86\jnidispatch.dll更新了TestaDll.jar。这是最简单的方法吗?在JBuilder支持论坛上提问。大多数IDE都允许您自定义进入jar文件的内容。
package testadll;

import com.sun.jna.Library;
import com.sun.jna.Native;
//import com.sun.jna.NativeLong;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
//import com.sun.jna.*;



public class TestThisDLL {
   public interface PenniesLib extends StdCallLibrary {
    PenniesLib INSTANCE = (PenniesLib) Native.loadLibrary(
            "PenniesLib", PenniesLib.class);
        int a();
    }

  public static void main( String args[] ) {
      System.out.println("Start of DLL test");
      //TestDLL t = new TestDLL();
      //System.out.println("DLL loaded");
      int value = PenniesLib.INSTANCE.a();
      System.out.println("DLL response is " + String.valueOf(value));
  }
}