Skip to content

Commit

Permalink
Java wrapper unit test passes
Browse files Browse the repository at this point in the history
  • Loading branch information
lukemartinlogan committed Apr 29, 2023
1 parent f018521 commit a0aa46f
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 29 deletions.
2 changes: 1 addition & 1 deletion src/api/hermes.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ class Hermes {
/** Get traits attached to tag */
std::vector<Trait*> GetTraits(TagId tag_id,
uint32_t flags = ALL_BITS(uint32_t)) {
HILOG(kDebug, "Getting the traits for tag {}", tag_id)
// HILOG(kDebug, "Getting the traits for tag {}", tag_id)
std::vector<TraitId> trait_ids = HERMES->mdm_.GlobalTagGetTraits(tag_id);
std::vector<Trait*> traits;
traits.reserve(trait_ids.size());
Expand Down
4 changes: 4 additions & 0 deletions wrapper/java/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@ sourceSets {
srcDir 'src/test/java'
}
}
}

test {
useJUnit()
}
49 changes: 28 additions & 21 deletions wrapper/java/src/main/cpp/hermes_java_wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ class HermesJavaWrapper {
template<typename IdT>
jobject ConvertUniqueIdToJava(JNIEnv *env,
const IdT &id) {
jclass id_class = env->FindClass("java/src/main/java/UniqueId");
jmethodID id_cstor = env->GetMethodID(id_class, "<init>", "([C)V");
jclass id_class = env->FindClass("src/main/java/UniqueId");
jmethodID id_cstor = env->GetMethodID(id_class, "<init>", "(JI)V");
jobject id_java = env->NewObject(id_class, id_cstor,
id.unique_, id.node_id_);
return id_java;
Expand All @@ -41,22 +41,24 @@ class HermesJavaWrapper {
IdT GetUniqueIdFromJava(JNIEnv *env,
jobject bkt_id_java) {
jclass bkt_id_class = env->GetObjectClass(bkt_id_java);
jfieldID unique_fid = env->GetFieldID(bkt_id_class, "unique_",
"java/src/main/java/UniqueId");
jfieldID node_id_fid = env->GetFieldID(bkt_id_class, "node_id_",
"java/src/main/java/UniqueId");
jfieldID unique_fid = env->GetFieldID(bkt_id_class, "unique_", "J");
jfieldID node_id_fid = env->GetFieldID(bkt_id_class, "node_id_", "I");
IdT tag_id;
tag_id.unique_ = env->GetIntField(bkt_id_java, unique_fid);
tag_id.unique_ = env->GetLongField(bkt_id_java, unique_fid);
tag_id.node_id_ = env->GetIntField(bkt_id_java, node_id_fid);
return tag_id;
}

/** Convert a C++ BUCKET to Java Bucket */
jobject ConvertBucketToJava(JNIEnv *env,
hapi::Bucket &bkt) {
jclass bkt_class = env->FindClass("Java/src/main/java/Bucket");
jmethodID bkt_constructor = env->GetMethodID(bkt_class, "<init>", "([C)V");
jobject bkt_java = env->NewObject(bkt_class, bkt_constructor, bkt.GetId());
jclass bkt_class = env->FindClass("src/main/java/Bucket");
jmethodID bkt_constructor = env->GetMethodID(
bkt_class,
"<init>",
"(Lsrc/main/java/UniqueId;)V");
auto bkt_id_java = ConvertUniqueIdToJava<hermes::TagId>(env, bkt.GetId());
jobject bkt_java = env->NewObject(bkt_class, bkt_constructor, bkt_id_java);
return bkt_java;
}

Expand All @@ -65,7 +67,7 @@ class HermesJavaWrapper {
jobject bkt_java) {
jclass bkt_class = env->GetObjectClass(bkt_java);
jfieldID bkt_id_fid = env->GetFieldID(bkt_class, "bkt_id_",
"java/src/main/java/UniqueId");
"Lsrc/main/java/UniqueId;");
jobject bkt_id_java = env->GetObjectField(bkt_java, bkt_id_fid);
auto tag_id = GetUniqueIdFromJava<hermes::TagId>(env, bkt_id_java);
return hapi::Bucket(tag_id);
Expand All @@ -80,27 +82,32 @@ class HermesJavaWrapper {
hipc::Allocator *alloc = blob.GetAllocator();

// Allocate new Blob java
jclass blob_class = env->FindClass("java/src/main/java/Blob");
jmethodID blob_cstor = env->GetMethodID(blob_class, "<init>", "([C)V");
jclass blob_class = env->FindClass("src/main/java/Blob");
jmethodID blob_cstor = env->GetMethodID(
blob_class,
"<init>",
"(Ljava/nio/ByteBuffer;JJJ)V");
jobject blob_java = env->NewObject(blob_class, blob_cstor,
data_java,
(uint64_t)blob.data(), (uint64_t)alloc);
(uint64_t)blob.data(),
(uint64_t)blob.size(),
(uint64_t)alloc);
return blob_java;
}

/** Get a C++ BLOB from Java Blob */
hapi::Blob GetBlobFromJava(JNIEnv *env,
jobject blob_java) {
jclass blob_class = env->GetObjectClass(blob_java);
jfieldID blob_data_fid = env->GetFieldID(blob_class, "data_ptr_",
"java/src/main/java/Blob");
jfieldID blob_alloc_fid = env->GetFieldID(blob_class, "alloc_",
"java/src/main/java/Blob");
jfieldID blob_data_fid = env->GetFieldID(blob_class, "data_ptr_", "J");
jfieldID blob_size_fid = env->GetFieldID(blob_class, "size_", "J");
jfieldID blob_alloc_fid = env->GetFieldID(blob_class, "alloc_", "J");
hapi::Blob blob;
blob.alloc_ = reinterpret_cast<hipc::Allocator*>(
env->GetIntField(blob_java, blob_data_fid));
blob.data_ = reinterpret_cast<char*>(
env->GetIntField(blob_java, blob_alloc_fid));
env->GetLongField(blob_java, blob_data_fid));
blob.size_ = env->GetLongField(blob_java, blob_size_fid);
blob.alloc_ = reinterpret_cast<hipc::Allocator*>(
env->GetLongField(blob_java, blob_alloc_fid));
return blob;
}
};
Expand Down
1 change: 1 addition & 0 deletions wrapper/java/src/main/cpp/src_main_Bucket.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ JNIEXPORT void JNICALL Java_src_main_java_Bucket_destroy(JNIEnv *env,
JNIEXPORT jobject JNICALL Java_src_main_java_Bucket_get(JNIEnv *env,
jobject bkt_java,
jobject blob_id_java) {
std::cout << __func__ << std::endl;
hapi::Bucket bkt = HERMES_JAVA_WRAPPER->GetBucketFromJava(env, bkt_java);
auto blob_id = HERMES_JAVA_WRAPPER->GetUniqueIdFromJava<hermes::BlobId>(
env, blob_id_java);
Expand Down
10 changes: 8 additions & 2 deletions wrapper/java/src/main/java/Blob.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,23 @@
public class Blob {
public ByteBuffer data_;
long data_ptr_;
long size_;
long alloc_;

public Blob(ByteBuffer data, long data_ptr, long alloc) {
public Blob(ByteBuffer data, long data_ptr, long size, long alloc) {
data_ = data;
data_ptr_ = data_ptr;
size_ = size;
alloc_ = alloc;
}

public static native Blob fromString(String data);

protected native void close();
public native void close();

public boolean equals(Blob other) {
return data_.equals(other.data_);
}

static {
System.loadLibrary("hermes_src_main_Blob");
Expand Down
1 change: 1 addition & 0 deletions wrapper/java/src/main/java/Hermes.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package src.main.java;
import src.main.java.Bucket;

public class Hermes {
private static Hermes instance_ = null;
Expand Down
14 changes: 9 additions & 5 deletions wrapper/java/src/test/java/HermesJniTest.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
package src.test;
import org.junit.Test;
import static org.junit.Assert.*;

Expand All @@ -7,16 +6,21 @@
import src.main.java.Hermes;
import src.main.java.UniqueId;

import java.lang.management.ManagementFactory;

public class HermesJniTest {
@Test
public void testBucketPutGet() {
System.out.println(ManagementFactory.getRuntimeMXBean().getName());
Hermes hermes = Hermes.getInstance();
hermes.create();
Bucket bkt = hermes.getBucket("hello");
Blob data = Blob.fromString("this is my DATA!");
UniqueId blob_id = bkt.put("0", data);
Blob my_data = bkt.get(blob_id);
Blob old_data = Blob.fromString("this is my DATA!");
UniqueId blob_id = bkt.put("0", old_data);
Blob new_data = bkt.get(blob_id);
bkt.destroy();
assert(my_data.equals(data));
assertTrue(new_data.equals(old_data));
new_data.close();
old_data.close();
}
}

0 comments on commit a0aa46f

Please sign in to comment.