2012-05-15 5 views
0

다음 스 니펫에서 나는 NewGlobalRef을 테스트하고 if 블록의 로컬 범위에서 선언 한 후 clsStr을 전역으로 만들려고합니다.var는 전역이 아니지만 로컬로 남아 있습니다

jstring Java_Package_LocalAndGlobalReference_returnGlobalReference 
(JNIEnv *env, jobject obj) { 
if(1) { 
    printf("In function make global reference\n"); 
    jclass clsStr ; 
    jclass cls = (*env)->FindClass(env,"java/lang/String"); 
    if(cls == NULL) 
     return NULL; 
    // create a global reference of clsStr 
    clsStr = (*env)->NewGlobalRef(env,cls); 
    // Delete the local reference, which is no longer userful 
    (*env)->DeleteLocalRef(env,cls); 
    if(clsStr == NULL) 
     return NULL; 
} 
return clsStr; // statement 31 
} 

나는 다음과 같은 오류를 얻을 위의 코드를 실행하면 : 내가 오류가 난 VAR 세계가 satement clsStr = (*env)->NewGlobalRef(env,cls)를 사용하는 것이했으면 clsStr이 정의라고 말하는 이유는 무엇입니까

W:\elita\jnitesters\workspace\c\LGR\LGR.c:31: error: 'clsStr' undeclared (first use in this function) 
W:\elita\jnitesters\workspace\c\LGR\LGR.c:31: error: (Each undeclared identifier is reported only once 
W:\elita\jnitesters\workspace\c\LGR\LGR.c:31: error: for each function it appears in.) 

를?

+0

if (1) {...} 문제는 ​​무엇입니까? – SirDarius

+0

@SirDarius를 테스트 목적으로 만 사용하십시오. 왜 그런 질문을해야합니까? :) –

+0

이것은 {{}를 사용하여 로컬 명명 범위를 만들 수 있기 때문에 이것은 순수한 호기심입니다. 왜냐하면 잘, 나는 그런 테스트의 실제적인 목적을 보지 못하기 때문입니다. – SirDarius

답변

4

블록에 변수를 선언하면 (이 경우 if(1) { ... } 문인 경우 블록에 clsStr을 선언 함) 해당 변수의 유효 기간 (및 유효 기간)은 해당 블록입니다. 그건 당신이 return clsStr 블록 뒤에 존재하지 않는다는 것을 의미합니다.

은 당신이 중 하나

  • 이동 반환 블록 내부의 문, 또는
  • 내가 글로벌 VAR은을 사용하여 해당 만든 때 if(1) { ... }

전에 변수 clsStr을 선언 할 수 있습니다 성명서 clsStr = (*env)->NewGlobalRef(env,cls)

오해입니다. 할당을 통해 변수를 전역으로 만들 수는 없습니다. 당신은 글로벌 범위의 선언에 의해 그렇게합니다. 할당을 통해 변수를 초기화 할 수는 있지만 그 범위와 아무 관계가 없습니다.

+0

다음 'NewGlobalRef (env, cls)'는 무엇을 의미합니까? –

+0

NewGlobalRef는 글로벌 ** Java ** 참조를 만들고 C 구현과 아무 관련이 없습니다. – SirDarius

+0

어떤 식 으로든 C 컴파일러에는 영향을 미치지 않습니다. 대신, JNI 호출이 끝나면 JNI * not *에게 참조를 해제하도록 지시합니다. IIUC, "글로벌"참조와 "로컬"참조의 차이점은 전역 참조가 프로그래머에 의해 항상 해제되어야한다는 것입니다 (프로그래머가 말할 때까지 객체는 삭제되지 않습니다). JNI 호출 후 로컬 참조는 GC를 따릅니다. 끝마친. 더 많은 정보 : http://java.sun.com/docs/books/jni/html/refs.html – jpalecek

관련 문제