Put libuuid JNI bridge in a dedicated package.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 31 Jan 2022 10:38:00 +0000 (11:38 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 31 Jan 2022 10:38:00 +0000 (11:38 +0100)
15 files changed:
org.argeo.api.uuid/jni/.cproject
org.argeo.api.uuid/jni/Makefile
org.argeo.api.uuid/jni/org_argeo_api_uuid/.gitignore [deleted file]
org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile [deleted file]
org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c [deleted file]
org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h [deleted file]
org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.c [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.h [new file with mode: 0644]
org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java [deleted file]
org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/DirectLibuuidFactory.java [new file with mode: 0644]
org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java [new file with mode: 0644]

index 8467d732b039e97bd4bc631f64ac7a0e8304bcdc..cf5a27a23f12452a0efc7b10778e183c60942d9f 100644 (file)
@@ -93,7 +93,7 @@
                                                        
                     <sourceEntries>
                                                                        
-                        <entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="org_argeo_api_uuid"/>
+                        <entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="org_argeo_api_uuid_libuuid"/>
                                                                
                     </sourceEntries>
                                                
index 259b0ae9e3189c75fd0ed95a26b2b8aaaa4e05f1..df673b5324dfc0aee64f8526dd0e7828fd32f6f0 100644 (file)
@@ -1,4 +1,4 @@
-JNIDIRS = org_argeo_api_uuid
+JNIDIRS = org_argeo_api_uuid_libuuid
 
 .PHONY: clean all jni
 
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid/.gitignore b/org.argeo.api.uuid/jni/org_argeo_api_uuid/.gitignore
deleted file mode 100644 (file)
index 84c048a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/build/
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile b/org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile
deleted file mode 100644 (file)
index 336a38f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-NATIVE_PACKAGE := org_argeo_api_uuid
-
-include ../../../sdk.mk
-include $(SDK_SRC_BASE)/sdk/jni.mk
-
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c b/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c
deleted file mode 100644 (file)
index 714abeb..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#include <jni.h>
-#include <uuid.h>
-#include "org_argeo_api_uuid_NativeUuidFactory.h"
-
-/*
- * UTILITIES
- */
-
-static inline jobject fromBytes(JNIEnv *env, uuid_t out) {
-       jlong msb = 0;
-       jlong lsb = 0;
-
-       for (int i = 0; i < 8; i++)
-               msb = (msb << 8) | (out[i] & 0xff);
-       for (int i = 8; i < 16; i++)
-               lsb = (lsb << 8) | (out[i] & 0xff);
-
-       jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
-       jmethodID uuidConstructor = (*env)->GetMethodID(env, uuidClass, "<init>",
-                       "(JJ)V");
-
-       jobject jUUID = (*env)->AllocObject(env, uuidClass);
-       (*env)->CallVoidMethod(env, jUUID, uuidConstructor, msb, lsb);
-
-       return jUUID;
-}
-
-static inline void toBytes(JNIEnv *env, jobject jUUID, uuid_t result) {
-
-       jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
-       jmethodID getMostSignificantBits = (*env)->GetMethodID(env, uuidClass,
-                       "getMostSignificantBits", "()J");
-       jmethodID getLeastSignificantBits = (*env)->GetMethodID(env, uuidClass,
-                       "getLeastSignificantBits", "()J");
-
-       jlong msb = (*env)->CallLongMethod(env, jUUID, getMostSignificantBits);
-       jlong lsb = (*env)->CallLongMethod(env, jUUID, getLeastSignificantBits);
-
-       for (int i = 0; i < 8; i++)
-               result[i] = (unsigned char) ((msb >> ((7 - i) * 8)) & 0xff);
-       for (int i = 8; i < 16; i++)
-               result[i] = (unsigned char) ((lsb >> ((15 - i) * 8)) & 0xff);
-}
-
-/*
- * JNI IMPLEMENTATION
- */
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    timeUUID
- * Signature: ()Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID(
-               JNIEnv *env, jobject) {
-       uuid_t out;
-
-       uuid_generate_time(out);
-       return fromBytes(env, out);
-}
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    nameUUIDv5
- * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv5(
-               JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) {
-       uuid_t ns;
-       uuid_t out;
-
-       toBytes(env, namespaceUuid, ns);
-       jsize length = (*env)->GetArrayLength(env, name);
-       jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0);
-
-       uuid_generate_sha1(out, ns, bytes, length);
-       return fromBytes(env, out);
-}
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    nameUUIDv3
- * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv3(
-               JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) {
-       uuid_t ns;
-       uuid_t out;
-
-       toBytes(env, namespaceUuid, ns);
-       jsize length = (*env)->GetArrayLength(env, name);
-       jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0);
-
-       uuid_generate_md5(out, ns, bytes, length);
-       return fromBytes(env, out);
-}
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    randomUUIDStrong
- * Signature: ()Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_randomUUIDStrong(
-               JNIEnv *env, jobject) {
-       uuid_t out;
-
-       uuid_generate_random(out);
-       return fromBytes(env, out);
-}
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h b/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h
deleted file mode 100644 (file)
index bdf334a..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_argeo_api_uuid_NativeUuidFactory */
-
-#ifndef _Included_org_argeo_api_uuid_NativeUuidFactory
-#define _Included_org_argeo_api_uuid_NativeUuidFactory
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    timeUUID
- * Signature: ()Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID
-  (JNIEnv *, jobject);
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    nameUUIDv5
- * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv5
-  (JNIEnv *, jobject, jobject, jbyteArray);
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    nameUUIDv3
- * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv3
-  (JNIEnv *, jobject, jobject, jbyteArray);
-
-/*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    randomUUIDStrong
- * Signature: ()Ljava/util/UUID;
- */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_randomUUIDStrong
-  (JNIEnv *, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore
new file mode 100644 (file)
index 0000000..84c048a
--- /dev/null
@@ -0,0 +1 @@
+/build/
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile
new file mode 100644 (file)
index 0000000..492f59f
--- /dev/null
@@ -0,0 +1,5 @@
+NATIVE_PACKAGE := org_argeo_api_uuid_libuuid
+
+include ../../../sdk.mk
+include $(SDK_SRC_BASE)/sdk/jni.mk
+
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.c b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.c
new file mode 100644 (file)
index 0000000..71c2656
--- /dev/null
@@ -0,0 +1,8 @@
+#include <jni.h>
+#include <uuid.h>
+#include "org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h"
+
+JNIEXPORT void JNICALL Java_org_argeo_api_uuid_libuuid_DirectLibuuidFactory_timeUUID(
+               JNIEnv *env, jobject, jobject uuidBuf) {
+       uuid_generate_time((*env)->GetDirectBufferAddress(env, uuidBuf));
+}
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h
new file mode 100644 (file)
index 0000000..5f18bf7
--- /dev/null
@@ -0,0 +1,21 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_argeo_api_uuid_libuuid_DirectLibuuidFactory */
+
+#ifndef _Included_org_argeo_api_uuid_libuuid_DirectLibuuidFactory
+#define _Included_org_argeo_api_uuid_libuuid_DirectLibuuidFactory
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_argeo_api_uuid_libuuid_DirectLibuuidFactory
+ * Method:    timeUUID
+ * Signature: (Ljava/nio/ByteBuffer;)V
+ */
+JNIEXPORT void JNICALL Java_org_argeo_api_uuid_libuuid_DirectLibuuidFactory_timeUUID
+  (JNIEnv *, jobject, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c
new file mode 100644 (file)
index 0000000..cff3cc5
--- /dev/null
@@ -0,0 +1,89 @@
+#include <jni.h>
+#include <uuid.h>
+#include "org_argeo_api_uuid_libuuid_LibuuidFactory.h"
+
+/*
+ * UTILITIES
+ */
+
+static inline jobject fromBytes(JNIEnv *env, uuid_t out) {
+       jlong msb = 0;
+       jlong lsb = 0;
+
+       for (int i = 0; i < 8; i++)
+               msb = (msb << 8) | (out[i] & 0xff);
+       for (int i = 8; i < 16; i++)
+               lsb = (lsb << 8) | (out[i] & 0xff);
+
+       jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
+       jmethodID uuidConstructor = (*env)->GetMethodID(env, uuidClass, "<init>",
+                       "(JJ)V");
+
+       jobject jUUID = (*env)->AllocObject(env, uuidClass);
+       (*env)->CallVoidMethod(env, jUUID, uuidConstructor, msb, lsb);
+
+       return jUUID;
+}
+
+static inline void toBytes(JNIEnv *env, jobject jUUID, uuid_t result) {
+
+       jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
+       jmethodID getMostSignificantBits = (*env)->GetMethodID(env, uuidClass,
+                       "getMostSignificantBits", "()J");
+       jmethodID getLeastSignificantBits = (*env)->GetMethodID(env, uuidClass,
+                       "getLeastSignificantBits", "()J");
+
+       jlong msb = (*env)->CallLongMethod(env, jUUID, getMostSignificantBits);
+       jlong lsb = (*env)->CallLongMethod(env, jUUID, getLeastSignificantBits);
+
+       for (int i = 0; i < 8; i++)
+               result[i] = (unsigned char) ((msb >> ((7 - i) * 8)) & 0xff);
+       for (int i = 8; i < 16; i++)
+               result[i] = (unsigned char) ((lsb >> ((15 - i) * 8)) & 0xff);
+}
+
+/*
+ * JNI IMPLEMENTATION
+ */
+
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_timeUUID(
+               JNIEnv *env, jobject) {
+       uuid_t out;
+
+       uuid_generate_time(out);
+       return fromBytes(env, out);
+}
+
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_nameUUIDv5(
+               JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) {
+       uuid_t ns;
+       uuid_t out;
+
+       toBytes(env, namespaceUuid, ns);
+       jsize length = (*env)->GetArrayLength(env, name);
+       jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0);
+
+       uuid_generate_sha1(out, ns, bytes, length);
+       return fromBytes(env, out);
+}
+
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_nameUUIDv3(
+               JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) {
+       uuid_t ns;
+       uuid_t out;
+
+       toBytes(env, namespaceUuid, ns);
+       jsize length = (*env)->GetArrayLength(env, name);
+       jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0);
+
+       uuid_generate_md5(out, ns, bytes, length);
+       return fromBytes(env, out);
+}
+
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_randomUUIDStrong(
+               JNIEnv *env, jobject) {
+       uuid_t out;
+
+       uuid_generate_random(out);
+       return fromBytes(env, out);
+}
diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.h b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.h
new file mode 100644 (file)
index 0000000..ad0ac5e
--- /dev/null
@@ -0,0 +1,45 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_argeo_api_uuid_libuuid_LibuuidFactory */
+
+#ifndef _Included_org_argeo_api_uuid_libuuid_LibuuidFactory
+#define _Included_org_argeo_api_uuid_libuuid_LibuuidFactory
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_argeo_api_uuid_libuuid_LibuuidFactory
+ * Method:    timeUUID
+ * Signature: ()Ljava/util/UUID;
+ */
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_timeUUID
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     org_argeo_api_uuid_libuuid_LibuuidFactory
+ * Method:    nameUUIDv5
+ * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
+ */
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_nameUUIDv5
+  (JNIEnv *, jobject, jobject, jbyteArray);
+
+/*
+ * Class:     org_argeo_api_uuid_libuuid_LibuuidFactory
+ * Method:    nameUUIDv3
+ * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
+ */
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_nameUUIDv3
+  (JNIEnv *, jobject, jobject, jbyteArray);
+
+/*
+ * Class:     org_argeo_api_uuid_libuuid_LibuuidFactory
+ * Method:    randomUUIDStrong
+ * Signature: ()Ljava/util/UUID;
+ */
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_randomUUIDStrong
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java
deleted file mode 100644 (file)
index 0c6088a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.argeo.api.uuid;
-
-import java.util.UUID;
-
-/** An {@link UuidFactory} based on a native library. */
-public class NativeUuidFactory implements UuidFactory, TypedUuidFactory {
-       static {
-               System.loadLibrary("Java_org_argeo_api_uuid");
-       }
-
-       @Override
-       public UUID get() {
-               return timeUUID();
-       }
-
-       @Override
-       public native UUID timeUUID();
-
-       @Override
-       public native UUID nameUUIDv5(UUID namespace, byte[] data);
-
-       @Override
-       public native UUID nameUUIDv3(UUID namespace, byte[] data);
-
-       @Override
-       public native UUID randomUUIDStrong();
-
-       @Override
-       public UUID randomUUIDWeak() {
-               return randomUUIDStrong();
-       }
-
-}
diff --git a/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/DirectLibuuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/DirectLibuuidFactory.java
new file mode 100644 (file)
index 0000000..df3bb31
--- /dev/null
@@ -0,0 +1,58 @@
+package org.argeo.api.uuid.libuuid;
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.argeo.api.uuid.UuidBinaryUtils;
+import org.argeo.api.uuid.UuidFactory;
+
+/**
+ * @deprecated Rather use {@link LibuuidFactory}. This is just a proof of
+ *             concept that using shared memory in order to limit the JNI
+ *             overhead does not yield any significant performance gain. But it
+ *             could be an approach for computing and transferring bulk UUIDs
+ *             computations in one go, vi
+ *             {@link ByteBuffer#allocateDirect(int)}.
+ */
+public class DirectLibuuidFactory implements UuidFactory {
+       static {
+               System.loadLibrary("Java_org_argeo_api_uuid_libuuid");
+       }
+
+       @Override
+       public UUID get() {
+               return timeUUID();
+       }
+
+       @Override
+       public UUID timeUUID() {
+               ByteBuffer buf = ByteBuffer.allocateDirect(16);
+               timeUUID(buf);
+               byte[] arr = new byte[16];
+               buf.get(arr);
+               return UuidBinaryUtils.fromBytes(arr);
+       }
+
+       protected native void timeUUID(ByteBuffer uuidBuf);
+
+       @Override
+       public UUID nameUUIDv5(UUID namespace, byte[] data) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public UUID nameUUIDv3(UUID namespace, byte[] data) {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public UUID randomUUIDStrong() {
+               throw new UnsupportedOperationException();
+       }
+
+       @Override
+       public UUID randomUUIDWeak() {
+               throw new UnsupportedOperationException();
+       }
+
+}
diff --git a/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java
new file mode 100644 (file)
index 0000000..dd54c81
--- /dev/null
@@ -0,0 +1,36 @@
+package org.argeo.api.uuid.libuuid;
+
+import java.util.UUID;
+
+import org.argeo.api.uuid.TypedUuidFactory;
+import org.argeo.api.uuid.UuidFactory;
+
+/** An {@link UuidFactory} based on a native library. */
+public class LibuuidFactory implements UuidFactory, TypedUuidFactory {
+       static {
+               System.loadLibrary("Java_org_argeo_api_uuid_libuuid");
+       }
+
+       @Override
+       public UUID get() {
+               return timeUUID();
+       }
+
+       @Override
+       public native UUID timeUUID();
+
+       @Override
+       public native UUID nameUUIDv5(UUID namespace, byte[] data);
+
+       @Override
+       public native UUID nameUUIDv3(UUID namespace, byte[] data);
+
+       @Override
+       public native UUID randomUUIDStrong();
+
+       @Override
+       public UUID randomUUIDWeak() {
+               return randomUUIDStrong();
+       }
+
+}