diff --git a/java/RocksDBSample.java b/java/RocksDBSample.java index dc2ae6cd97..b574c23e51 100644 --- a/java/RocksDBSample.java +++ b/java/RocksDBSample.java @@ -62,7 +62,7 @@ public class RocksDBSample { byte[] enoughArray = new byte[50]; int len; len = db.get(testKey, insufficientArray); - assert(len > testKey.length); + assert(len > insufficientArray.length); len = db.get("asdfjkl;".getBytes(), enoughArray); assert(len == RocksDB.NOT_FOUND); len = db.get(testKey, enoughArray); diff --git a/java/org/rocksdb/RocksDB.java b/java/org/rocksdb/RocksDB.java index cd43cf4e5e..7e96eff283 100644 --- a/java/org/rocksdb/RocksDB.java +++ b/java/org/rocksdb/RocksDB.java @@ -34,7 +34,9 @@ public class RocksDB implements Closeable { } @Override public void close() throws IOException { - close0(); + if (nativeHandle != 0) { + close0(); + } } /** diff --git a/java/rocksjni/rocksjni.cc b/java/rocksjni/rocksjni.cc index 6c992bc000..3ae53834ee 100644 --- a/java/rocksjni/rocksjni.cc +++ b/java/rocksjni/rocksjni.cc @@ -121,6 +121,9 @@ jint Java_org_rocksdb_RocksDB_get___3BI_3BI( JNIEnv* env, jobject jdb, jbyteArray jkey, jint jkey_len, jbyteArray jvalue, jint jvalue_len) { + static const int kNotFound = -1; + static const int kStatusError = -2; + rocksdb::DB* db = rocksdb::RocksDBJni::getHandle(env, jdb); jboolean isCopy; @@ -142,24 +145,29 @@ jint Java_org_rocksdb_RocksDB_get___3BI_3BI( if (s.IsNotFound()) { env->ReleaseByteArrayElements(jvalue, value, JNI_ABORT); - return -1; - } else if (s.ok()) { - int cvalue_len = static_cast(cvalue.size()); - int length = cvalue_len; - // currently we prevent overflowing. - if (length > jvalue_len) { - length = jvalue_len; - } - memcpy(value, cvalue.c_str(), length); - env->ReleaseByteArrayElements(jvalue, value, JNI_COMMIT); - if (cvalue_len > length) { - return static_cast(cvalue.size()); - } - return length; - } - rocksdb::RocksDBExceptionJni::ThrowNew(env, s); + return kNotFound; + } else if (!s.ok()) { + // Here since we are throwing a Java exception from c++ side. + // As a result, c++ does not know calling this function will in fact + // throwing an exception. As a result, the execution flow will + // not stop here, and codes after this throw will still be + // executed. + rocksdb::RocksDBExceptionJni::ThrowNew(env, s); - return -1; + // Return a dummy const value to avoid compilation error, although + // java side might not have a chance to get the return value :) + return kStatusError; + } + + int cvalue_len = static_cast(cvalue.size()); + int length = std::min(jvalue_len, cvalue_len); + + memcpy(value, cvalue.c_str(), length); + env->ReleaseByteArrayElements(jvalue, value, JNI_COMMIT); + if (cvalue_len > length) { + return static_cast(cvalue_len); + } + return length; } /*