jna导入DLL出现Unable to load library问题

jinling4388 2009-12-24 11:15:33
代码:

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)
...全文
15181 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sun_Wu 2012-10-26
  • 打赏
  • 举报
回复
10楼正解,谢了
冰点青蛙 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

楼上64位的,换成32位jdk试试~~~我折腾了一天,终于知道问题所在了 T T~
[/Quote]
帮我解决了问题。你的头像真tm可爱!
wsnangua 2012-07-12
  • 打赏
  • 举报
回复
楼上64位的,换成32位jdk试试~~~我折腾了一天,终于知道问题所在了 T T~
jinling4388 2012-01-17
  • 打赏
  • 举报
回复
我没用win7,用的XP
hedyn 2012-01-13
  • 打赏
  • 举报
回复
我也遇到这种问题,是在64位win7上出现的,但同样的代码在32位xp上正常
yxssz 2011-11-16
  • 打赏
  • 举报
回复
放到system32
采用绝对路径
NativeLibrary.addSearchPath
System.setProperty("jna.library.path", "F:\\DF6100d\\df6100d\\WebRoot\\WEB-INF\\classes\\");
四种方法都试了,还是找不到
lazy_virus 2011-07-08
  • 打赏
  • 举报
回复
我换成绝对路径还是出现Unable to load library
jinling4388 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zl3450341 的回复:]
Java codepublicclass UnsatisfiedLinkErrorextends LinkageError
当 Java 虚拟机无法找到声明为native 的方法的适当本地语言定义时,
抛出该错误。
路过 顶下
[/Quote]

那怎么改呀?

回复3#:放过去了,问题依旧存在。
墨水鱼 2009-12-24
  • 打赏
  • 举报
回复
把SynIDCardAPI.dll放到path路径下。最简单的,就是把SynIDCardAPI.dll放到c:\windows\system32里
老张-AI 2009-12-24
  • 打赏
  • 举报
回复
public class UnsatisfiedLinkError
extends LinkageError
当 Java 虚拟机无法找到声明为 native 的方法的适当本地语言定义时,
抛出该错误。

路过 顶下
jinling4388 2009-12-24
  • 打赏
  • 举报
回复
相对路径换成绝对路径如下:
SynIDCardAPI INSTANCE = (SynIDCardAPI)Native.loadLibrary("E:\\测试程序\\DLL\\SynIDCardAPI", SynIDCardAPI.class);
程序就可以正确了,为什么?
我想用相对路径的话我要设置环境变量吗?还是我的DLL放置位置不对?
jinling4388 2009-12-24
  • 打赏
  • 举报
回复
顶起来,大家帮忙呀

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧