<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>
-JNIDIRS = org_argeo_api_uuid
+JNIDIRS = org_argeo_api_uuid_libuuid
.PHONY: clean all jni
+++ /dev/null
-NATIVE_PACKAGE := org_argeo_api_uuid
-
-include ../../../sdk.mk
-include $(SDK_SRC_BASE)/sdk/jni.mk
-
+++ /dev/null
-#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);
-}
+++ /dev/null
-/* 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
--- /dev/null
+NATIVE_PACKAGE := org_argeo_api_uuid_libuuid
+
+include ../../../sdk.mk
+include $(SDK_SRC_BASE)/sdk/jni.mk
+
--- /dev/null
+#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));
+}
--- /dev/null
+/* 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
--- /dev/null
+#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);
+}
--- /dev/null
+/* 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
+++ /dev/null
-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();
- }
-
-}
--- /dev/null
+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();
+ }
+
+}
--- /dev/null
+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();
+ }
+
+}