如何解决java调dll报Unable to load library的错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决java调dll报Unable to load library的错误相关的知识,希望对你有一定的参考价值。
java调用dll文件有两个函数,分别为System.load 和 System.loadLibrary。如果在调用时出现Unable to load library的错误,可以通过下面的步骤进行解决:
1、使用System.load时需要输入文件的全路径,比如:
System.load(“D:\\\\eclipse\\\\test.dll”);如果使用该函数报错,首先需要检查路径是否写全写对,然后到指定的路径检查文件是否存在,有没有被隐藏或者加密;
2、使用System.loadlibrary函数时,应用会在系统的library的目录中寻找符合条件的库文件,在window系统下,需要将需要加载的库文件(.dll)放在JDK安装目录下的include目录下,在linux系统下一般是放到/usr/lib目录下。
也可以使用-Djava.library.path=[path]参数,来指定Java程序加载库文件的路径。
3、在window中,最好使用Windows的C/C++编译器生成dll文件,否则调用会有一些问题。
参考技术A 载入库文件有两个函数,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文件,否则会出现问题。
亲测解决dump导出JAVA堆内存文件报错:Unable to open socket file: target process not responding or HotSpot VM not lo
背景
日前服务器一个应用总是莫名挂掉,通过排查发现是老年代内存无法回收引起,那么要定位到到底是那一部分数据导致的无法回收,就需要把堆内存dump出来,然后用工具分析。但奇怪的是dump的时候一直报错
Unable to open socket file: target process not responding or HotSpot VM not lo
解决方案
网上找了很多方案,都没效果,最终通过一些文章的启示,自己找到了解决方案。
问题引起的原因
由于Linux一切皆文件的特性,也就是说一个Java进程实际上会对应到一个PID文件,dump命令依赖于进程的PID文件,报错这个是由于这个PID文件可能已经被系统给删除了。
linux系统有个删除管理机制:系统每天会用tmpwatch命令检查并删除 /tmp 下超过240小时未访问过的文件和目录。
问题的解决方案
Linux有个文件(/usr/lib/tmpfiles.d/tmp.conf
)中记录着一些目录,这些目录中不会被自动删除,我们需要在这个文件中配置我们的JAVA进程的PID目录。
第一步:先找到PID所在目录
先用JPS命令得到进程号
32383为我的JAVA应用的进程号,然后我们去/tmp
目录下找这个进程号
很明显这里没有32383,但这里有个hsperfdata_root
目录不知道是什么东西,进去看看
这里有31383,那么也就是说/tmp/hsperfdata_root
目录即是要排除在外的目录。
第二步:把找到的目录添加到文件内容中
vi /usr/lib/tmpfiles.d/tmp.conf
添加如下内容
/*
代表目录下的所有文件,添加之后应该是立即生效的,无需重启。如此,即可避免文件被系统删掉。
其他事项
以上解决方案是我在我的系统中亲测成功的方案,由于系统版本不同,我的解决办法可能不适用于你,你需要尝试。
我的Linux内核版本为Linux version 3.10.0-1062.1.1.el7.x86_64
系统版本为CentOS Linux release 7.5.1804
我不确定其他系统版本的设置方式是否一致,有的系统可能没有/usr/lib/tmpfiles.d/tmp.conf
这个文件,那么可以看看是否存在/etc/cron.daily/tmpwatch
这个文件,存在的话可以在这个文件中添加排除项,添加方式与本文一致。
如果依然无法解决,可以看看我参考的两篇文章,寻找解决方案。
参考
https://www.cnblogs.com/vsop/p/10943753.html
https://blog.51cto.com/zhangshaoxiong/1310166
以上是关于如何解决java调dll报Unable to load library的错误的主要内容,如果未能解决你的问题,请参考以下文章
如何解决java调dll报Unable to load library的错误
如何解决java调dll报Unable to load library的错误
亲测解决dump导出JAVA堆内存文件报错:Unable to open socket file: target process not responding or HotSpot VM not lo
Unable to load dynamic library ext/php_ldap.dll
unable to inject dll into target怎么解决?
Java调用https服务报错unable to find valid certification path to requested target的解决方法