JNA ではFunction.getFunction(Pointer)
、特定のアドレスでの呼び出しを制御するために使用できるオブジェクトを取得するために使用できます。
Function dwCall = Function.getFunction(new Pointer(0x12345678));
String CMD = "SomeCommand";
Integer ARG = new Integer(0);
dwCall.invoke(void.class, new Object[CMD, ARG]);
関数が C 呼び出し規則を使用すると仮定すると、上記のコードは機能します。最終的には、関数アドレスをハードコーディングするのではなく、動的に検索したいと思うでしょう。また、関数オブジェクトを直接呼び出す代わりに JNA コールバックを使用したいと思うでしょうが、上記のコードは、求めている機能を提供します。 for (元の質問を言い換える必要があります。アセンブリ コードを実行したくない場合は、特定のアドレスで関数を呼び出したいと考えています)。
JNA Callback マッピングを使用すると、関数をより自然に呼び出すことができます。
// Use StdCallCallback if the function called uses stdcall rather than cdecl
public class MyCallback extends Callback {
void invoke(String cmd, int arg);
}
Pointer addr = new Pointer(0x1235678);
MyCallback cb = (MyCallback)CallbackReference.getCallback(MyCallback.class, addr);
cb.invoke("SomeCommand", 0);
これらの例は両方とも、JNA を使用して問題の DLL を通常はNative.loadLibrary()
.
void dwCall(int arg, String cmd)
署名が実際には;である可能性があることにも注意してください。cdecl および stdcall 規則は、スタック上のパラメーターを右から左にプッシュします。現時点では、それを適切にマップするのに十分なほど明確ではありません...