2011-01-09 5 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(message)に変更しました。それは働いた!ありがとう –

+1

明確にするために、非ネイティブコードに戻さなければなりません。そのため、「メソッドが返す」ではなく「JNIメソッドが返す」という答えが返されます。人々は、現在のネイティブ関数が返ってくる場所にかかわらず、いつでも地元の人々をきれいにすることを期待しています。 – fadden

関連する問題