From 13467496582e30552566f872efbd25114716bb2f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 31 Jan 2022 11:38:00 +0100 Subject: [PATCH] Put libuuid JNI bridge in a dedicated package. --- org.argeo.api.uuid/jni/.cproject | 2 +- org.argeo.api.uuid/jni/Makefile | 2 +- .../org_argeo_api_uuid_NativeUuidFactory.h | 45 -------------- .../.gitignore | 0 .../Makefile | 2 +- ...eo_api_uuid_libuuid_DirectLibuuidFactory.c | 8 +++ ...eo_api_uuid_libuuid_DirectLibuuidFactory.h | 21 +++++++ ...g_argeo_api_uuid_libuuid_LibuuidFactory.c} | 30 ++-------- ...rg_argeo_api_uuid_libuuid_LibuuidFactory.h | 45 ++++++++++++++ .../uuid/libuuid/DirectLibuuidFactory.java | 58 +++++++++++++++++++ .../LibuuidFactory.java} | 9 ++- 11 files changed, 146 insertions(+), 76 deletions(-) delete mode 100644 org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h rename org.argeo.api.uuid/jni/{org_argeo_api_uuid => org_argeo_api_uuid_libuuid}/.gitignore (100%) rename org.argeo.api.uuid/jni/{org_argeo_api_uuid => org_argeo_api_uuid_libuuid}/Makefile (57%) create mode 100644 org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.c create mode 100644 org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h rename org.argeo.api.uuid/jni/{org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c => org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c} (70%) create mode 100644 org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.h create mode 100644 org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/DirectLibuuidFactory.java rename org.argeo.api.uuid/src/org/argeo/api/uuid/{NativeUuidFactory.java => libuuid/LibuuidFactory.java} (65%) diff --git a/org.argeo.api.uuid/jni/.cproject b/org.argeo.api.uuid/jni/.cproject index 8467d732b..cf5a27a23 100644 --- a/org.argeo.api.uuid/jni/.cproject +++ b/org.argeo.api.uuid/jni/.cproject @@ -93,7 +93,7 @@ - + diff --git a/org.argeo.api.uuid/jni/Makefile b/org.argeo.api.uuid/jni/Makefile index 259b0ae9e..df673b532 100644 --- a/org.argeo.api.uuid/jni/Makefile +++ b/org.argeo.api.uuid/jni/Makefile @@ -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/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 index bdf334ab5..000000000 --- a/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h +++ /dev/null @@ -1,45 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* 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/.gitignore b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore similarity index 100% rename from org.argeo.api.uuid/jni/org_argeo_api_uuid/.gitignore rename to org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile similarity index 57% rename from org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile rename to org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile index 336a38fac..492f59f8c 100644 --- a/org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile @@ -1,4 +1,4 @@ -NATIVE_PACKAGE := org_argeo_api_uuid +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 index 000000000..71c265671 --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.c @@ -0,0 +1,8 @@ +#include +#include +#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 index 000000000..5f18bf7f1 --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* 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/org_argeo_api_uuid_NativeUuidFactory.c b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c similarity index 70% rename from org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c rename to org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c index 714abeb06..cff3cc581 100644 --- 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_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c @@ -1,6 +1,6 @@ #include #include -#include "org_argeo_api_uuid_NativeUuidFactory.h" +#include "org_argeo_api_uuid_libuuid_LibuuidFactory.h" /* * UTILITIES @@ -46,12 +46,7 @@ static inline void toBytes(JNIEnv *env, jobject jUUID, uuid_t result) { * JNI IMPLEMENTATION */ -/* - * Class: org_argeo_api_uuid_NativeUuidFactory - * Method: timeUUID - * Signature: ()Ljava/util/UUID; - */ -JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID( +JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_timeUUID( JNIEnv *env, jobject) { uuid_t out; @@ -59,12 +54,7 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID( 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( +JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_nameUUIDv5( JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) { uuid_t ns; uuid_t out; @@ -77,12 +67,7 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv5( 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( +JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_nameUUIDv3( JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) { uuid_t ns; uuid_t out; @@ -95,12 +80,7 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv3( 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( +JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_libuuid_LibuuidFactory_randomUUIDStrong( JNIEnv *env, jobject) { uuid_t 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 index 000000000..ad0ac5e76 --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.h @@ -0,0 +1,45 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* 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/libuuid/DirectLibuuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/DirectLibuuidFactory.java new file mode 100644 index 000000000..df3bb3174 --- /dev/null +++ b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/DirectLibuuidFactory.java @@ -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/NativeUuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java similarity index 65% rename from org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java rename to org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java index 0c6088aa2..dd54c8159 100644 --- a/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java +++ b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java @@ -1,11 +1,14 @@ -package org.argeo.api.uuid; +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 NativeUuidFactory implements UuidFactory, TypedUuidFactory { +public class LibuuidFactory implements UuidFactory, TypedUuidFactory { static { - System.loadLibrary("Java_org_argeo_api_uuid"); + System.loadLibrary("Java_org_argeo_api_uuid_libuuid"); } @Override -- 2.30.2