include sdk.mk
-.PHONY: clean all osgi
+.PHONY: clean all osgi jni
-all: osgi
+all: osgi jni
$(MAKE) -f Makefile-rcp.mk all
+jni:
+ $(MAKE) -C jni
+
A2_CATEGORY = org.argeo.slc
BUNDLES = \
swt/rap/org.argeo.tool.rap.cli \
swt/rap/org.argeo.tool.server \
-clean:
- rm -rf $(BUILD_BASE)
- $(MAKE) -f Makefile-rcp.mk clean
-
DEP_CATEGORIES = \
org.argeo.tp \
org.argeo.tp.sdk \
swt/org.argeo.cms \
swt/rap/org.argeo.cms \
+clean:
+ rm -rf $(BUILD_BASE)
+ $(MAKE) -C jni clean
+ $(MAKE) -f Makefile-rcp.mk clean
+
GRAALVM_HOME = /opt/graalvm-ce
A2_BUNDLES_CLASSPATH = $(subst $(space),$(pathsep),$(strip $(A2_BUNDLES)))
swt/rcp/org.argeo.tool.rcp.cli \
swt/rcp/org.argeo.tool.desktop \
-clean:
- rm -rf $(BUILD_BASE)
-
-A2_OUTPUT = $(SDK_BUILD_BASE)/a2
-A2_BASE = $(A2_OUTPUT)
-
DEP_CATEGORIES = \
org.argeo.tp \
org.argeo.tp.sdk \
swt/org.argeo.cms \
swt/rcp/org.argeo.cms \
+clean:
+ rm -rf $(BUILD_BASE)
+
GRAALVM_HOME = /opt/graalvm-ce
A2_BUNDLES_CLASSPATH = $(subst $(space),$(pathsep),$(strip $(A2_BUNDLES)))
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="cdt.managedbuild.toolchain.gnu.cross.base.1367283591">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.cross.base.1367283591" moduleId="org.eclipse.cdt.core.settings" name="Linux x86_64">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="${ProjName}" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.cross.base.1367283591" name="Linux x86_64" parent="org.eclipse.cdt.build.core.emptycfg">
+ <folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.1367283591.350590933" name="/" resourcePath="">
+ <toolChain id="cdt.managedbuild.toolchain.gnu.cross.base.2019979628" name="Cross GCC">
+ <option id="cdt.managedbuild.option.gnu.cross.prefix.715257330" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix"/>
+ <option id="cdt.managedbuild.option.gnu.cross.path.1210265928" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.2070205849" isAbstract="false" osList="all"/>
+ <builder enableAutoBuild="true" id="cdt.managedbuild.builder.gnu.cross.1468217036" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder"/>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="org_argeo_api_uuid_libuuid"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="org.argeo.api.uuid.null.1913821562" name="org.argeo.api.uuid"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration configurationName="Linux x86_64"/>
+ <configuration configurationName="Default">
+ <resource resourceType="PROJECT" workspacePath="/Java_org_argeo_api_uuid"/>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1367283591;cdt.managedbuild.toolchain.gnu.cross.base.1367283591.350590933;cdt.managedbuild.tool.gnu.cross.c.compiler.453851306;cdt.managedbuild.tool.gnu.c.compiler.input.1102448447">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1367283591;cdt.managedbuild.toolchain.gnu.cross.base.1367283591.350590933;cdt.managedbuild.tool.gnu.cross.cpp.compiler.365551368;cdt.managedbuild.tool.gnu.cpp.compiler.input.916135861">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
+ <buildTargets>
+ <target name="ide" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+ <buildCommand>make</buildCommand>
+ <buildArguments/>
+ <buildTarget>ide</buildTarget>
+ <stopOnError>true</stopOnError>
+ <useDefaultCommand>true</useDefaultCommand>
+ <runAllBuilders>true</runAllBuilders>
+ </target>
+ </buildTargets>
+ </storageModule>
+</cproject>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>jni-commons</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+ <configuration id="cdt.managedbuild.toolchain.gnu.cross.base.1367283591" name="Linux x86_64">
+ <extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+ <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+ <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+ <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
+ <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+ </extension>
+ </configuration>
+</project>
\ No newline at end of file
--- /dev/null
+doxygen/doxygen_new_line_after_brief=true
+doxygen/doxygen_use_brief_tag=false
+doxygen/doxygen_use_javadoc_tags=true
+doxygen/doxygen_use_pre_tag=false
+doxygen/doxygen_use_structural_commands=false
+eclipse.preferences.version=1
--- /dev/null
+include ../sdk.mk
+
+JNIDIRS = org_argeo_api_uuid_libuuid
+
+.PHONY: clean all
+
+all:
+ $(foreach dir, $(JNIDIRS), $(MAKE) -C $(dir);)
+
+clean:
+ rm -rf $(BUILD_DIR) $(SDK_BUILD_BASE)/jni
+
+
+
--- /dev/null
+TARGET_EXEC := libJava_$(NATIVE_PACKAGE).so
+
+LDFLAGS = -shared -fPIC -Wl,-soname,$(TARGET_EXEC).$(MAJOR).$(MINOR) $(ADDITIONAL_LIBS)
+CFLAGS = -O3 -fPIC
+
+SRC_DIRS := .
+
+#
+# Generic Argeo
+#
+BUILD_DIR := $(SDK_BUILD_BASE)/jni/$(NATIVE_PACKAGE)
+
+# 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) $(JAVA_HOME)/include $(JAVA_HOME)/include/linux $(ADDITIONAL_INCLUDES)
+
+
+.PHONY: clean all ide
+all: $(SDK_BUILD_BASE)/jni/$(TARGET_EXEC)
+
+# Find all the C and C++ files we want to compile
+# Note the single quotes around the * expressions. Make will incorrectly expand these otherwise.
+SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c' -or -name '*.s')
+
+# String substitution for every C/C++ file.
+# As an example, hello.cpp turns into ./build/hello.cpp.o
+OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
+
+# String substitution (suffix version without %).
+# As an example, ./build/hello.cpp.o turns into ./build/hello.cpp.d
+DEPS := $(OBJS:.o=.d)
+
+# Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag
+INC_FLAGS := $(addprefix -I,$(INC_DIRS))
+
+# The -MMD and -MP flags together generate Makefiles for us!
+# These files will have .d instead of .o as the output.
+CPPFLAGS := $(INC_FLAGS) -MMD -MP
+
+# The final build step.
+$(SDK_BUILD_BASE)/jni/$(TARGET_EXEC): $(OBJS)
+ $(CC) $(OBJS) -o $@ $(LDFLAGS)
+
+# Build step for C source
+$(BUILD_DIR)/%.c.o: %.c
+ mkdir -p $(dir $@)
+ $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
+
+# Build step for C++ source
+$(BUILD_DIR)/%.cpp.o: %.cpp
+ mkdir -p $(dir $@)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
+
+# Include the .d makefiles. The - at the front suppresses the errors of missing
+# Makefiles. Initially, all the .d files will be missing, and we don't want those
+# errors to show up.
+-include $(DEPS)
+
+# MAKEFILE_DIR := $(dir $(firstword $(MAKEFILE_LIST)))
--- /dev/null
+NATIVE_PACKAGE := org_argeo_api_uuid_libuuid
+
+ADDITIONAL_INCLUDES = /usr/include/uuid
+ADDITIONAL_LIBS = -luuid
+
+include ../../sdk.mk
+include ../jni.mk
+
--- /dev/null
+#include <jni.h>
+#include <uuid.h>
+#include "org_argeo_api_uuid_libuuid_DirectLibuuidFactory.h"
+
+JNIEXPORT void JNICALL Java_org_argeo_api_uuid_libuuid_DirectLibuuidFactory_timeUUID(
+ JNIEnv *env, jobject uuidFactory, jobject uuidBuf) {
+ uuid_generate_time((*env)->GetDirectBufferAddress(env, uuidBuf));
+}
--- /dev/null
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* 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
--- /dev/null
+#include <jni.h>
+#include <uuid.h>
+#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, "<init>",
+ "(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 uuidFactory) {
+ 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 uuidFactory, 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 uuidFactory, 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 uuidFactory) {
+ uuid_t out;
+
+ uuid_generate_random(out);
+ return fromBytes(env, out);
+}
--- /dev/null
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* 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