java - JNI 中的日期问题

标签 java c++ date java-native-interface

我需要使用 JNI 将 Java Date 参数从我的 C++ 项目传递给 Java 方法。

jclass date = env->FindClass("java/util/Date");
if (env->ExceptionCheck()){
  cout << "Fail:";
}
jmethodID dateTypeConstructor= env->GetMethodID(date, "<init>", "()V");
if(dateTypeConstructor == nullptr){
  cout << "Fail:";
}
jobject dateObjectStart = env->NewObject(date, dateTypeConstructor);
if(dateObjectStart  == nullptr){
  cout << "Fail:";
}
long a = env->CallLongMethod(dateObjectStart,gettIME);

通过调试,我获取了 a 的值,即 582106004 。该值是自 1970 年 1 月 1 日以来经过的毫秒数。 同样的代码,实例化 Date 对象并获取时间,在 Java 中为我提供了正确的值 1400741921774

为什么会这样?我怀疑 JDK 有问题,因为在我的 C++/JNI 项目中我使用的是 JDK 1.8,而 Java/util/Date 有点过时了。

最佳答案

以下代码的输出:

jclass date = env->FindClass("java/util/Date");
if (env->ExceptionCheck()){
  std::cout << "Fail:";
}
jmethodID dateTypeConstructor= env->GetMethodID(date, "<init>", "()V");
if(dateTypeConstructor == nullptr){
  std::cout << "Fail:";
}
jobject dateObjectStart = env->NewObject(date, dateTypeConstructor);
if(dateObjectStart  == nullptr){
  std::cout << "Fail:";
}
jmethodID getTime = env->GetMethodID(date, "getTime", "()J");
if(getTime == nullptr){
  std::cout << "Fail:";
}
jlong a = env->CallLongMethod(dateObjectStart, getTime);
std::cout << a << std::endl;

在我的机器上(JNI,1.6 JDK):

1400754723399

这对我来说似乎是正确的 - 还要确保使用 jlong​​ (它总是 64 位) - 而不仅仅是 long (它可能是 32 位 - 取决于你的建筑)——这些实际上可以在那里有所作为。如果打开编译器警告,行

long a = env->CallLongMethod(dateObjectStart, getTime);

无论如何都应该引发编译器警告。

关于java - JNI 中的日期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800372/

相关文章:

java - 使用特定模式重新格式化字符串

c++ - 我在执行这个程序时得到 "segmentation fault"

c++ - 如何在 WTL 的 treeview 控件中包装项目文本

javascript - 在 javascript 中获取最近 36 小时的时间戳并将其与 php 时间戳进行比较

MySQL:在日期 dd.mm.yyyy hh.mm.ss 之间选择

python - 在 matplotlib 中绘制一天中的时间与日期

java - 从表数据在 Java 中创建一个二维 boolean 数组

java - 编译器错误 : Array required, 但发现 java.lang.String

java - 防止Gson转义Unicode符号

c++ - 使用包含 %1、%2 等而不是 %d、%s 等的格式字符串 - Linux、C++