如何将从本机代码发送的jstring释放回Java?

时间:2011-01-09 01:08:18

标签: c++ android memory-management java-native-interface android-ndk

我有以下原生程序:

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 overflow(max = 512)

我认为添加上面的注释行可以解决问题,但这只会导致应用程序在此时爆炸。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

DeleteLocalRef()。就像在JNI中分配的任何其他Java对象一样。但是,一旦JNI方法返回,它将自动被垃圾收集。详情请见http://download.oracle.com/javase/1.3/docs/guide/jni/spec/design.doc.html#1242