From f6924f67360585696dfd00f0784d41f83c50c651 Mon Sep 17 00:00:00 2001
From: David Li
Date: Fri, 12 Jun 2026 14:58:00 +0900
Subject: [PATCH] fix(java/driver/jni): delete JNI local references
Assisted-by: Claude Opus 4.8
---
java/driver/jni/src/main/cpp/jni_wrapper.cc | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/java/driver/jni/src/main/cpp/jni_wrapper.cc b/java/driver/jni/src/main/cpp/jni_wrapper.cc
index 6af1a247c3..6ba793d915 100644
--- a/java/driver/jni/src/main/cpp/jni_wrapper.cc
+++ b/java/driver/jni/src/main/cpp/jni_wrapper.cc
@@ -208,6 +208,7 @@ struct JniStringView {
}
env->ReleaseStringUTFChars(jni_string, value);
+ env->DeleteLocalRef(jni_string);
jni_string = nullptr;
}
};
@@ -544,11 +545,15 @@ Java_org_apache_arrow_adbc_driver_jni_impl_NativeAdbc_statementExecutePartitions
for (size_t i = 0; i < partitions.num_partitions; i++) {
size_t length = partitions.partition_lengths[i];
jbyteArray partition = env->NewByteArray(static_cast(length));
+ if (partition == nullptr || env->ExceptionCheck()) goto cleanupall;
env->SetByteArrayRegion(partition, 0, static_cast(length),
reinterpret_cast(partitions.partitions[i]));
if (env->ExceptionCheck()) goto cleanupall;
env->CallObjectMethod(result, native_result_add_partition, partition);
if (env->ExceptionCheck()) goto cleanupall;
+ // The Java side has a reference now, so free the per-iteration local
+ // reference to avoid overflowing the local reference table
+ env->DeleteLocalRef(partition);
}
} catch (const AdbcException& e) {
e.ThrowJavaException(env);