у вас есть 2 буфера, одна из которых передана из вашего Java-кода (bOldArray) и локального буфера (oldbuff), который вы разместили в строке 2.
на самом деле у вас может быть больше буферов, потому что
(*env)->GetArrayLength
с почти наверняка делает неподвижную копию памяти (необходимой для c-указателя-доступа), которая содержит массив в вашем Java-коде и с
(*env)->ReleaseByteArrayElements(env,bOldArray,(jbyte *)bytes,0);
эта память копируется обратно в память вашего Java-массива (см. Документацию по последнему аргументу ReleaseByteArrayElements)
но о вашей проблеме: вы должны освободить oldBuff тоже.
free(oldBuff);
иначе виртуальная машина освобождает вашу c-копию массива java, но не самораспределяющуюся часть напрямую (это может быть сделано позже из-за времени жизни объекта и сборки мусора, но это непредсказуемо и, следовательно, из-за ошибка памяти также непредсказуема)
чтобы избежать механизма java-c-copy (ускоряет работу), используйте общий / статический буфер, такой как ByteBuffer