Introduce Makefile and JNI support
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 27 Jan 2022 08:37:58 +0000 (09:37 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 27 Jan 2022 08:37:58 +0000 (09:37 +0100)
Makefile [new file with mode: 0644]
org.argeo.api.uuid/.cproject [new file with mode: 0644]
org.argeo.api.uuid/.project
org.argeo.api.uuid/.settings/language.settings.xml [new file with mode: 0644]
org.argeo.api.uuid/.settings/org.eclipse.cdt.core.prefs [new file with mode: 0644]
org.argeo.api.uuid/META-INF/.gitignore [new file with mode: 0644]
org.argeo.api.uuid/Makefile [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid/libuuid_NativeUuidFactory.cpp [new file with mode: 0644]
org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h [new file with mode: 0644]
org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java [new file with mode: 0644]
sdk.mk [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..d57f2a7
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+MAKEDIRS = org.argeo.api.uuid
+
+.PHONY: clean all
+all:
+       $(foreach dir, $(MAKEDIRS), $(MAKE) -C $(dir);)
+       
+clean:
+       $(foreach dir, $(MAKEDIRS), $(MAKE) -C $(dir) clean;)
+
+include sdk.mk 
\ No newline at end of file
diff --git a/org.argeo.api.uuid/.cproject b/org.argeo.api.uuid/.cproject
new file mode 100644 (file)
index 0000000..7acdcf5
--- /dev/null
@@ -0,0 +1,170 @@
+<?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"/>
+                                               
+                </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" superClass="cdt.managedbuild.toolchain.gnu.cross.base">
+                                                                               
+                            <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" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
+                                                                               
+                            <builder id="cdt.managedbuild.builder.gnu.cross.1468217036" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/>
+                                                                               
+                            <tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.453851306" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
+                                                                                               
+                                <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1102448447" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+                                                                                       
+                            </tool>
+                                                                               
+                            <tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.365551368" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler">
+                                                                                               
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1203427394" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+                                                                                                       
+                                    <listOptionValue builtIn="false" value="/usr/lib/jvm/java-11-openjdk/include/"/>
+                                                                                                       
+                                    <listOptionValue builtIn="false" value="/usr/lib/jvm/java-11-openjdk/include/linux"/>
+                                                                                               
+                                </option>
+                                                                                               
+                                <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.916135861" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+                                                                                       
+                            </tool>
+                                                                               
+                            <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.1473247311" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker"/>
+                                                                               
+                            <tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1834633481" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker">
+                                                                                               
+                                <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1443450015" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+                                                                                                       
+                                    <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+                                                                                                       
+                                    <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+                                                                                               
+                                </inputType>
+                                                                                       
+                            </tool>
+                                                                               
+                            <tool id="cdt.managedbuild.tool.gnu.cross.archiver.1273786909" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver"/>
+                                                                               
+                            <tool id="cdt.managedbuild.tool.gnu.cross.assembler.488925101" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler">
+                                                                                               
+                                <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1103553043" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+                                                                                       
+                            </tool>
+                                                                       
+                        </toolChain>
+                                                               
+                    </folderInfo>
+                                                       
+                    <sourceEntries>
+                                                                       
+                        <entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="jni"/>
+                                                               
+                    </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="Default">
+                               
+            <resource resourceType="PROJECT" workspacePath="/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>
index be973cdeea54e5d052cff1ad8563060f62210dde..764e6d1063c8b48996c0fbe47162676108dd3a07 100644 (file)
@@ -5,6 +5,12 @@
        <projects>
        </projects>
        <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+                       <triggers>clean,full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
                <buildCommand>
                        <name>org.eclipse.jdt.core.javabuilder</name>
                        <arguments>
                        <arguments>
                        </arguments>
                </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+                       <triggers>full,incremental,</triggers>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
        </buildSpec>
        <natures>
                <nature>org.eclipse.pde.PluginNature</nature>
                <nature>org.eclipse.jdt.core.javanature</nature>
+               <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>
diff --git a/org.argeo.api.uuid/.settings/language.settings.xml b/org.argeo.api.uuid/.settings/language.settings.xml
new file mode 100644 (file)
index 0000000..8c58356
--- /dev/null
@@ -0,0 +1,28 @@
+<?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 class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="471647395979135680" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+                                               
+                <language-scope id="org.eclipse.cdt.core.gcc"/>
+                                               
+                <language-scope id="org.eclipse.cdt.core.g++"/>
+                                       
+            </provider>
+                               
+            <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+                       
+        </extension>
+               
+    </configuration>
+    
+</project>
diff --git a/org.argeo.api.uuid/.settings/org.eclipse.cdt.core.prefs b/org.argeo.api.uuid/.settings/org.eclipse.cdt.core.prefs
new file mode 100644 (file)
index 0000000..c8ec5df
--- /dev/null
@@ -0,0 +1,6 @@
+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
diff --git a/org.argeo.api.uuid/META-INF/.gitignore b/org.argeo.api.uuid/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4c36ca9
--- /dev/null
@@ -0,0 +1 @@
+x86_64/
\ No newline at end of file
diff --git a/org.argeo.api.uuid/Makefile b/org.argeo.api.uuid/Makefile
new file mode 100644 (file)
index 0000000..093701f
--- /dev/null
@@ -0,0 +1,68 @@
+include ../sdk.mk
+
+NATIVE_PACKAGE=org_argeo_api_uuid
+TARGET_EXEC := libJava_$(NATIVE_PACKAGE).so
+
+SRC_DIRS := ./jni/$(NATIVE_PACKAGE)
+
+LDFLAGS=-shared -fPIC -Wl,-soname,$(TARGET_EXEC).$(MAJOR).$(MINOR)
+
+#
+# Generic Argeo
+#
+BUILD_DIR := ./generated
+META_INF_DIR := ./META-INF
+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
+
+.PHONY: clean all ide
+all: $(BUILD_DIR)/$(TARGET_EXEC)
+
+ide: $(META_INF_DIR)/$(ARCH)/$(TARGET_EXEC)
+
+$(META_INF_DIR)/$(ARCH)/$(TARGET_EXEC): $(BUILD_DIR)/$(TARGET_EXEC)
+       mkdir -p $(dir $@)
+       cp $(BUILD_DIR)/$(TARGET_EXEC) $(dir $@)
+
+# 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.
+$(BUILD_DIR)/$(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 $@
+
+clean:
+       rm -r $(BUILD_DIR)
+
+# 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)
\ No newline at end of file
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
new file mode 100644 (file)
index 0000000..2930397
--- /dev/null
@@ -0,0 +1 @@
+#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.h b/org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.h
new file mode 100644 (file)
index 0000000..bdf334a
--- /dev/null
@@ -0,0 +1,45 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_argeo_api_uuid_NativeUuidFactory */
+
+#ifndef _Included_org_argeo_api_uuid_NativeUuidFactory
+#define _Included_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 *, jobject);
+
+/*
+ * 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 *, jobject, jobject, jbyteArray);
+
+/*
+ * 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 *, jobject, jobject, jbyteArray);
+
+/*
+ * Class:     org_argeo_api_uuid_NativeUuidFactory
+ * Method:    randomUUIDStrong
+ * Signature: ()Ljava/util/UUID;
+ */
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_randomUUIDStrong
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#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
new file mode 100644 (file)
index 0000000..21e0eb1
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.api.uuid;
+
+import java.util.UUID;
+
+/** An {@link UuidFactory} based on a native library. */
+public class NativeUuidFactory implements UuidFactory, TypedUuidFactory {
+
+       @Override
+       public UUID get() {
+               return timeUUID();
+       }
+
+       @Override
+       public native UUID timeUUID();
+
+       @Override
+       public native UUID nameUUIDv5(UUID namespace, byte[] data);
+
+       @Override
+       public native UUID nameUUIDv3(UUID namespace, byte[] data);
+
+       @Override
+       public native UUID randomUUIDStrong();
+
+       @Override
+       public UUID randomUUIDWeak() {
+               throw new UnsupportedOperationException();
+       }
+
+}
diff --git a/sdk.mk b/sdk.mk
new file mode 100644 (file)
index 0000000..7a7e579
--- /dev/null
+++ b/sdk.mk
@@ -0,0 +1,2 @@
+MAJOR=2
+MINOR=3