代码:public class TestDlg extends JFrame implements ActionListener {
private static final long serialVersionUID = -7495940408592595397L;
private JPanel mainPanel;
private Button b = new Button("设置目录");
public TestDlg() {
//设置框架初始化参数
this.setTitle("二代证读取");
this.setLocation(200, 50);

/*初始化工作开始*/
mainPanel = new JPanel(); //初始化主面板 //添加按钮监视事件
b.addActionListener(this); //将按钮添加到主面板
     mainPanel.add(b);

      //将主面板加入框架
           this.getContentPane().add(mainPanel);
this.setResizable(false);
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(660, 500);
     this.setVisible(true);
}

//此接口一定要继承StdCallLibrary 否则读卡错误!
public interface SynIDCardAPI extends StdCallLibrary  {
SynIDCardAPI INSTANCE = (SynIDCardAPI)Native.loadLibrary("SynIDCardAPI", SynIDCardAPI.class); public int Syn_SetPhotoPath(int iOption, char[] cPhotopath);
}
    
//继承自ActionListener
public void actionPerformed(ActionEvent e) {   
Object source = e.getSource();
if (source == b) {
     String strInfo = new String();
     JFileChooser fileChooser = new JFileChooser(".");
     fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
     fileChooser.setDialogTitle("打开文件夹");
     int ret = fileChooser.showOpenDialog(null);
     if (ret == JFileChooser.APPROVE_OPTION) {
     //文件夹路径
     System.out.println(fileChooser.getSelectedFile().getAbsolutePath());
     char[] strTmp  = fileChooser.getSelectedFile().getAbsolutePath().toCharArray();
     int nRet = SynIDCardAPI.INSTANCE.Syn_SetPhotoPath(0,strTmp);
             strInfo.format("照片存放路径设置为 %s,nRet = %d", strTmp, nRet);
     }
     else {
     strInfo = "选取路径失败!";
     }
System.out.println(strInfo);
}
else
System.out.println("Something   else");   
    }     
  
    public static void main(String[] args) {   
        new TestDlg();
    }   
}
其中,SynIDCardAPI.dll为C++编译的,放在项目目录\bin\com\synjones\angel下。错误信息:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Unable to load library 'SynIDCardAPI': ???????¨
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:155)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:216)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:191)
at com.sun.jna.Library$Handler.<init>(Library.java:131)
at com.sun.jna.Native.loadLibrary(Native.java:279)
at com.sun.jna.Native.loadLibrary(Native.java:265)
at com.synjones.angel.TestDlg$SynIDCardAPI.<clinit>(TestDlg.java:173)
at com.synjones.angel.TestDlg.actionPerformed(TestDlg.java:209)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

解决方案 »

  1.   

    public class UnsatisfiedLinkError
    extends LinkageError
    当 Java 虚拟机无法找到声明为 native 的方法的适当本地语言定义时,
    抛出该错误。 
    路过 顶下
      

  2.   

    把SynIDCardAPI.dll放到path路径下。最简单的,就是把SynIDCardAPI.dll放到c:\windows\system32里
      

  3.   

    相对路径换成绝对路径如下:
    SynIDCardAPI INSTANCE = (SynIDCardAPI)Native.loadLibrary("E:\\测试程序\\DLL\\SynIDCardAPI", SynIDCardAPI.class);
    程序就可以正确了,为什么?
    我想用相对路径的话我要设置环境变量吗?还是我的DLL放置位置不对?
      

  4.   

    我换成绝对路径还是出现Unable to load library 
      

  5.   

    放到system32
    采用绝对路径
    NativeLibrary.addSearchPath
    System.setProperty("jna.library.path", "F:\\DF6100d\\df6100d\\WebRoot\\WEB-INF\\classes\\");
    四种方法都试了,还是找不到
      

  6.   

    我也遇到这种问题,是在64位win7上出现的,但同样的代码在32位xp上正常
      

  7.   

    楼上64位的,换成32位jdk试试~~~我折腾了一天,终于知道问题所在了 T T~