【问题标题】:Java JNA can't write float to memoryJava JNA 无法将浮点数写入内存
【发布时间】:2015-12-22 23:39:30
【问题描述】:

我正在尝试将浮点数写入内存,但它不起作用。

Kernel32.java

public abstract boolean WriteProcessMemory(Pointer paramPointer1, long paramLong, Pointer paramPointer2, int paramInt, IntByReference paramIntByReference);

MemoryWriting.java

public void writeMemory(int address, float[] data) {
    int size = data.length;

    Memory toWrite = new Memory(size);

    for (int i = 0; i < size; i++) {
        toWrite.setFloat(i, data[i]);
    }

    kernel32.WriteProcessMemory(process, address, toWrite, size, null);
}

编辑:

还是一样的问题

public void writeMemory(int address, float[] data) {
    int size = data.length;

    Memory toWrite = new Memory(size);

    for (int i = 0; i < size; i++) {
        toWrite.setFloat(i * Float.SIZE / 8, data[i]);
    }

    kernel32.WriteProcessMemory(process, address, toWrite, size, null);
}

【问题讨论】:

  • WriteProcessMemorysize 参数是要写入的字节数,而不是浮点元素的数量。
  • 解释一下?它可以很好地写入字节。
  • 一个浮点数需要一个大小为 4 字节的缓冲区。如果您指示缓冲区大小为“1”,则只会读取浮点数的第一个字节。 size 参数需要是要写入的浮点元素数量的四倍。
  • so size = data.length * 4?
  • 没用,同样的错误

标签: java memory jna writing


【解决方案1】:

如果您自己制作直接采用float[] 的方法签名会更容易。

public interface MyKernel32 extends Kernel32 {
    MyKernel32 INSTANCE = Native.loadLibrary("kernel32", W32APIOptions.DEFAULT_OPTIONS);
    void WriteProcessMemory(HANDLE hProcess, Pointer address, float[] data, int size, Pointer blah);
}

编辑

您正在以 1 字节为增量写入浮点值。浮点数通常至少为 4 个字节(Java 中为 Float.SIZE / 8 字节),因此您需要调整偏移量。我真的推荐使用函数映射,但是如果你坚持将数组复制到内存然后将内存缓冲区复制到进程内存的额外开销,你需要这样做:

Memory m = ...;
float[] data = ...;
for(int i=0;i < data.length;i ++) {
    m.setFloat(i * Float.SIZE/8, data[i]);
}

【讨论】:

  • 这样吗? public void writeMemory(int address, float[] data) { int size = data.length;写入内存 = 新内存(大小); for (int i = 0; i
  • 即使在您发布的编辑之后,我仍然遇到与以前相同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多