JNA 取回一个字节数组

JNA getting back a byte array

我有一个用 C 语言开发的库,可以成功解压 LZMA 编码文件。该文件的签名是指向数据、压缩、解压缩和错误代码的 'out' 字段的指针。 return 值是指向数组的指针(如果失败则为 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' class 的指针。现在对我有用的解决方案是创建 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 的新手,所以希望我没有遗漏任何东西。

如果我可能 运行 有任何可能的错误,请随时 post 了解如何更正它。