在 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 回调而不是直接调用 Function 对象,但上面的代码提供了您所要求的基本功能for(你应该改写你原来的问题;你不想执行汇编代码,你想在给定的地址调用一个函数)。
使用 JNA 回调映射将允许您更自然地调用函数。
// 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 约定从右到左将参数推送到堆栈上,目前我的想法还不够清晰,无法正确映射...