将Boost::uint64转换为Java的最有效方法
Most efficient way to convert Boost::uint64 to Java
作为一个简短的例子,我有C++JNI代码,它将获取某个文件的文件大小,我想将其传递回Java。
A) 这是明智的做法吗?
B) 有没有比将数据转储到字符串中更好的方法呢?
C++代码段:
JNIEXPORT jstring JNICALL Java_test_TestClass_getNumBytes(...) {
boost::uintmax_t numBytes = 0;
try {
numBytes = boost::filesystem::file_size(MY_GLOBAL_FILE_NAME);
} catch(const boost::filesystem::filesystem_error& e) {
return env->NewStringUTF("0");
}
return env->NewStringUTF(boost::lexical_cast<std::string>(numBytes));
}
Java代码段:
private native String getNumBytes();
public void doStuff() {
final String s = getNumBytes();
final BigInteger bi = new BigInteger(s);
final StringBuilder sb = new StringBuilder("Comparing: ");
sb.append(s).append(" to ").append(bi);
System.out.println("Values should look the same: " + sb.toString());
}
假设Java无法访问MY_GLOBAL_FILE_NAME。
只需将boost::uintmax_t
强制转换为jlong
。很可能,可能的精度损失仍然是一个理论问题。Java中的任何I/O API都使用签名的long
。
如果您想为符号成为问题的大小做好准备,您仍然可以将值作为jlong
传递给Java代码,并在Java端进行修复,因为溢出不会破坏信息,而且符号提供了一个易于检查的溢出指示符。
代码可能看起来像这样:
// 2⁶⁴
private static BigInteger twoP64=BigInteger.ZERO.flipBit(64);
public static BigInteger getNumBytes()
{
long longValue=getNumByteNative();
BigInteger i=BigInteger.valueOf(longValue);
if(longValue<0) i=i.add(twoP64);
return i;
}
private native long getNumByteNative();
这比在本地端构建BigInteger
要容易得多。它提供了在Java方面有条件地进行操作,只要合适就使用long
,只有在必要时才使用BigInteger
(我想永远不会)。
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 如何在 c++ 和 java 之间通过 udp 有效地发送数据数组
- 将Boost::uint64转换为Java的最有效方法
- Java inline int swap.为什么这只在 Java 中有效
- 迭代 Java 集合和对元素进行一些转换的有效方法
- 将无符号字符* 作为 byte[] 从 C++ 传递到 java 的最有效方法
- 在Java或C++等编程语言中有效地模拟SQL的group by子句,而不是求助于RDBMS
- 修改双精度的最低有效位(Java和c++)
- 有效的Java构建器习语等同于c++
- 这样做有效吗?(c, c++, java)
- c++ /JAVA:有效地在集合中找到包含给定值的集合
- Java 套接字数据仅在发送时间延迟时有效