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 了解如何更正它。
我有一个用 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 了解如何更正它。