Search code examples
javaeclipsejava-native-interfaceunsatisfiedlinkerror

Executing Java application that makes a JNI call, with eclipse, fails with UnsatisfiedLinkError: Can't find dependent libraries


I have a Java program that calls a function in a JNI library. The JNI code statically loads another shared library.

When executing the Java application using Eclipse, I get an error java.lang.UnsatisfiedLinkError: ... Can't find dependent libraries

But, if i execute the same command in commandline, the program works fine. What am I doing wrong in Eclipse?

I made sure to go to Debug View -> Processs -> Process Properties to get the same command string and same working directory as Eclipse execution.


Solution

  • Here is a PD procedure that might help you identify the problem.

    Add the following to your program to identify the differences in the arch and load paths between the two runtime environments. Investigate any differences in path/arch.

     System.out.println(System.getProperty("java.library.path"));
     System.out.println(System.getProperty("sun.arch.data.model"));
    

    You can use the dumpbin.exe utility to identify the dependencies needed by the DLL that is being loaded. Make sure the dependencies exist. Example usage:

    C:> dumpbin /imports your.dll 
    
    Dump of file your.dll
    File Type: DLL
      Section contains the following imports:
        **KERNEL32.dll**
    

    You can use the where.exe command to find the location of the dependencies. Example usage:

    C:>where KERNEL32.dll
        C:\Windows\System32\kernel32.dll
    

    If you see:

    C:>where KERNEL32.dll
        INFO: Could not find files for the given pattern(s)
    

    Investigate why the dependent DLL is not on the path.

    You can use the dumpbin.exe command to check 64bit vs 32bit.
    Example:

    C:>dumpbin /headers yourd.dll
    
     Dump of file yourd.dll
     PE signature found
     File Type: DLL
     FILE HEADER VALUES
             14C machine (x86)    <-- 32bit DLL
    
    C:>dumpbin /headers yourd.dll
    
     Dump of file yourd.dll
     PE signature found
     File Type: DLL
     FILE HEADER VALUES
             8664 machine (x64)    <-- 64bit DLL
    

    Investigate any 32bit vs 64bit mismatches between main/dependent. If your JVM is 32bit, you need to use 32bit DLLs. If your JVM is 64bit, you need to use 64bit DLLs. ( It is okay to run a 32bit JVM on a 64bit OS but the JNI DLLs must be 32bit ( DLLs match the JVM not the OS ).