如何在Java中声明uint8_t数组

时间:2019-01-30 13:57:46

标签: java c++ type-conversion jna

我的DLL中有一个C ++函数,需要一个uint8_t数组作为输入参数,所以该数组看起来像这样:

uint8_t input[input_length] = { 0x30, 0x41, 0x80, 0x8A...}; 

我想在Java和JNA中使用此函数,这意味着我必须在Java中创建uint8_t数组。我的第一种方法是创建一个字节数组,如:

byte[] input = { 0x30, 0x41, 0x80, 0x8A...}; 

但是后来我意识到C ++中的uint8_t变量的范围是0..255,而Java中的字节变量的范围是-128..127,如您所见,此数组包含超过127(例如0x8A),这意味着我的Java声明无效。所以我的问题是Java中什么类型等效于uint8_t?

2 个答案:

答案 0 :(得分:9)

Java没有无符号类型。但这不是什么大问题,因为Java中的带符号溢出被定义为二进制补码,因此您可以将byte传递到JNA期望uint8_t的地方。使用起来有点不方便:

byte[] input = { 0x30, 0x41, (byte)0x80, (byte)0x8A...};

要读回uint8_t,您需要进行(x & 0xFF)来去除符号扩展名,并将结果作为int使用。

答案 1 :(得分:1)

存储在一个字节中的值是一个确定的值,无论您如何解释它(有符号或无符号)都至关重要。

您可以使用以下代码轻松验证这一点:

byte test = (byte)255;
System.out.println(test & 0xFF);

输出255

这意味着一旦使用所需的值创建了byte[](并将每个值强制转换为字节,就可以设置无符号值)。那就好了,在JNI端,您将使用:

jbyte* data = GetByteArrayElements(...)

,如果需要(uint8_t*)data,可以直接将其转换为无符号字节数组。