From: Mathieu Baudier Date: Mon, 31 Jan 2022 07:27:49 +0000 (+0100) Subject: Native UUID factory fully implemented. X-Git-Tag: argeo-commons-2.3.5~42 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=6ac12c3c0687e6259b7290c44aa1d2535de2000e Native UUID factory fully implemented. --- diff --git a/org.argeo.api.uuid/jni/.cproject b/org.argeo.api.uuid/jni/.cproject index 8ebb27348..8467d732b 100644 --- a/org.argeo.api.uuid/jni/.cproject +++ b/org.argeo.api.uuid/jni/.cproject @@ -41,7 +41,7 @@ - + @@ -117,6 +117,8 @@ + + diff --git a/org.argeo.api.uuid/jni/.project b/org.argeo.api.uuid/jni/.project index f8321d76e..74fde08ce 100644 --- a/org.argeo.api.uuid/jni/.project +++ b/org.argeo.api.uuid/jni/.project @@ -7,7 +7,6 @@ org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, 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 index faad90602..714abeb06 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/org_argeo_api_uuid_NativeUuidFactory.c @@ -3,18 +3,13 @@ #include "org_argeo_api_uuid_NativeUuidFactory.h" /* - * Class: org_argeo_api_uuid_NativeUuidFactory - * Method: timeUUID - * Signature: ()Ljava/util/UUID; + * UTILITIES */ -JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID( - JNIEnv *env, jobject) { - uuid_t out; + +static inline jobject fromBytes(JNIEnv *env, uuid_t out) { jlong msb = 0; jlong lsb = 0; - uuid_generate_time(out); - for (int i = 0; i < 8; i++) msb = (msb << 8) | (out[i] & 0xff); for (int i = 8; i < 16; i++) @@ -30,16 +25,56 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID( 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, jbyteArray name) { - size_t length = (*env)->GetArrayLength(env, name); + 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); - return NULL; + + uuid_generate_sha1(out, ns, bytes, length); + return fromBytes(env, out); } /* @@ -48,8 +83,16 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv5( * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID; */ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv3( - JNIEnv *env, jobject, jobject, jbyteArray) { - return NULL; + 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); } /* @@ -62,61 +105,5 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_randomUUIDSt uuid_t out; uuid_generate_random(out); - return NULL; + return fromBytes(env, out); } - -// void fromBytes(JNIEnv *env, jobject jUUID, jmethodID uuidConstructor, 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); -// -// (*env)->CallVoidMethod(env, jUUID, uuidConstructor, msb, lsb); -// -// } - -// void getMostSignificantBits(uuid_t out) { -// jlong msb = 0; -// for (int i = 0; i < 8; i++) -// msb = (msb << 8) | (out[i] & 0xff); -// return msb; -// } -// -// jlong getLeastSignificantBits(uuid_t out) { -// jlong lsb = 0; -// for (int i = 8; i < 16; i++) -// lsb = (lsb << 8) | (out[i] & 0xff); -// return lsb; -// } -// -// jobject fromBits(JNIEnv *env, jlong msb, jlong lsb) { -// 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; -// } - -// uuid_t 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, getMostSignificantBits); -// -// 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); -// return result; -// } 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 index cc7b367d6..0c6088aa2 100644 --- a/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java +++ b/org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java @@ -27,7 +27,7 @@ public class NativeUuidFactory implements UuidFactory, TypedUuidFactory { @Override public UUID randomUUIDWeak() { - throw new UnsupportedOperationException(); + return randomUUIDStrong(); } }