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);