0

我正在编写 JNI 代码并遇到需要将 uint64_t 转换为 jlong​​ 的情况,这是我目前将 uint64_t 转换为 jlong​​ 的方法:

jlong uint64_t_to_jlong (uint64_t value) {
  if (value > std::numeric_limits<jlong>::max()) {
    return std::numeric_limits<jlong>::max(); 
  }
  return static_cast<jlong>(value);
}

这显然不是一个完美的方法,因为它在value > std::numeric_limits<jlong>::max(). 但是,直接返回static_cast<jlong>(value)对我来说也不是一个好方法,因为在 Java 方面我们将收到负值。

我可以知道是否有更好的方法可以顺利正确地处理所有情况?

4

1 回答 1

0

正如 Louis 在评论中所建议的,在 Java 8 中处理它的一种方法是在 C++ 端简单地uint64_t转换为jlong,然后使用 Java 8 提供的一组无符号操作,例如Long.compareUnsigned()来执行必要的操作:

public static int compareUnsigned(long x, long y)
Compares two long values numerically treating the values as unsigned.

如果不使用 Java 8,Google Guava 的未签名库也可以实现这一点。

于 2014-11-17T20:00:27.023 回答