Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA可以';t将浮点写入内存_Java_Memory_Jna_Writing - Fatal编程技术网

Java JNA可以';t将浮点写入内存

Java JNA可以';t将浮点写入内存,java,memory,jna,writing,Java,Memory,Jna,Writing,我正试图给内存写一个浮点数,但它不起作用 Kernel32.java public abstract boolean WriteProcessMemory(Pointer paramPointer1, long paramLong, Pointer paramPointer2, int paramInt, IntByReference paramIntByReference); public void writeMemory(int address, float[] data) { i

我正试图给内存写一个浮点数,但它不起作用

Kernel32.java

public abstract boolean WriteProcessMemory(Pointer paramPointer1, long paramLong, Pointer paramPointer2, int paramInt, IntByReference paramIntByReference);
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);
}
MemoryWriting.java

public abstract boolean WriteProcessMemory(Pointer paramPointer1, long paramLong, Pointer paramPointer2, int paramInt, IntByReference paramIntByReference);
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地址,float[]数据){
int size=data.length;
Memory toWrite=新内存(大小);
对于(int i=0;i
编辑:

还是一样的问题

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);
}
public void writeMemory(int地址,float[]数据){
int size=data.length;
Memory toWrite=新内存(大小);
对于(int i=0;i
如果您制作自己的方法签名,直接使用
浮点[]
,则更容易

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
bytes),因此需要调整偏移量。我确实建议使用函数映射,但是如果您坚持要将数组复制到内存,然后将内存缓冲区复制到处理内存,那么您需要执行以下操作:

Memory m = ...;
float[] data = ...;
for(int i=0;i < data.length;i ++) {
    m.setFloat(i * Float.SIZE/8, data[i]);
}
内存m=。。。;
float[]数据=。。。;
for(int i=0;i
是这样吗?public void writeMemory(int address,float[]data){int size=data.length;Memory toWrite=new Memory(size);for(int i=0;iWriteProcessMemory
size
参数是要写入的字节数,而不是浮点元素数。解释?它可以很好地写入字节。一个浮点需要一个大小为4字节的缓冲区。如果指示缓冲区大小为“1”,则只读取浮点的第一个字节。
size
参数必须是要写入的浮点元素数的四倍。因此size=data.length*4?不起作用,同样的错误