Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_Java_C_Pointers_Jna - Fatal编程技术网

Java 获取字节数组的JNA

Java 获取字节数组的JNA,java,c,pointers,jna,Java,C,Pointers,Jna,我有一个用C开发的库,它成功地解压缩了LZMA编码的文件。文件的签名是指向数据的指针、压缩的、解压缩的以及错误代码的“out”字段。返回值是指向数组的指针(如果失败,则为null) C中的函数与此类似: char* decompressLZMA(const char *lzmaData, int compressedSize, int uncompressedSize, t_status_codes *statusCode); 我尝试过使用其他示例中的指针和内存,但它们不起作用 如何正确地传入

我有一个用C开发的库,它成功地解压缩了LZMA编码的文件。文件的签名是指向数据的指针、压缩的、解压缩的以及错误代码的“out”字段。返回值是指向数组的指针(如果失败,则为null)

C中的函数与此类似:

char* decompressLZMA(const char *lzmaData, int compressedSize, int uncompressedSize, t_status_codes *statusCode);
我尝试过使用其他示例中的指针和内存,但它们不起作用

如何正确地传入字节数组和指针以获取数据

这是我的界面:

public interface LZMALibrary extends Library {
    Memory lzma_uncompress(Memory lzma_data, int compressed_size, int uncompressed_size, Pointer status_code);
}

似乎我想做一个“Memory”类的指针。现在对我有效的解决方案是创建指针对象,然后库将填充指针,我将它们取回并适当地处理它

我的界面变成:

public interface LZMALibrary extends Library {
    Pointer lzma_uncompress(Pointer lzma_data, int compressed_size, int uncompressed_size, Pointer status_code);
}
从那里,我可以在数据中写入:

Pointer ptr = new Memory(lzmaData.length);
ptr.write(0, lzmaData, 0, lzmaData.length);
我还需要将要写入的指针:

Pointer errorStatus = new Memory(4);
然后我可以调用该函数以获取指针,如果该指针不为null,则读取该指针:

Pointer p = lzmaLib.lzma_uncompress(ptr, lzmaData.length, DECOMPRESSED_LENGTH, errorStatus); // DECOMPRESSED_LENGTH is a constant.

if (p != null) {
    byte[] decompressedData = p.getByteArray(0, DECOMPRESSED_LENGTH);
    System.out.println(new String(decompressedData, "ASCII")); // My data is ASCII text.
}

if (errorStatus != null) {
    int errorStatusCode = errorStatus.getInt(0);
    System.out.println("Error code: " + errorStatusCode);
}
这似乎解决了我的问题。我对JNA很陌生,所以希望我没有错过任何东西


如果我可能遇到任何错误,请随时发布如何更正。

IntByReference
是为本机调用通过引用传递的参数“返回”某个内容而提供的。该类将负责为您分配内存,您通过调用
getValue()
返回值。您可能需要在某个时候释放返回的内存。@technomage,您的意思是当指针被垃圾回收时,它指向的内存不会被释放吗?在指针上调用finalize()时,我以为它被释放了,但我可能完全错了。在查看指针的源代码后,没有finalize方法(截至发布日期),我将更新我的帖子。
Pointer
怎么会知道如何从任意源中释放它提供的内存?我们希望您知道如何处理内存,并且知道需要调用哪个本机方法来释放内存。