[技术]java.lang.UnsatisfiedLinkError: Can’t find dependent libraries的解决办法
我在java使用jni调用了用C++编写的dll,在eclipse中运行正常,但是在vs2010中调用这个exe时却出现java.lang.UnsatisfiedLinkError:
Can't find dependent libraries的错误,并且在别的机子上运行正常。
首先在网上找解决办法,基本上都是环境变量不对或程序不对,配置了各种环境变量,无果,在网上下了一个dependency
walker进行查看,发现缺少msvcrtd.dll文件。继续在网上下载此文件,按说明放在system32目录下,还是不行。查找这个dll的资料,我想看看这个dll究竟是何方大神。百科上这样写:
msvcrtd.dll是微软编译程序调试版本相关文件。全称为Microsoft (R) C Runtime Library
一般在编程序时,都是生成了调试版的程序,就是在那个Debug目录下的可执行文件。运行这调试版的exe文件,都会动态连接MFC42D.DLL和MSVCRTD.DLL这两个文件,所以你如果将这个文件在其它机器上运行而这台机器没有这两个文件或者缺少一个,系统则会出现:"找不到所需.dll文件-某某.dll"这样的提示。而一般系统都不带有这两个文件,除非是装了vc等。
恩,特别像我的情况!可是为什么还是不行呢?难道还少了另一个文件?于是下载MFC42D.DLL,放入system32目录下,还是不行。快疯。。
最后,让同事帮忙在她的Windows目录下找一下MSVCRTD.DLL文件,看是放在哪个目录下。。结果放在了C:\Windows\SysWOW64目录下。在此目录下粘贴这两个文件,终于成功!!
后来,仔细看了一下C:\Windows\SysWOW64这个目录,百科上这样解释:
WoW64 (Windows 32-bits on Windows 64-bit)是一个Windows操作系统的子系统, 能够运行32-bit 应用程序,
并且在所有的64-bit 版本的windows上都存在,包括:
Windows 2000 Limited Edition、 Windows XP
Professional x64 Edition、 IA-64 64-bit版本的Windows Server 2003
、64-bit版本的Windows Vista 、64-bit版本的Windows Server 2008、 64-bit版本的Win7、
64-bit版本的Win8。在Windows server 2008 R2上, 这是一个可选组件。
WoW64被设计用来处理许多在32-bit Windows 和64-bit Windows之间的不同, 尤其是在Windows自身的结构变化上的不同。
原来是这样!恍然大悟!因为我那个不能调用的dll文件是32位的,而我却是在64位机子上运行这个程序,所以要放进这个处理32位的目录下。