即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

如何修复了UnsatisfiedLinkError错误(可以与# 39;找不到依赖库)在JNI项目

栈溢出 YCF_L 77℃ 0评论
本文目录
[隐藏]

1.原始问题:How to fix an UnsatisfiedLinkError (Can't find dependent libraries) in a JNI project

I’m working on a Java project that uses the JNI. The JNI calls a custom library that I’ve written myself, let’s say mylib.dll, and that depends on a 3rd party library, libsndfile-1.dll.

When I run my program it crashes with

java.lang.UnsatisfiedLinkError:  C:\...path...\mylib.dll: Can't find dependent libraries.

I’ve searched this site (and others) and I’ve tried a number of fixes:

  1. I ran dependency walker. DW gave a couple of warnings — that two libraries required by libsndfile, MPR.DLL and SHLWAPI.DLL, had “unresolved imports” — but the DW FAQ said that these warnings could be safely ignored.

  2. I fixed the method names in mylib.dll, as suggested here. The method names had somehow gotten mangled by the compiler, but I added linker flags and the dll method names now match those in my jni header file exactly.

  3. I put all of these DLLs in the same directory — the same directory as the .jar that calls them — to ensure that they’re on the right PATH.

No dice.

Does anyone have any idea what’s going on?

I’m doing my development in Visual Studio 2010 on a MacBook pro (via Parallels). I’m doing my testing in Windows XP on a toshiba laptop.

2.被采纳答案

I’m pretty sure the classpath and the shared library search path have little to do with each other. According to The JNI Book (which admittedly is old), on Windows if you do not use the java.library.path system property, the DLL needs to be in the current working directory or in a directory listed in the Windows PATH environment variable.


Update:

Looks like Oracle has removed the PDF from its website. I’ve updated the link above to point to an instance of the PDF living at University of Texas – Arlington.

Also, you can also read Oracle’s HTML version of the JNI Specification. That lives in the Java 8 section of the Java website and so hopefully will be around for a while.


Update 2:

At least in Java 8 (I haven’t checked earlier versions) you can do:

java -XshowSettings:properties -version

to find the shared library search path. Look for the value of the java.library.path property in that output.

3.其他高票答案

3.1.第1个答案

I want to inform this interesting case, after tried all the above method, the error is still there. The weird thing is it works on a Windows 7 computer, but on Windows XP it is not. Then I use dependency walker and found on the Windows XP there is no VC++ Runtime as my dll requirement. After installing VC++ Runtime package (here enter link description here) it works like a charm. The thing that disturbed me is it keeps telling Can’t find dependent libraries, while intuitively the JNI dependent dll is there, however it finally turns out the JNI dependent dll requires another dependent dl. I hope this helps.

3.2.第2个答案

You need to load your JNI library.

System.loadLibrary loads the DLL from the JVM path (JDK bin path).

If you want to load an explicit file with a path, use System.load()

See also: Difference between System.load() and System.loadLibrary in Java

3.3.第3个答案

Did have identical problem with on XP machine when installing javacv and opencv in compination with Eclipse
it turned out that I was missing the following files
msvcp100.dll and
msvcr100.dll
once these were installed project compiled and ran OK

3.4.第4个答案

If you load a 32 bit version of your dll with a 64 bit JRE you could have this issue. This was my case.

转载请注明:CodingBlog » 如何修复了UnsatisfiedLinkError错误(可以与# 39;找不到依赖库)在JNI项目

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情