In JNA können Sie Function.getFunction(Pointer)
verwenden, um ein Objekt abzurufen, das Sie zum Steuern von Aufrufen für eine bestimmte Adresse verwenden können.
Function dwCall = Function.getFunction(new Pointer(0x12345678));
String CMD = "SomeCommand";
Integer ARG = new Integer(0);
dwCall.invoke(void.class, new Object[CMD, ARG]);
Angenommen, die Funktion verwendet die C-Aufrufkonvention, würde der obige Code funktionieren. Schließlich möchten Sie wahrscheinlich die Funktionsadresse dynamisch nachschlagen, anstatt sie hart zu codieren, und Sie würden wahrscheinlich einen JNA-Callback verwenden wollen, anstatt das Function-Objekt direkt aufzurufen, aber der obige Code bietet die nackten Funktionen, die Sie fordern for (Sie sollten Ihre ursprüngliche Frage neu formulieren; Sie möchten Assemblercode nicht ausführen, sondern eine Funktion an einer bestimmten Adresse aufrufen).
Mit einem JNA Callback Mapping können Sie die Funktion natürlicher aufrufen.
// 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);
Beachten Sie, dass diese beiden Beispiele gehen davon aus, dass Sie bereits JNA verwendet haben, die DLL in Frage über Native.loadLibrary()
, in der Regel zu laden.
Beachten Sie auch, dass die Signatur tatsächlich void dwCall(int arg, String cmd)
sein könnte; Cdecl und Stdcall Konventionen drücken Parameter auf dem Stapel von rechts nach links, und mein Denken ist im Moment nicht klar genug, um das durch richtig zu ordnet.
_asm ist Inline-Assembly-Code. Es drückt einen Zeiger auf das C-Äquivalent eines Strings auf dem Stapel, beendet es mit 0 und ruft dann die Prozedur an der dwCall-Adresse auf (denke ich). –
und dies sieht wie das Äquivalent von 'System.out.println' aus. – Thilo
@HovercraftFullOfEels Danke, können wir ähnlichen Code in Java schreiben? –