I have been going through links on StackOverflow on how to resolve the Method name mangling but did not find any solution with a real time example.
Scenario-A C++ Ex.dll file is provided by client. I need to access the Ex.dll and call the methods in the same through Java.
Restrictions- Cannot modify the Ex.dll, i can only access the same.
Issue Faced- Getting the below exception when i access the Ex.dll through JNA
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'getCPUSpeed': The specified procedure could not be found.
at com.sun.jna.Function.<init>(Function.java:134)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:336)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:316)
at com.sun.jna.Library$Handler.invoke(Library.java:203)
at $Proxy0.getCPUSpeed(Unknown Source)
at cpp.java.JnaTest.main(JnaTest.java:16)
Googled a lot and found that its due to method name Mangling, but again could not find any good sample code with the solution.
This is code i used-
import com.sun.jna.Native;
class JnaTest
{
public static void main(String args[])
{
try
{
JnaInterface jInterface = (JnaInterface) Native.loadLibrary("Ex", JnaInterface.class);
System.out.println("Calling C++ DLL method");
System.out.println("========================");
System.out.println("getCPUSpeed() -- "+jInterface.getCPUSpeed());
} catch (Exception e) {
e.printStackTrace();
}
}
}
package cpp.java;
import com.sun.jna.Library;
public interface JnaInterface extends Library{
public int getCPUSpeed();
}
Update 1: **************************************
Below mentioned is the actual functions i get when i browse the DBMM.dll through dependency walker-
DBMM DLL functions-
??0cDbmmInterfaceCache@@QAE@ABV0@@Z
??0cDbmmInterfaceCache@@QAE@XZ
??0cDbmmInterfaceControl@@QAE@ABV0@@Z
??0cDbmmInterfaceControl@@QAE@XZ
??0cDbmmInterfaceEcon@@QAE@ABV0@@Z
??0cDbmmInterfaceEcon@@QAE@XZ
??0cDbmmInterfaceKnob@@QAE@XZ
??0cDbmmInterfaceOutput@@QAE@ABV0@@Z
??0cDbmmInterfaceOutput@@QAE@H@Z
??0cDbmmInterfacePoolLoan@@QAE@ABV0@@Z
??0cDbmmInterfacePoolLoan@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z
??0cDbmmMacroEcon@@QAE@ABV0@@Z
??0cDbmmMacroEcon@@QAE@ABVcDbmmInterfaceEcon@@_N@Z
??0cDbmmMtgBasisConstSpreadModel@@IAE@XZ
??0cDbmmMtgBasisConstSpreadModel@@QAE@ABV0@@Z
??0cDbmmMtgBasisConstSpreadModel@@QAE@PBD@Z
??0cDbmmMtgBasisModel@@QAE@ABV0@@Z
??0cDbmmMtgBasisModel@@QAE@XZ
??0cScaleFieldsSubSum@@QAE@NN@Z
??1cDbmmInterfaceCache@@QAE@XZ
??1cDbmmInterfaceControl@@QAE@XZ
??1cDbmmInterfaceEcon@@QAE@XZ
??1cDbmmInterfaceKnob@@QAE@XZ
??1cDbmmInterfaceOutput@@QAE@XZ
??1cDbmmInterfacePoolLoan@@QAE@XZ
??1cDbmmMacroEcon@@QAE@XZ
??1cDbmmMtgBasisConstSpreadModel@@UAE@XZ
??1cDbmmMtgBasisModel@@UAE@XZ
??1cScaleFieldsSubSum@@QAE@XZ
??4cDbmmInterface@@QAEAAV0@ABV0@@Z
??4cDbmmInterfaceCache@@QAEAAV0@ABV0@@Z
??4cDbmmInterfaceControl@@QAEAAV0@ABV0@@Z
??4cDbmmInterfaceEcon@@QAEAAV0@ABV0@@Z
??4cDbmmInterfaceKnob@@QAEAAV0@ABV0@@Z
??4cDbmmInterfaceOutput@@QAEAAV0@ABV0@@Z
??4cDbmmInterfacePoolLoan@@QAEAAV0@ABV0@@Z
??4cDbmmMacroEcon@@QAEAAV0@ABV0@@Z
??4cDbmmMtgBasisConstSpreadModel@@QAEAAV0@ABV0@@Z
??4cDbmmMtgBasisModel@@QAEAAV0@ABV0@@Z
??4cScaleFieldsSubSum@@QAEAAV0@ABV0@@Z
??_7cDbmmMtgBasisConstSpreadModel@@6B@
??_7cDbmmMtgBasisModel@@6B@
??_FcDbmmInterfaceOutput@@QAEXXZ
??_FcDbmmInterfacePoolLoan@@QAEXXZ
??_FcScaleFieldsSubSum@@QAEXXZ
?Add@cScaleFieldsSubSum@@QAEXNN@Z
?InitSubsum@cScaleFieldsSubSum@@QAEXNN@Z
?ReInit@cDbmmMacroEcon@@QAEX_N@Z
Not sure how can i call these functions through Java.
Appreciate if somebody could provide me a solution from Java end, with a sample code please :)