From 71771ffc4a2954bab267531a63ce106460ae9951 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 30 Jan 2022 09:39:54 +0100 Subject: [PATCH] Start working on JNI implementation of UUID factory. --- org.argeo.api.uuid/jni/.cproject | 4 +- .../libuuid_NativeUuidFactory.cpp | 1 - .../org_argeo_api_uuid_NativeUuidFactory.c | 130 ++++++++++++++++++ sdk/jni.mk | 4 +- 4 files changed, 136 insertions(+), 3 deletions(-) delete mode 100644 org.argeo.api.uuid/jni/org_argeo_api_uuid/libuuid_NativeUuidFactory.cpp create mode 100644 org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c diff --git a/org.argeo.api.uuid/jni/.cproject b/org.argeo.api.uuid/jni/.cproject index 4bb1d0cc8..8ebb27348 100644 --- a/org.argeo.api.uuid/jni/.cproject +++ b/org.argeo.api.uuid/jni/.cproject @@ -55,7 +55,9 @@ - + + + diff --git a/org.argeo.api.uuid/jni/org_argeo_api_uuid/libuuid_NativeUuidFactory.cpp b/org.argeo.api.uuid/jni/org_argeo_api_uuid/libuuid_NativeUuidFactory.cpp deleted file mode 100644 index 2930397c2..000000000 --- a/org.argeo.api.uuid/jni/org_argeo_api_uuid/libuuid_NativeUuidFactory.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "../../jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h" 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 new file mode 100644 index 000000000..5e32548d1 --- /dev/null +++ b/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c @@ -0,0 +1,130 @@ +#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; + + 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); + + 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; + } + + /* + * 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: 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; + } + +// 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; +// } + +#ifdef __cplusplus +} +#endif diff --git a/sdk/jni.mk b/sdk/jni.mk index 6f5c31fb4..bf2b87237 100644 --- a/sdk/jni.mk +++ b/sdk/jni.mk @@ -1,6 +1,7 @@ TARGET_EXEC := libJava_$(NATIVE_PACKAGE).so LDFLAGS = -shared -fPIC -Wl,-soname,$(TARGET_EXEC).$(MAJOR).$(MINOR) +CFLAGS = -fPIC SRC_DIRS := . %: @@ -20,7 +21,8 @@ BUILD_DIR := $(SDK_BUILD_BASE)/$(NATIVE_PACKAGE) #ARCH := $(shell uname -p) # Every folder in ./src will need to be passed to GCC so that it can find header files -INC_DIRS := $(shell find $(SRC_DIRS) -type d) /usr/lib/jvm/java/include /usr/lib/jvm/java/include/linux +INC_DIRS := $(shell find $(SRC_DIRS) -type d) /usr/lib/jvm/java/include /usr/lib/jvm/java/include/linux /usr/include/uuid + .PHONY: clean all ide all: $(SDK_BUILD_BASE)/$(TARGET_EXEC) -- 2.30.2