From: Mathieu Baudier Date: Mon, 31 Jan 2022 06:50:45 +0000 (+0100) Subject: First working version of UUID factory using the native libuuid library. X-Git-Tag: argeo-commons-2.3.5~43 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=ca80b01650fa7fde14547c07fedfc7037e2423e5 First working version of UUID factory using the native libuuid library. --- 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 5e32548d1..faad90602 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 @@ -1,73 +1,69 @@ #include #include #include "org_argeo_api_uuid_NativeUuidFactory.h" -/* Header for class 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 *env, jobject) { - uuid_t out; - jlong msb = 0; - jlong lsb = 0; +/* + * 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; + jlong msb = 0; + jlong lsb = 0; - uuid_generate_time(out); + uuid_generate_time(out); - 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); + 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"); + 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); + jobject jUUID = (*env)->AllocObject(env, uuidClass); + (*env)->CallVoidMethod(env, jUUID, uuidConstructor, msb, lsb); - return jUUID; - } + return jUUID; +} - /* - * 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); - jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0); - return NULL; - } +/* + * 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); + jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0); + return NULL; +} - /* - * 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, jbyteArray) { - return NULL; - } +/* + * 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, jbyteArray) { + return NULL; +} - /* - * 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; +/* + * 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 NULL; - } + uuid_generate_random(out); + return NULL; +} // void fromBytes(JNIEnv *env, jobject jUUID, jmethodID uuidConstructor, uuid_t out){ // jlong msb = 0; @@ -124,7 +120,3 @@ extern "C" { // result[i] = (unsigned char) ((lsb >> ((15 - i) * 8)) & 0xff); // return result; // } - -#ifdef __cplusplus -} -#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 index 21e0eb184..cc7b367d6 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 @@ -4,6 +4,9 @@ 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() { diff --git a/sdk/jni.mk b/sdk/jni.mk index bf2b87237..8483bd704 100644 --- a/sdk/jni.mk +++ b/sdk/jni.mk @@ -1,6 +1,6 @@ TARGET_EXEC := libJava_$(NATIVE_PACKAGE).so -LDFLAGS = -shared -fPIC -Wl,-soname,$(TARGET_EXEC).$(MAJOR).$(MINOR) +LDFLAGS = -shared -fPIC -Wl,-soname,$(TARGET_EXEC).$(MAJOR).$(MINOR) -luuid CFLAGS = -fPIC SRC_DIRS := .