Search code examples
javadllmethodsimportjna

Any DLL import throws an UnsatisfiedLinkError, though the DLL seems to load


I use Eclipse Java 32Bit JDK. I am trying to import a 32-Bit DLL, which i got very few documentation for. I am using com.sun.jna. The documentation tells me to call the method InitImagerIPC without any parameters.

As in this example i created an interface:

public interface ImagerIPC extends com.sun.jna.win32.StdCallLibrary{ 
  HRESULT InitImagerIPC ();
}

When I try to import the DLL no error occurs.

ImagerIPC lib = (ImagerIPC) Native.loadLibrary ("ImagerIPC", ImagerIPC.class);

But I receive an UnsatisfiedLinkError if I mistype my DLL name. So I guess it's loaded correctly?

But when I try to call

lib.InitImagerIPC();

I get the UnsatisfiedLinkError. :( Where's the mistake?

BTW: The DLL Export Viewer pulls out this info for the wanted method:

_InitImagerIPC@0    0x10001fc0  0x00001fc0  45 (0x2d)   
    ImagerIPC.dll   J:\<my Path>\ImagerIPC.dll  Exported Function

I am not sure about the naming. Do I also have to add the _?


Solution

  • Your DLL uses the stdcall calling convention, which typically has the compiler mangle function names to include the arguments' stack size. You need to use a StdCallFunctionMapper passed in as the Library.OPTION_FUNCTION_MAPPER option when you load your library (or recompile your library to use undecorated names).

    Library.loadLibrary("myLib", myLib.class, new HashMap() { { put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper()); } });