2011-01-09 3 views
3

나는 다음과 같은 기본 루틴을 가지고 : 나는 그대로이를 실행하면 메모리가 가득 때까지 최대 잘 작동하고 내가받을원시 코드에서 Java로 다시 전송되는 jstring을 해제하는 방법은 무엇입니까?

void sendMessage(const char* text) 
{ 
    JNIEnv* env; 

    if(!_jvm) 
     return; 

    _jvm->AttachCurrentThread(&env, NULL); 

    if(!_nativesCls) 
     _nativesCls = env->FindClass("com/foo/BaseLib"); 
    if(_nativesCls == 0) 
      return; 

    jstring message = env->NewStringUTF(text); 
    if(!_sendStr) 
     _sendStr = env->GetStaticMethodID(_nativesCls, "onMessage", "(Ljava/lang/String;)V"); 
    if(_sendStr) 
     env->CallStaticVoidMethod(_nativesCls, _sendStr, message); 
    //env->ReleaseStringUTFChars(message, text); // <----- * NOT WORKING 
} 

:

ReferenceTable 오버 플로우 (최대 = 512)

위의 주석 처리 된 줄을 추가하면 문제가 해결 될 것이라고 생각했지만 앱이 그 지점에서 폭탄을 터뜨릴뿐입니다.

제안 사항?

답변

3

DeleteLocalRef(). JNI 내에 할당 된 다른 Java 객체와 같습니다. 그러나 JNI 메서드가 반환되면 자동으로 가비지 수집됩니다. 여기 세부 정보 : http://download.oracle.com/javase/1.3/docs/guide/jni/spec/design.doc.html#1242

+0

굉장, 그것을 env로 변경 -> DeleteLocalRef (메시지); 그리고 효과가있었습니다! 감사합니다. –

+1

명확하게 말하면, 비 네이티브 코드로 돌아 가야합니다. 따라서 "메서드 반환"대신 "JNI 메서드가 반환됩니다"라는 이유가됩니다. 때로 사람들은 현재 네이티브 함수가 돌아올 때마다 지역이 반환 될 위치에 상관없이 지역 주민이 정리 될 것으로 기대합니다. – fadden

관련 문제