diff --git a/gradle.properties b/gradle.properties index 89429d7..ea59365 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.0.4 +version=1.0.4-ip.1 diff --git a/webrtc-jni/src/main/cpp/src/api/DataBufferFactory.cpp b/webrtc-jni/src/main/cpp/src/api/DataBufferFactory.cpp index 619b376..3f6ccc6 100644 --- a/webrtc-jni/src/main/cpp/src/api/DataBufferFactory.cpp +++ b/webrtc-jni/src/main/cpp/src/api/DataBufferFactory.cpp @@ -27,10 +27,12 @@ namespace jni JavaLocalRef DataBufferFactory::create(JNIEnv * env, const webrtc::DataBuffer * dataBuffer) const { - jobject directBuffer = env->NewDirectByteBuffer(const_cast(dataBuffer->data.data()), dataBuffer->data.size()); + // Held by a JavaLocalRef so the local reference is deleted once the buffer object + // holds its own reference. Callers on attached native threads never free it otherwise. + JavaLocalRef directBuffer(env, env->NewDirectByteBuffer(const_cast(dataBuffer->data.data()), dataBuffer->data.size())); const jboolean isBinary = static_cast(dataBuffer->binary); - jobject object = env->NewObject(javaClass, javaCtor, directBuffer, isBinary); + jobject object = env->NewObject(javaClass, javaCtor, directBuffer.get(), isBinary); ExceptionCheck(env); return JavaLocalRef(env, object); diff --git a/webrtc-jni/src/main/cpp/src/api/RTCDataChannelObserver.cpp b/webrtc-jni/src/main/cpp/src/api/RTCDataChannelObserver.cpp index c93c29f..aa20c29 100644 --- a/webrtc-jni/src/main/cpp/src/api/RTCDataChannelObserver.cpp +++ b/webrtc-jni/src/main/cpp/src/api/RTCDataChannelObserver.cpp @@ -40,9 +40,12 @@ namespace jni { JNIEnv * env = AttachCurrentThread(); + // This runs on a native WebRTC thread that stays attached to the JVM, so a local + // reference is never freed by returning to Java. Keep ownership with jBuffer, so the + // reference is deleted when it goes out of scope instead of leaking on every message. JavaLocalRef jBuffer = bufferFactory->create(env, &buffer); - env->CallVoidMethod(observer, javaClass->onMessage, jBuffer.release()); + env->CallVoidMethod(observer, javaClass->onMessage, jBuffer.get()); ExceptionCheck(env); }