我有一个用C开发的库,它成功地解压了LZMA编码的文件。文件的签名是指向数据、压缩、解压缩和错误代码的“out”字段的指针。返回值是指向数组的指针(如果失败则为空)。
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);
}

最佳答案

似乎我想做一个'内存'类的指针。现在我的解决方案是创建指针对象,然后库将填充指针,然后我将它们取回并适当地处理它。
我的界面转到:

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很陌生,所以希望我没有遗漏任何东西。
如果有任何可能的错误,我可能会遇到,请随时张贴如何纠正它。

09-11 19:30
查看更多