Реализовать JNI-слушатель - PullRequest
2 голосов
/ 08 марта 2010

У меня есть следующий код в c ++ «классе слушателя» (более или менее), который вызывает некоторую функцию объекта Java. Я подозреваю, что есть утечка памяти:

JNIEnv *env = NULL;
vm_->AttachCurrentThread(&env, NULL);
const jclass cls = env->FindClass(...);
const jmethodID meth = env->GetMethodID(...);
const jobject obj = env->NewObject(cls, meth, ...);

[ more code ]

env->DeleteLocalRef(obj);

У меня такой вопрос: я должен также выпустить местную ссылку cls и meth ? Документация JNI не очень ясна по этому поводу.

1 Ответ

2 голосов
/ 08 марта 2010

Нет, в этом нет необходимости. Для этих двух переменных нет кучи, они только локальны для текущего метода и не должны быть свободны или что-то в этом роде.

Как правило, вы должны удалять объекты JNI, созданные с помощью метода, в имени которого указано New, например,

env->NewStringUTF(...)
env->NewObjectArray(...)
env->NewObject(...)

потому что все эти методы переводятся в какое-то выделение памяти в куче (new, malloc)

...