メソッド名マングリングを解決する方法について StackOverflow のリンクを調べてきましたが、リアルタイムの例で解決策が見つかりませんでした。
シナリオ - C++ Ex.dll ファイルがクライアントから提供されます。Ex.dll にアクセスし、Java を介して同じメソッドを呼び出す必要があります。
制限 - Ex.dll を変更することはできません。同じものにしかアクセスできません。
直面している問題 - JNA を介して Ex.dll にアクセスすると、以下の例外が発生する
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)
多くのことをグーグルで検索し、メソッド名 Mangling が原因であることがわかりましたが、解決策を備えた適切なサンプル コードを見つけることができませんでした。
これは私が使用したコードです-
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();
}
アップデート 1: * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *
以下は、依存関係ウォーカーを介して DBMM.dll を参照するときに取得する実際の関数です。
DBMM DLL 関数 -
??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
Java を介してこれらの関数を呼び出す方法がわかりません。
誰かが私にサンプルコードを添えて、Java側からの解決策を提供していただければ幸いです:)