From: Mathieu Baudier Date: Mon, 31 Jan 2022 10:38:00 +0000 (+0100) Subject: Put libuuid JNI bridge in a dedicated package. X-Git-Tag: argeo-commons-2.3.5~40 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=13467496582e30552566f872efbd25114716bb2f Put libuuid JNI bridge in a dedicated package. --- 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/.gitignore b/org.argeo.api.uuid/jni/org_argeo_api_uuid/.gitignore deleted file mode 100644 index 84c048a73..000000000 --- a/org.argeo.api.uuid/jni/org_argeo_api_uuid/.gitignore +++ /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 index 336a38fac..000000000 --- a/org.argeo.api.uuid/jni/org_argeo_api_uuid/Makefile +++ /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 index 714abeb06..000000000 --- a/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#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, "", - "(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 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_libuuid/.gitignore b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore new file mode 100644 index 000000000..84c048a73 --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/.gitignore @@ -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 index 000000000..492f59f8c --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/Makefile @@ -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 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_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 index 000000000..cff3cc581 --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid_libuuid/org_argeo_api_uuid_libuuid_LibuuidFactory.c @@ -0,0 +1,89 @@ +#include +#include +#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, "", + "(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 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/NativeUuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java deleted file mode 100644 index 0c6088aa2..000000000 --- a/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java +++ /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 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/libuuid/LibuuidFactory.java b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java new file mode 100644 index 000000000..dd54c8159 --- /dev/null +++ b/org.argeo.api.uuid/src/org/argeo/api/uuid/libuuid/LibuuidFactory.java @@ -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(); + } + +}