diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 5aad46fa4926..5dca1b6e5797 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -3487,7 +3487,53 @@ jobject Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange( env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle, JNI_ABORT); - return jrange_slice_handles; + // convert to Java type (HashMap) + jobject jhash_map = ROCKSDB_NAMESPACE::HashMapJni::construct( + env, static_cast(table_properties_collection.size())); + if (jhash_map == nullptr) { + // exception occurred + return nullptr; + } + + const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV< + const std::string, + const std::shared_ptr, jobject, + jobject> + fn_map_kv = + [env](const std::pair>& + kv) { + jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString( + env, &(kv.first), false); + if (env->ExceptionCheck()) { + // an error occurred + return std::unique_ptr>(nullptr); + } + + jobject jtable_properties = + ROCKSDB_NAMESPACE::TablePropertiesJni::fromCppTableProperties( + env, *(kv.second.get())); + if (jtable_properties == nullptr) { + // an error occurred + env->DeleteLocalRef(jkey); + return std::unique_ptr>(nullptr); + } + + return std::unique_ptr>( + new std::pair( + static_cast(jkey), + static_cast(jtable_properties))); + }; + + if (!ROCKSDB_NAMESPACE::HashMapJni::putAll( + env, jhash_map, table_properties_collection.begin(), + table_properties_collection.end(), fn_map_kv)) { + // exception occurred + return nullptr; + } + + return jhash_map; } /*