把uint64_t转换成jlong​​的好方法

时间:2014-11-17 00:39:13

标签: java c++ java-native-interface uint64

我正在编写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方面,我们将收到负值。

我能否知道是否有更好的方法可以顺利和正确地处理所有案件?

1 个答案:

答案 0 :(得分: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.

Google Guava&#39; unsigned libraries也可以在不使用Java 8的情况下实现此目的。