Java 获取字节数组的JNA
我有一个用C开发的库,它成功地解压缩了LZMA编码的文件。文件的签名是指向数据的指针、压缩的、解压缩的以及错误代码的“out”字段。返回值是指向数组的指针(如果失败,则为null) C中的函数与此类似: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); 我尝试过使用其他示例中的指针和内存,但它们不起作用 如何正确地传入
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
怎么会知道如何从任意源中释放它提供的内存?我们希望您知道如何处理内存,并且知道需要调用哪个本机方法来释放内存。