gpt4 book ai didi

java - 在内存中创建一个函数并调用它

转载 作者:行者123 更新时间:2023-11-30 03:46:14 27 4
gpt4 key购买 nike

我有一个简单的“函数”,如果你可以这样调用它的话,它只是存储在内存中的“NOP”:

byte[] func = new byte[] {0x90}; // NOP

然后我分配一 block 内存来保存它,并设置内容:

Memory mem = new Memory(func.length);
mem.write(0, code, 0, code.length); // Write all bytes from code, starting at mem + 0

现在,我想“调用”我刚刚创建的这个小函数。让我们尝试一下:

Function function = Function.getFunction(mem, Function.C_CONVENTION);
function.invokeVoid(null); // I have tried other types of invokeXX too.

但这不起作用,而是抛出异常:

线程“main”java.lang.Error中出现异常:无效的内存访问
在 com.sun.jna.Native.invokeVoid( native 方法)
在 com.sun.jna.Function.invoke(Function.java:367)
在 com.sun.jna.Function.invoke(Function.java:315)
在 com.sun.jna.Function.invoke(Function.java:268)
在 com.sun.jna.Function.invokeVoid(Function.java:727)
在[我的线路调用invokeVoid]

我没想到会收到该错误,因为它确实应该存在。我不知道可能会出什么问题。

我在这里遗漏了什么或者(显然,但是什么?)做错了什么?

注意:我正在使用 JNA 4.1.0。

最佳答案

我认为使用 Memory 对象不是一个好主意。如果您查看 Finalize 方法,您会注意到它调用 native free() 函数,并且提供不受 jvm 管理的地址可能会导致段错误。显然这里问题出现得更早。尝试向 Function.getFunction 提供 Pointer 对象,而不是 Memory。您可以简单地尝试一下:

Pointer ptr = Pointer.createConstant(0x90);
Function f = Function.getFunction(ptr, Function.C_CONVENTION);

关于java - 在内存中创建一个函数并调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25628885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com