JNA获取一个字节数组

时间:2015-04-27 20:54:03

标签: java c pointers jna

我有一个用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);
}

1 个答案:

答案 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很新,所以希望我没有遗漏任何东西。

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