JNI中的日期问题

Trouble with Date in JNI

本文关键字:问题 日期 JNI      更新时间:2023-10-16

我需要将Java Date参数传递给使用JNI的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日以来通过的msec。同样的代码,实例化一个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);

应该会引发编译器警告。