Я пишу код 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 мы получим отрицательное значение.
Могу ли я узнать, есть ли лучший подход, который может обрабатывать все случаи гладко и правильно?
Как было предложено в комментарии Луи, один из способов справиться с этим в Java 8 состоит в том, чтобы просто uint64_t
в jlong
на стороне C++, а затем использовать набор неподписанных операций, предоставляемых Java 8, таких как Long.compareUnsigned(), чтобы сделать необходимая операция:
public static int compareUnsigned(long x, long y)
Compares two long values numerically treating the values as unsigned.
Неподготовленные библиотеки Google Guava также могут достичь этого, если Java 8 не используется.