2014-05-22 2 views
1

JNI를 사용하여 Java C++ 프로젝트에서 Java Date 인수를 Java 메소드에 전달해야합니다.JNI의 날짜 문제

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); 

디버깅을 통해 난 582106004이다 a의 값을 취. 이 값은 1970 년 1 월 1 일 이후로 경과 된 msec입니다. 자바에서 Date 객체를 인스턴스화하고 시간을 얻는 동일한 코드가 올바른 값인 1400741921774을 제공합니다.

왜 이런 일이 발생합니까? 내 C++/JNI 프로젝트에서 JDK 1.8을 사용하는 동안 Java/util/Date가 약간 사용되지 않으므로 JDK와 관련하여 문제가 해결되지 않았습니다.

+0

'long a'를'double a'로 바꾸는 것이 더 합리적인 값을주는 것처럼 보입니다. – igoutas

+0

'Java.util.Date' 자체는 단일 문자열을 사용하는 생성자가 아닙니다. 당신의 코드에서'gettIME'은 어떻게 정의되어 있습니까? – Constantin

+0

또한 'long'뿐만 아니라 'jlong'(항상 64 비트)을 사용해야합니다. 아키텍처 및 Java VM (32Bit/64Bit)에 따라 차이점이 있습니다. – Constantin

답변

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를 사용할 수 있도록하는 항상(32 비트 일 수 있음 - 아키텍처에 따라 다름)뿐 아니라 실제로는 다를 수 있습니다. 컴파일러 경고를 켜면 컴파일러 경고가 발생합니다.

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

컴파일러 경고가 발생합니다.

+0

맞습니다! 또 다른 방법은'double'으로 선언하는 것입니다! – igoutas

+0

예, double을 변수 유형으로 사용하면 암시 적으로 jlong ​​값을 double 값으로 변환합니다. – Constantin