我正在使用新的外部函数和内存 API,它是巴拿马项目的一部分,可在 JAVA 19 中预览。
这是一个简单的Java回调函数
public static byte addFive(byte t) {
Byte test = (Byte) t;
return (byte) (Long.valueOf(test) + 5);
}
我有一个使用参数
addFive
和 (byte) -41
调用的本机库函数。
uint8_t callback_test(uint8_t (*fn)(uint8_t), uint8_t arg) {
uint8_t res = fn(arg + 1) * 2;
return res;
}
我希望
t
具有值 -40
,这确实显示在 Intellij 调试器中。但是当你打印它时,它会打印 216
。此外,投射到 Byte
会得到 ArrayIndexOutOfBoundsException
。
我确实意识到本机函数是一个无符号整数,因此
216
的返回值是有意义的。但是, java byte
不应该被允许使用该值,因此,我希望 java 能够自动将其转换为 -41
。
这种行为是预期的吗?
从本机代码获取 unsigned int 作为 [-128, 127] 范围内的字节传递给 java 函数的正确方法是什么?
JDK19 中存在一个错误,导致向上调用中没有值标准化。
此问题现已修复。