回调函数的字节参数在项目巴拿马函数接口中的值超出范围

问题描述 投票:0回答:1

我正在使用新的外部函数和内存 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 函数的正确方法是什么?

java callback java-native-interface ffi project-panama
1个回答
0
投票

JDK19 中存在一个错误,导致向上调用中没有值标准化。

此问题现已修复。

© www.soinside.com 2019 - 2024. All rights reserved.