Index: subversion/bindings/javahl/native/CommitCallback.h =================================================================== --- subversion/bindings/javahl/native/CommitCallback.h (revision 1353380) +++ subversion/bindings/javahl/native/CommitCallback.h (working copy) @@ -37,7 +37,7 @@ class CommitCallback { public: - CommitCallback(jobject jcallback); + CommitCallback(jobject jcallback, bool keepGlobalRef = false); ~CommitCallback(); static svn_error_t *callback(const svn_commit_info_t *commit_info, @@ -49,9 +49,14 @@ private: /** - * This a local reference to the Java object. + * This a reference to the Java object. */ jobject m_callback; + + /** + * Is the reference we are keeping global or local + */ + bool globalRef; }; #endif // COMMITCALLBACK_H Index: subversion/bindings/javahl/native/CommitCallback.cpp =================================================================== --- subversion/bindings/javahl/native/CommitCallback.cpp (revision 1353380) +++ subversion/bindings/javahl/native/CommitCallback.cpp (working copy) @@ -36,9 +36,24 @@ * Create a CommitCallback object * @param jcallback the Java callback object. */ -CommitCallback::CommitCallback(jobject jcallback) +CommitCallback::CommitCallback(jobject jcallback, bool keepGlobalRef) { - m_callback = jcallback; + globalRef = false; + + if(!keepGlobalRef) + { + m_callback = jcallback; + return; + } + + JNIEnv *env = JNIUtil::getEnv(); + m_callback = env->NewGlobalRef(jcallback); + if (JNIUtil::isJavaExceptionThrown()) + { + return; + } + + globalRef = true; } /** @@ -46,9 +61,13 @@ */ CommitCallback::~CommitCallback() { - // The m_callback does not need to be destroyed because it is the - // passed in parameter to the Java SVNClientInterface.logMessages - // method. + // If we are holding global reference to the callback object + // we need to destroy it + if(globalRef && m_callback != NULL) + { + JNIEnv *env = JNIUtil::getEnv(); + env->DeleteGlobalRef(m_callback); + } } svn_error_t *