2016-10-14 3 views
0

두 필드가있는 Java 클래스가 있습니다. 하나는 private final double이고 다른 하나는 private Map입니다. Map에 public getter 메서드를 추가했습니다. JNI를 사용하여 C 코드에서 액세스하고 있습니다. 나는 필드를 통해지도를 받고 문제가 있지만 방법을 통해 그것을 받고 아무 문제가 없다 오전 :JNI를 사용하여 필드에 액세스

// The following lines of code work just fine 
    jclass jCls = (*env)->GetObjectClass(env,object); 
    jfieldID dblFldId = (*env)->GetFieldID(env,jCls,"nameOfDoubleVariable","D"); 
    jdouble dblVar = (*env)->GetDoubleField(env, object, dblFldId); 

    // These lines don't work though 
    jfieldID mapId = (*env)->GetFieldID(env,jCls,"nameOfMapVariable","()Ljava/util/Map;"); 
    jobject mapVar = (*env)->GetObjectField(env,object,mapId); 

을하지만 난 기본적으로 내가 통해지도를 얻고있다 (다음 작동하지 않는 두 줄을 교체하는 경우 분야를 통해 대신 직접의 방법) 그렇습니다 일 :

jmethodID m_GetMap = (*env)->GetMethodID(env,jCls,"getMap","()Ljava/util/Map;"); 
    jobject mapVar = (*env)->CallObjectMethod(env,object,m_GetMap); 

사람이 말해 줄 수 왜 메서드 호출 작동하지만 현장에서을받지 - 내가 뭔가 잘못하고있는 중이 야 확신합니다!

답변

2

오류는 함수 서명이있는 필드를 가져 오는 것입니다. 이 함께보십시오 :

jfieldID mapId = (*env)->GetFieldID(env,jCls,"nameOfMapVariable","Ljava/util/Map;"); 
+0

감사 이스트 반 Pecznyik을 - 때때로 그것은 단지 눈의 두 번째 쌍 : – user1759789

+2

user1759789 도덕적 @가 있음을 취 JNI 자신 시그니처 만들려고하지 않습니다. 'javap -s'의 출력을 사용하십시오. 절대로 틀리지 않습니다. – EJP

+0

EJP 그걸 만들지 않아 - 나는 그다지 창의적이지 않다. :). 뒷면에 비트를 복사하여 붙여 넣기하십시오! 질문에 대답 해 주신 Istvan Pecznyik에게 다시 한번 감사드립니다! – user1759789

관련 문제