diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7af9ea0..db31d99 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,6 +5,17 @@ on: push jobs: + linux-arm: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v1 + - uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'zulu' + - name: Build + run: bash build-linux-arm.sh linux: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0a17c8..8d2b31a 100755 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,8 +6,24 @@ on: - '*' jobs: + linux-arm: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v1 + - uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'zulu' + - name: Build + run: bash build-linux-arm.sh + - name: Upload math result for job Linux + uses: actions/upload-artifact@v4 + with: + name: linux-arm-lib + path: src/main/resources/linux-arm64/* linux: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v1 @@ -18,7 +34,7 @@ jobs: - name: Build run: bash build-linux.sh - name: Upload math result for job Linux - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: linux-lib path: src/main/resources/linux-x86_64/* @@ -37,7 +53,7 @@ jobs: - name: Build run: bash build-windows.sh - name: Upload math result for job Windows - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: win-lib path: src/main/resources/windows-x86_64/* @@ -54,13 +70,13 @@ jobs: - name: Build run: bash build-mac.sh - name: Upload math result for job Mac - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: mac-lib path: src/main/resources/macosx-x86_64/* publish: runs-on: ubuntu-latest - needs: [macos,windows,linux] + needs: [macos,windows,linux,linux-arm] permissions: contents: write packages: write @@ -82,18 +98,22 @@ jobs: echo $VERSION_SEMVER echo ${{ steps.vars.outputs.tag }} - name: Download math result for job Windows - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: win-lib path: src/main/resources/windows-x86_64/ - + - name: Download math result for job Linux Arm + uses: actions/download-artifact@v4 + with: + name: linux-arm-lib + path: src/main/resources/linux-arm64/ - name: Download math result for job Linux - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: linux-lib path: src/main/resources/linux-x86_64/ - name: Download math result for job Mac - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: mac-lib path: src/main/resources/macosx-x86_64/ diff --git a/build-linux-arm.sh b/build-linux-arm.sh new file mode 100755 index 0000000..bfd4fad --- /dev/null +++ b/build-linux-arm.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +echo "Linux Arm Build" +VER=$(cat mujocoRelease.txt) +TYPE=linux-arm64 +ARCHIVE=mujoco-$VER-linux-aarch64.tar.gz +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +JAVADIR=$SCRIPT_DIR/src/main/java/ + +BUILDDIR=$SCRIPT_DIR/cppbuild +if [ -f "$SCRIPT_DIR/$ARCHIVE" ]; then + echo "$ARCHIVE exists." +else + wget https://github.com/deepmind/mujoco/releases/download/$VER/$ARCHIVE -O $SCRIPT_DIR/$ARCHIVE +fi +rm -rf $SCRIPT_DIR/cppbuild +mkdir -p $BUILDDIR +cd $BUILDDIR +tar -xf $SCRIPT_DIR/$ARCHIVE +mv $BUILDDIR/mujoco-$VER $BUILDDIR/mujoco/ +rm $BUILDDIR/mujoco/lib/libmujoco.so +mv $BUILDDIR/mujoco/lib/libmujoco.so.$VER $BUILDDIR/mujoco/lib/libmujoco.so +mv $BUILDDIR/mujoco/lib/* $JAVADIR/ +mv $BUILDDIR/mujoco/include/mujoco $JAVADIR/ + +cd $SCRIPT_DIR/ + + +set -e +JAVACPP_VER=1.5.7 +JAVACPP=javacpp-platform-$JAVACPP_VER-bin.zip +if [ -f "$JAVACPP" ]; then + echo "$JAVACPP exists." +else + wget https://github.com/bytedeco/javacpp/releases/download/$JAVACPP_VER/$JAVACPP -O $JAVACPP + unzip $JAVACPP +fi +echo "Include" +ls $JAVADIR/mujoco/ +echo "Lib" +ls $BUILDDIR/ +cd $JAVADIR + +echo "JavaCPP configs:" +$JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -Dcompiler.includepath=$BUILDDIR/include/ -print properties.includepath + +$JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar org/mujoco/MuJoCoConfig.java +echo "Start compile \n\n" +$JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -copylibs -copyresources -Xcompiler "-no-pie" -Xcompiler "-I$JAVADIR" -Xcompiler "-L$JAVADIR" org/mujoco/MuJoCoLib.java +LIBPATH=$PWD/../resources/$TYPE/ +mkdir -p $SCRIPT_DIR/src/main/resources/ + +rm -rf $JAVADIR../resources/$TYPE +mv $JAVADIR/org/mujoco/$TYPE/ $JAVADIR../resources/ +mv $JAVADIR/libmujoco.so $JAVADIR../resources/$TYPE/ +rm -rf $JAVADIR/mujoco +echo "ls -al $JAVADIR../resources/" +ls -al $JAVADIR../resources/ + +cd $SCRIPT_DIR/ +echo "Resources: " +ls -al $JAVADIR../resources/$TYPE +#mv $BUILDDIR/mujoco/ $BUILDDIR/mujoco-back/ +./gradlew jar --stacktrace test +#mv $BUILDDIR/mujoco-back/ $BUILDDIR/mujoco/ + + diff --git a/build-linux.sh b/build-linux.sh index 96177fb..fa1f0bb 100755 --- a/build-linux.sh +++ b/build-linux.sh @@ -45,6 +45,7 @@ echo "JavaCPP configs:" $JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -Dcompiler.includepath=$BUILDDIR/include/ -print properties.includepath $JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar org/mujoco/MuJoCoConfig.java + echo "Start compile \n\n" $JAVA_HOME/bin/java -jar $SCRIPT_DIR/javacpp-platform-$JAVACPP_VER-bin/javacpp.jar -copylibs -copyresources -Xcompiler "-no-pie" -Xcompiler "-I$JAVADIR" -Xcompiler "-L$JAVADIR" org/mujoco/MuJoCoLib.java LIBPATH=$PWD/../resources/$TYPE/ diff --git a/build.gradle b/build.gradle index 8d624f1..05bc321 100755 --- a/build.gradle +++ b/build.gradle @@ -24,16 +24,28 @@ dependencies { implementation group: 'org.bytedeco', name: 'javacpp', version: '1.5.7' // https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1' - implementation 'net.codesup.util:jaxb2-rich-contract-plugin:2.1.0' - -} + implementation 'net.codesup.util:jaxb2-rich-contract-plugin:2.1.0' + + //Java17 update + // JAXB API + implementation 'javax.xml.bind:jaxb-api:2.3.1' + + // JAXB Implementation + implementation 'com.sun.xml.bind:jaxb-impl:2.3.1' + // JAXB Core + implementation 'com.sun.xml.bind:jaxb-core:2.3.0.1' -if(JavaVersion.current() != JavaVersion.VERSION_1_8){ - throw new GradleException("This build must be run with java 8") + // Java Activation needed by JAXB + implementation 'javax.activation:javax.activation-api:1.2.0' } +//if(JavaVersion.current() != JavaVersion.VERSION_1_8){ +// throw new GradleException("This build must be run with java 8") +//} + + group='com.neuronrobotics' archivesBaseName='mujoco-java' version = System.getenv("VERSION_SEMVER") diff --git a/mujocoRelease.txt b/mujocoRelease.txt index ff365e0..711ee4f 100755 --- a/mujocoRelease.txt +++ b/mujocoRelease.txt @@ -1 +1 @@ -3.1.3 +3.1.3 \ No newline at end of file diff --git a/src/main/java/com/kscs/util/jaxb/PartialCopyable.java b/src/main/java/com/kscs/util/jaxb/PartialCopyable.java index 41cf869..184426c 100644 --- a/src/main/java/com/kscs/util/jaxb/PartialCopyable.java +++ b/src/main/java/com/kscs/util/jaxb/PartialCopyable.java @@ -32,7 +32,7 @@ public interface PartialCopyable> { /** * Clones this instances partially, the parts - * will be defined by propertyTree + * will be defined by propertyTree * * @param propertyTree Defines which parts of the object tree will be cloned or excluded * @param propertyTreeUse Defines how the clone graph will be used: To include or to exclude properties. @@ -42,7 +42,7 @@ public interface PartialCopyable> { /** * Clones this instances partially, the parts - * to be EXCLUDED will be defined by propertyTree + * to be EXCLUDED will be defined by propertyTree * * @param propertyTree Defines which parts of the object tree will be excluded * @return A copy of the original object. @@ -51,7 +51,7 @@ public interface PartialCopyable> { /** * Clones this instances partially, the parts - * to be INCLUDED will be defined by propertyTree, + * to be INCLUDED will be defined by propertyTree, * all other parts will be excluded. * * @param propertyTree Defines which parts of the object tree will be included in the clone diff --git a/src/main/java/org/mujoco/MuJoCoConfig.java b/src/main/java/org/mujoco/MuJoCoConfig.java index c849595..4a691eb 100755 --- a/src/main/java/org/mujoco/MuJoCoConfig.java +++ b/src/main/java/org/mujoco/MuJoCoConfig.java @@ -1,49 +1,94 @@ package org.mujoco; - import org.bytedeco.javacpp.*; import org.bytedeco.javacpp.annotation.*; import org.bytedeco.javacpp.tools.*; - @Properties( - value = { - @Platform( - includepath = {"/tmp/mujoco/include/"}, - linkpath = {"/tmp/mujoco/lib/"}, - include = { - "mujoco/mjtnum.h", - - "mujoco/mjexport.h", - "mujoco/mujoco.h" , - "mujoco/mjmacro.h", - "mujoco/mjthread.h", - "mujoco/mjdata.h", - "mujoco/mjmodel.h", - "mujoco/mjrender.h", - "mujoco/mjui.h", - "mujoco/mjvisualize.h", - - - //"mujoco/mjxmacro.h", - "mujoco/mjplugin.h" - }, - link = {"mujoco"} - ), - @Platform( - value = "windows-x86_64", - includepath = {"mujoco/include/","C:/Users/runneradmin/AppData/Local/Temp/mujoco/include/"}, - linkpath = {"mujoco/lib/","C:/Users/runneradmin/AppData/Local/Temp/mujoco/lib/"} - ) - }, - target = "org.mujoco.MuJoCoLib" -) + value = { + @Platform( + includepath = { "/tmp/mujoco/include/" }, + linkpath = { "/tmp/mujoco/lib/" }, + + include = { + "mujoco/mjtnum.h", + + "mujoco/mjexport.h", "mujoco/mujoco.h", "mujoco/mjmacro.h", "mujoco/mjthread.h", "mujoco/mjdata.h", + "mujoco/mjmodel.h", "mujoco/mjrender.h", "mujoco/mjui.h", "mujoco/mjvisualize.h", + + "mujoco/mjplugin.h", + //"mujoco/mjspec.h", + // "mujoco/mjxmacro.h" // This will not work with JavaCPP + }, + link = { + "mujoco" + } + ) + , + @Platform(value = "windows-x86_64", + includepath = { "mujoco/include/", + "C:/Users/runneradmin/AppData/Local/Temp/mujoco/include/" }, + linkpath = { "mujoco/lib/", + "C:/Users/runneradmin/AppData/Local/Temp/mujoco/lib/" }) }, + target = "org.mujoco.MuJoCoLib") public class MuJoCoConfig implements InfoMapper { public void map(InfoMap infoMap) { - infoMap.put(new Info("MJ_STATIC").define(true)); + + infoMap.put(new Info("MJ_STATIC").define(true)); infoMap.put(new Info("mjtNum").cast().valueTypes("double").pointerTypes("DoublePointer")); +// infoMap.put(new Info("mjString") +// .cast() +// .valueTypes("@StdString String") +// .pointerTypes("@StdString BytePointer")); + // Define mjString as an opaque pointer type to avoid direct conversions + // Add this to your JavaCPP configuration + //infoMap.put(new Info().define("mjString std::string")); + + // Then skip the mjString type and use String/BytePointer directly +// infoMap.put(new Info("mjString").skip()); +// infoMap.put(new Info("std::string").annotations("@StdString").pointerTypes("BytePointer").valueTypes("String")); + + // Handle mjString (std::string) + infoMap.put(new Info("mjString").skip()); + infoMap.put(new Info("std::string").annotations("@StdString").pointerTypes("BytePointer").valueTypes("String")); + + // Handle mjStringVec (std::vector) + infoMap.put(new Info("mjStringVec").skip()); + infoMap.put(new Info("std::vector").pointerTypes("StringVector").valueTypes("StringVector")); + + // Handle mjIntVec (std::vector) + infoMap.put(new Info("mjIntVec").skip()); + infoMap.put(new Info("std::vector").pointerTypes("IntPointer").valueTypes("IntBuffer")); + + // Handle mjIntVecVec (std::vector >) + infoMap.put(new Info("mjIntVecVec").skip()); + infoMap.put(new Info("std::vector< std::vector >").pointerTypes("PointerPointer")); + + // Handle mjFloatVec (std::vector) + infoMap.put(new Info("mjFloatVec").skip()); + infoMap.put(new Info("std::vector").pointerTypes("FloatPointer").valueTypes("FloatBuffer")); + + // Handle mjFloatVecVec (std::vector >) + infoMap.put(new Info("mjFloatVecVec").skip()); + infoMap.put(new Info("std::vector< std::vector >").pointerTypes("PointerPointer")); + + // Handle mjDoubleVec (std::vector) + infoMap.put(new Info("mjDoubleVec").skip()); + infoMap.put(new Info("std::vector").pointerTypes("DoublePointer").valueTypes("DoubleBuffer")); + + // Handle mjByteVec (std::vector) + infoMap.put(new Info("mjByteVec").skip()); + infoMap.put(new Info("std::vector").pointerTypes("BytePointer").valueTypes("ByteBuffer")); + // For unsigned char: +// infoMap.put(new Info("mjByteVec").skip()); +// infoMap.put(new Info("std::vector").pointerTypes("BytePointer").valueTypes("ByteBuffer")); + // mjString + // infoMap.put(new + // Info("mjString").cast().valueTypes("String").pointerTypes("StringPointer")); + // Skip mjString type + infoMap.put(new Info("MJOPTION_VECTORS").skip()); infoMap.put(new Info("MJMODEL_POINTERS").skip()); infoMap.put(new Info("MJDATA_VECTOR").skip()); @@ -71,10 +116,10 @@ public void map(InfoMap infoMap) { infoMap.put(new Info("mjEXTERNC").skip()); infoMap.put(new Info("mjDLLMAIN").skip()); infoMap.put(new Info("XMJV").skip()); - //infoMap.put(new Info("X").skip()); - //infoMap.put(new Info("MJOPTION_FLOATS").skip()); - //infoMap.put(new Info("MJOPTION_INTS").skip()); - //infoMap.put(new Info("MJOPTION_SCALARS").skip()); + // infoMap.put(new Info("X").skip()); + // infoMap.put(new Info("MJOPTION_FLOATS").skip()); + // infoMap.put(new Info("MJOPTION_INTS").skip()); + // infoMap.put(new Info("MJOPTION_SCALARS").skip()); infoMap.put(new Info("mjPLUGIN_LIB_INIT").skip()); infoMap.put(new Info("mjfPluginLibraryLoadCallback").skip()); infoMap.put(new Info("mjfGeneric").skip()); @@ -83,13 +128,28 @@ public void map(InfoMap infoMap) { infoMap.put(new Info("mjfTime").skip()); infoMap.put(new Info("mjfAct").skip()); infoMap.put(new Info("mjfCollision").skip()); - //mj__freeStack + // mj__freeStack infoMap.put(new Info("mj__freeStack").skip()); - //mj__markStack + // mj__markStack infoMap.put(new Info("mj__markStack").skip()); + + // XNV + infoMap.put(new Info("XNV").skip()); + // mjs_findElement + infoMap.put(new Info("mjs_findElement").skip()); + + // mjs_firstElement + infoMap.put(new Info("mjs_firstElement").skip()); + // mjs_firstChild + infoMap.put(new Info("mjs_firstChild").skip()); + // mjSpec_modelfiledir + infoMap.put(new Info("mjs_setString").skip()); + infoMap.put(new Info("mjs_getString").skip()); + //modelname + + infoMap.put(new Info("modelname").skip()); + //modelfiledir + infoMap.put(new Info("modelfiledir").skip()); -// infoMap.put(new Info("").skip()); -// infoMap.put(new Info("").skip()); - - } + } } \ No newline at end of file diff --git a/src/test/java/mujoco/java/MuJoColibTest.java b/src/test/java/mujoco/java/MuJoColibTest.java index 67cde9d..8e6cb57 100755 --- a/src/test/java/mujoco/java/MuJoColibTest.java +++ b/src/test/java/mujoco/java/MuJoColibTest.java @@ -8,18 +8,11 @@ import java.io.File; import java.util.HashMap; -import org.bytedeco.javacpp.BytePointer; -import org.bytedeco.javacpp.IntPointer; -import org.bytedeco.javacpp.Pointer; import org.junit.Test; import org.mujoco.IMujocoController; import org.mujoco.MuJoCoLib; -import org.mujoco.MuJoCoLib.mjData; import org.mujoco.MuJoCoLib.mjData_; -import org.mujoco.MuJoCoLib.mjModel; import org.mujoco.MuJoCoLib.mjModel_; -import org.mujoco.MuJoCoLib.mjOption_; -import org.mujoco.MuJoCoLib.mjVFS; import org.mujoco.MuJoCoModelManager; public class MuJoColibTest {