1

メソッド名マングリングを解決する方法について 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側からの解決策を提供していただければ幸いです:)

4

2 に答える 2

0

関数は JNI および stdcall 規則で装飾されています。C++ マングルではありません。

Java_sysInfo_接頭辞を指定すると、ライブラリは JNI ライブラリのようです。その場合は、同等の Java 側を宣言するだけで済みます。

// default package
public class sysInfo {
    static { System.loadLibrary("Ex"); }
    public static native int getCPUSpeed();
}

おそらく、このマッピングが正しいものであり、JNA は必要ないことがわかると思います。

編集

任意の ctor 入力引数と method を持つ C++ クラスが与えられた場合getCount():

extern "C" int getCountForName(const char* name) {
    MyCPPClass mycpp(name);
    return mycpp.getCount();
}

それを共有ライブラリにコンパイルし、 JNA 経由でロードします。

于 2013-04-12T12:12:57.283 に答える
0

If your building the DLL through Visual studio, you should be able to build it as a release instead of debug to fix the function names if you are not already doing this.

于 2013-09-10T18:05:49.893 に答える