-
Notifications
You must be signed in to change notification settings - Fork 6.5k
Open
Description
Java_org_rocksdb_RocksDB_getPropertiesOfAllTables(JNIEnv* env, jclass, jlong jdb_handle, jlong jcf_handle) does convert table_properties_collection
to HashMapJni
type and return.
rocksdb/java/rocksjni/rocksjni.cc
Lines 3391 to 3437 in f2a8ee8
// convert to Java type | |
jobject jhash_map = ROCKSDB_NAMESPACE::HashMapJni::construct( | |
env, static_cast<uint32_t>(table_properties_collection.size())); | |
if (jhash_map == nullptr) { | |
// exception occurred | |
return nullptr; | |
} | |
const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV< | |
const std::string, | |
const std::shared_ptr<const ROCKSDB_NAMESPACE::TableProperties>, jobject, | |
jobject> | |
fn_map_kv = | |
[env](const std::pair<const std::string, | |
const std::shared_ptr< | |
const ROCKSDB_NAMESPACE::TableProperties>>& | |
kv) { | |
jstring jkey = ROCKSDB_NAMESPACE::JniUtil::toJavaString( | |
env, &(kv.first), false); | |
if (env->ExceptionCheck()) { | |
// an error occurred | |
return std::unique_ptr<std::pair<jobject, jobject>>(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<std::pair<jobject, jobject>>(nullptr); | |
} | |
return std::unique_ptr<std::pair<jobject, jobject>>( | |
new std::pair<jobject, jobject>( | |
static_cast<jobject>(jkey), | |
static_cast<jobject>(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; |
But jobject Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange(JNIEnv* env, jclass, jlong jdb_handle, jlong jcf_handle, jlongArray jrange_slice_handles)
return its input paramater jrange_slice_handles
as output? Which leads IncompatibleClassChange Class [J does not implement the requested interface java.util.Map
error in java
rocksdb/java/rocksjni/rocksjni.cc
Lines 3440 to 3491 in f2a8ee8
/* | |
* Class: org_rocksdb_RocksDB | |
* Method: getPropertiesOfTablesInRange | |
* Signature: (JJ[J)Ljava/util/Map; | |
*/ | |
jobject Java_org_rocksdb_RocksDB_getPropertiesOfTablesInRange( | |
JNIEnv* env, jclass, jlong jdb_handle, jlong jcf_handle, | |
jlongArray jrange_slice_handles) { | |
auto* db = reinterpret_cast<ROCKSDB_NAMESPACE::DB*>(jdb_handle); | |
ROCKSDB_NAMESPACE::ColumnFamilyHandle* cf_handle; | |
if (jcf_handle == 0) { | |
cf_handle = db->DefaultColumnFamily(); | |
} else { | |
cf_handle = | |
reinterpret_cast<ROCKSDB_NAMESPACE::ColumnFamilyHandle*>(jcf_handle); | |
} | |
const jsize jlen = env->GetArrayLength(jrange_slice_handles); | |
jlong* jrange_slice_handle = | |
env->GetLongArrayElements(jrange_slice_handles, nullptr); | |
if (jrange_slice_handle == nullptr) { | |
// exception occurred | |
return nullptr; | |
} | |
const size_t ranges_len = static_cast<size_t>(jlen / 2); | |
auto ranges = std::unique_ptr<ROCKSDB_NAMESPACE::Range[]>( | |
new ROCKSDB_NAMESPACE::Range[ranges_len]); | |
for (jsize i = 0, j = 0; i < jlen; ++i) { | |
auto* start = | |
reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jrange_slice_handle[i]); | |
auto* limit = | |
reinterpret_cast<ROCKSDB_NAMESPACE::Slice*>(jrange_slice_handle[++i]); | |
ranges[j++] = ROCKSDB_NAMESPACE::Range(*start, *limit); | |
} | |
ROCKSDB_NAMESPACE::TablePropertiesCollection table_properties_collection; | |
auto s = db->GetPropertiesOfTablesInRange(cf_handle, ranges.get(), ranges_len, | |
&table_properties_collection); | |
if (!s.ok()) { | |
// error occurred | |
env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle, | |
JNI_ABORT); | |
ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s); | |
return nullptr; | |
} | |
// cleanup | |
env->ReleaseLongArrayElements(jrange_slice_handles, jrange_slice_handle, | |
JNI_ABORT); | |
return jrange_slice_handles; | |
} |
Metadata
Metadata
Assignees
Labels
No labels