如何解决java调dll报Unable to load library的错误
2018-07-04 · 百度认证:北京新东方迅程网络科技股份有限公司官方账号
新东方在线网络课堂
新东方在线是新东方集团旗下唯一专业在线教育网站,提供出国留学、考研培训、英语培训和职业教育培训的综合网络教育培训机构。致力于为广大用户提供个性化、互动化、智能化的在线学习体验。
向TA提问
关注
展开全部
解决java调dll报Unable to load library的错误可以尝试以下方法:
载入库文件有两个函数,System.load 和 System.loadLibrary。
当使用System.load时,需要输入文件的全路径,例如:System.load(“/tmp/test.so”);
当使用System.loadlibrary时是在系统的library 的目录中需找复合条件的库文件,可以使用-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(*.so,*.dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。
Linux还要注意,使用System.loadLibrary(name)方法其中参数内容与Windows有区别,Linux中的的库文件名为libname.so,Windows为name.dll。
在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。
不过具体问题还要具体对待!
载入库文件有两个函数,System.load 和 System.loadLibrary。
当使用System.load时,需要输入文件的全路径,例如:System.load(“/tmp/test.so”);
当使用System.loadlibrary时是在系统的library 的目录中需找复合条件的库文件,可以使用-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(*.so,*.dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。
Linux还要注意,使用System.loadLibrary(name)方法其中参数内容与Windows有区别,Linux中的的库文件名为libname.so,Windows为name.dll。
在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。
不过具体问题还要具体对待!
展开全部
1、必须确保设定的路径下有需要加载的dll文件;
2、jar是64位,则dll文件必须也是64位,如果jar是32位,则dll文件必须也是32位;
3、PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary("soft\\hikvision\\PlayCtrl", PlayCtrl.class);
其中"soft\\hikvision\\PlayCtrl"可以是绝对路径,也可以是相对路径,但是,路径分隔符必须是\,不能是/,(这里使用\\是因为第一个\是转义字符)(别问我为什么,我也不知道,我就是这样改了之后就可以了)
4、在Tomcat中调用时,可将dll文件放在src目录下,编译后会自动存放到WebRoot\WEB-INF\classes\路径下,在调用时可使用如下方法:
String path = HCNetSDK.class.getResource("/").getPath()+"HCNetSDK.dll";
// 如何tomcat路径中有空格,加上这句path=path.replaceAll("%20", " ");
// 上述方法获取的path最前边第一个字符是/,如【/d:/RTSMS_x64/Servent/HCNetSDKCom/HCNetSDK.dll】
所以我用了以下方法
String path = (HCNetSDK.class.getResource("/").getPath()+"HCNetSDK.dll").replaceAll("%20", " ").substring(1).replace("/", "\\");
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class);
2、jar是64位,则dll文件必须也是64位,如果jar是32位,则dll文件必须也是32位;
3、PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary("soft\\hikvision\\PlayCtrl", PlayCtrl.class);
其中"soft\\hikvision\\PlayCtrl"可以是绝对路径,也可以是相对路径,但是,路径分隔符必须是\,不能是/,(这里使用\\是因为第一个\是转义字符)(别问我为什么,我也不知道,我就是这样改了之后就可以了)
4、在Tomcat中调用时,可将dll文件放在src目录下,编译后会自动存放到WebRoot\WEB-INF\classes\路径下,在调用时可使用如下方法:
String path = HCNetSDK.class.getResource("/").getPath()+"HCNetSDK.dll";
// 如何tomcat路径中有空格,加上这句path=path.replaceAll("%20", " ");
// 上述方法获取的path最前边第一个字符是/,如【/d:/RTSMS_x64/Servent/HCNetSDKCom/HCNetSDK.dll】
所以我用了以下方法
String path = (HCNetSDK.class.getResource("/").getPath()+"HCNetSDK.dll").replaceAll("%20", " ").substring(1).replace("/", "\\");
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class);
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
载入库文件有两个函数System.load和System.loadLibrary。
当使用System.load时,需要输入文件的全路径,例如:System.load(“/tmp/test.so”);
当使用System.loadlibrary时是在系统的library的目录中需找复合条件的库文件,可以使用
-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(
*.so,*.dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。
Linux还要注意,使用System.loadLibrary(name)方法其中参数内容与Windows有区别,
Linux中的的库文件名为libname.so,.dll。
在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。
当使用System.load时,需要输入文件的全路径,例如:System.load(“/tmp/test.so”);
当使用System.loadlibrary时是在系统的library的目录中需找复合条件的库文件,可以使用
-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(
*.so,*.dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ld.so.conf.d/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。
Linux还要注意,使用System.loadLibrary(name)方法其中参数内容与Windows有区别,
Linux中的的库文件名为libname.so,.dll。
在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-12-03
展开全部
dll 没有放到JAVA找得到的PATH中,放C:\windows\System32(WinXP/WIN7等)试试。。。。其实很多时候和.class放一起也是很不错的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-10-03
展开全部
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'HelloWorld': ???????¨
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:166)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:239)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:393)
at com.sun.jna.Native.loadLibrary(Native.java:378)
at text.Jnadlltest$HelloWorld.<clinit>(Jnadlltest.java:15)
at text.Jnadlltest.main(Jnadlltest.java:34)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:166)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:239)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:393)
at com.sun.jna.Native.loadLibrary(Native.java:378)
at text.Jnadlltest$HelloWorld.<clinit>(Jnadlltest.java:15)
at text.Jnadlltest.main(Jnadlltest.java:34)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询