First working version of UUID factory using the native libuuid library.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 31 Jan 2022 06:50:45 +0000 (07:50 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 31 Jan 2022 06:50:45 +0000 (07:50 +0100)
org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c
org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java
sdk/jni.mk

index 5e32548d111b38d9a38a1d8ffe0d8c7058b051f1..faad90602e289838bf6eac19ef967c5e93fa1105 100644 (file)
@@ -1,73 +1,69 @@
 #include <jni.h>
 #include <uuid.h>
 #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,
-                               "<init>", "(JJ)V");
+       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);
+       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
index 21e0eb18496db129fd357e5a631c8f3981d19247..cc7b367d6509f350485b54e123b11008271c12d4 100644 (file)
@@ -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() {
index bf2b872375410a0bc7710a455ab514a4bfe0dd44..8483bd7041ddca5096a7cb63872af055e8a7366f 100644 (file)
@@ -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 := .