def cDir = new File(rootProject.projectDir.absolutePath, 'src/main/c') class JNIPlatform { String name String[] cmakeArgs String libExtension JNIPlatform(String name, String libExtension, File rootDir) { this.name = name this.cmakeArgs = ["-DCMAKE_TOOLCHAIN_FILE=${rootDir.absolutePath}/cmake/${name}-toolchain.cmake"] as String[] this.libExtension = libExtension } } JNIPlatform[] jniPlatforms = [ new JNIPlatform("linux-x86_64", ".so", rootDir), new JNIPlatform("linux-x86", ".so", rootDir), new JNIPlatform("linux-armhf", ".so", rootDir), new JNIPlatform("linux-arm64", ".so", rootDir), new JNIPlatform("windows-x86_64", ".dll", rootDir), new JNIPlatform("windows-x86", ".dll", rootDir) ] task cleanJNI {} task compileJNI {} for (JNIPlatform platform : jniPlatforms) { def buildDir = new File(cDir, "build-${platform.name}") if (!buildDir.exists()) { buildDir.mkdir() } tasks.create(name: "cmake-${platform.name}", group: 'jni', type: Exec) { workingDir buildDir executable 'cmake' args platform.cmakeArgs + ['..'] } tasks.create(name: "compileJNI-${platform.name}", group: 'jni', type: Exec) { workingDir buildDir executable 'make' dependsOn tasks.getByName("cmake-${platform.name}") } compileJNI.dependsOn tasks.getByName("compileJNI-${platform.name}") tasks.create(name: "cleanJNI-${platform.name}", group: 'jni', type: Delete) { delete buildDir.absolutePath } cleanJNI.dependsOn tasks.getByName("cleanJNI-${platform.name}") } clean.dependsOn cleanJNI processResources.dependsOn compileJNI processResources { for (JNIPlatform platform : jniPlatforms) { def buildDir = new File(cDir, "build-${platform.name}") if (!buildDir.exists()) { buildDir.mkdir() } def file = new File(buildDir, 'libscriptcraft' + platform.libExtension) inputs.files file from(file.absolutePath) { into new File('natives', platform.name).path } } }