Как выпустить jstring, отправленную из Native Code обратно в Java? - PullRequest
3 голосов
/ 09 января 2011

У меня есть следующая встроенная подпрограмма:

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

Я думал, что добавление закомментированной строки выше решит проблему, но это просто заставит приложение взорваться в этот момент.

Есть предложения?

1 Ответ

3 голосов
/ 09 января 2011

DeleteLocalRef (). Как и любой другой объект Java, который был размещен в JNI. Тем не менее, он будет автоматически собирать мусор после возврата метода JNI. Подробности здесь: http://download.oracle.com/javase/1.3/docs/guide/jni/spec/design.doc.html#1242

...