我有一个用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);
}
答案 0 :(得分:1)
看来我想制作一个'Memory'类的指针。现在正在为我工作的解决方案是创建Pointer对象,然后库将填充指针,然后我将它们取回并适当地处理它。
我的界面转向:
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);
然后我可以调用该函数来获取指针,并在该指针不为空时读取该指针:
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很新,所以希望我没有遗漏任何东西。
如果我可能遇到任何可能的错误,请随时发布如何纠正错误。