JNI中的日期问题

时间:2014-05-22 07:28:32

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

我需要使用JNI从我的C ++项目中将Java Date参数传递给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日以来经过的毫秒数。 在Java中实例化Date对象并获取时间的相同代码为我提供了正确的值1400741921774

为什么会这样?我在使用JDK时遇到问题,因为在我的C ++ / JNI项目中我使用JDK 1.8而Java / util / Date有点不推荐使用。

1 个答案:

答案 0 :(得分:1)

以下代码的输出:

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);
无论如何,

应该引发编译器警告。