我的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?
答案 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
,可以直接将其转换为无符号字节数组。