2014-07-15 4 views
2

저는 회사에서 JNI를 사용하고 있으며 일부 Java 유형을 해당 C++ 유형으로 변환해야합니다. Java String을 C++ 배열에 성공적으로 캐스팅했지만 이제는 다른 Java.lang 유형과 관련하여 고민하고 있습니다. Java.lang.Integer와 Java.lang.Boolean을 해당 C++ 유형으로 변환해야합니다. String 변환에서 Integer 변환까지 동일한 원칙을 적용했지만 몇 가지 잘못된 숫자 만 얻고 있습니다. FYI : 분리 된 클래스에서 변수를 호출해야합니다. 그래서 정수 foo.bar.IntField에 사용되며, 부울이 foo.bar.BooleanField 에 여기에 지금까지 무엇을 가지고 :JNI 유형을 C++ 유형으로 변환하기

jclass fieldClass = env->FindClass("foo/bar/IntField"); 
jmethodID getValue = env->GetMethodID(fieldClass, "getValue", "()Ljava/lang/Integer;"); 
jint value = (jint)env->CallObjectMethod(fieldObject, getValue); 
int val = (int)value; 

내가 가진 문제를 내가 올바른 번호를 얻을 수 없다는 것입니다 그 방법에서. 나는 0을 얻어야하지만이 메소드는 267713816을 반환합니다. 동일한 것은 bool 값입니다. 나는 false를 얻어야하지만,이 메소드는 true를 리턴한다. CallInt 또는 CallBooleanMethods가 사용되는 경우에도 동일한 잘못된 값이 반환됩니다. 문자열의 경우 StringUTFChars를 가져 오는 방법이 있습니다. 나는 이것이 포맷 오류라고 생각한다. 나는 나의 설명이 잘되고 당신이 나를 도울 수 있기를 바랍니다.

편집 : Tom Blodget이 제안한대로 답으로 답을 게시했습니다.

+0

반환 값을 확인하지 마십시오. 이로 인해 코드가 본질적으로 불손해질 수 있습니다. –

+0

가독성을 높이기 위해 코드에서 수표를 제거했습니다. 그러나 문제를 찾을 수있었습니다. 자세한 내용은 편집을 참조하십시오. –

+0

'GetStringUTFChars'는 유니 코드/UTF-16으로 인코딩 된 Java 문자열을 0x00로 끝나는 유니 코드/* 수정 * UTF-8로 인코딩 된 문자열로 변환합니다. 그것이 C++ 측에서 사용하는 것이 아니라면'GetStringChars' (0x00- 종료가 아닌)를 사용하거나 String.getBytes (Charset charset) 또는 이와 비슷한 메소드를 호출하십시오. –

답변

2

문제점을 발견 : IntField에서 정수를 가져와야하며이 오브젝트에서 Integer 클래스의 intValue 메소드를 호출해야합니다.

jclass integerClass = env->FindClass("java/lang/Integer"); 
jmethodID integerID = env->GetMethodID(integerClass, "intValue", "()I"); 
jint jintVal = (jint)env->CallIntMethod(value, integerID); 
int val = (int)jintVal; 

부울 값에 대해서도 마찬가지입니다.

jclass BooleanClass = env->FindClass("java/lang/Boolean"); 
jmethodID booleanID = env->GetMethodID(BooleanClass, "booleanValue", "()Z"); 
jboolean jBoolVal = (jboolean)env->CallBooleanMethod(jBoolean, booleanID); 
bool boolVal = (bool)jBoolVal; 
+0

https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html에 따라 'Zjava/lang/Boolean'이 아니어야합니까? –

관련 문제