Java JNA无法将float写入内存

时间:2015-12-22 23:39:31

标签: java memory jna writing

我正在尝试将浮点数写入内存,但它无效。

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);
}

1 个答案:

答案 0 :(得分:0)

如果您制作自己的方法签名直接使用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]);
}