Java 使用Gradle编译C JNI 我有一个构建文件。我试图用它来构建JNI实例,我一直在使用Gradle,但是有很多C++例子,C的例子不多。 我试图实现的是一个设置,在这个设置中,我可以将任意数量的.c和.h文件添加到我的应用程序中,并使用Gradle编译这些文件并创建一个或多个.so库文件 我知道我的建筑。格拉德尔错了,但我不知道该怎么办,我在JNI的C++方面发现了很多东西,但没有发现C.

Java 使用Gradle编译C JNI 我有一个构建文件。我试图用它来构建JNI实例,我一直在使用Gradle,但是有很多C++例子,C的例子不多。 我试图实现的是一个设置,在这个设置中,我可以将任意数量的.c和.h文件添加到我的应用程序中,并使用Gradle编译这些文件并创建一个或多个.so库文件 我知道我的建筑。格拉德尔错了,但我不知道该怎么办,我在JNI的C++方面发现了很多东西,但没有发现C.,java,c,eclipse,gradle,java-native-interface,Java,C,Eclipse,Gradle,Java Native Interface,我当前的项目结构如下所示: project/ ├──src/ └── com/ └── example/ └── subProjectExample1 └── HelloJNI.java └── subProjectExample2 └── main.java └── main/ ├── c └── HelloJNI.c

我当前的项目结构如下所示:

project/
├──src/
   └── com/
       └── example/
           └── subProjectExample1
               └── HelloJNI.java
           └── subProjectExample2
               └── main.java
   └── main/
       ├── c
           └── HelloJNI.c
       ├── headers
           └── com.example_HelloJNI.h
格雷德尔先生

allprojects {
    apply plugin "java"
    apply plugin "c"
    apply plugin "eclipse"
}
subprojects {
    apply plugin "java"
    repositories {
        jcenter()
    }
}

project(':example1') {
    dependencies {
    }
}   

project(':example2') {
    dependencies {
        compile project(':example1')
    }
}   

model {
    repositories {
        libs(PrebuiltLibraries) {
            jdk {
                headers.srcDirs "${System.properties['java.home']}/../include", 
                    "${System.properties['java.home']}/../include/linux"
            }
        }
    }
    platforms {
       linux64 {
        operatingSystem "linux"
           architecture "x86_64"
       }
    }
    toolchains {
        gcc(Gcc) {
            eachPlatform {
                cCompiler.executable = "/usr/bin/gcc"
            }
        }
    }
    components {
        main(NativeLibrarySpec) {
            sources {
                c {
                    source {
                        srcDir "src/main/c"
                        include "**/*.c"
                    }
                    exportedHeaders {
                        srcDir "src/main/headers"
                    }
                }
            }
        }
    }
}
我正在使用这些文件中的
/gradlew main可执行文件运行此程序

我得到的output.txt是:

HelloJNI.c: fatal error: jni.h: No such file or directory

 #include "jni.h"
                 ^   
compilation terminated.

error: command 'gcc' failed with exit status 1
仅供参考,我在Eclipse中使用Gradle 5.6.2版

编辑:

我补充了以下内容:

repositories {
        libs(PrebuiltLibraries) {
            jdk {
                headers.srcDirs "${System.properties['java.home']}/../include", 
                    "${System.properties['java.home']}/../include/linux"
            }
        }
    }

但我还是犯了同样的错误

您需要将JNI头添加到gradle文件的include路径(通常可以在
$JAVA_HOME/include
中找到)可能重复的道歉@Botje,我上传了以前版本的
build.gradle
文件。我确实让它通过编译器使用
$JAVA_HOME/include
,但我希望能够更改构建脚本,以便稍后通过Docker部署它,甚至包括windows支持,以便修复是临时的。你可能比从@Botje获得灵感更糟糕。非常感谢这个例子。我现在已经开始构建
.o
文件了,但是你有没有关于如何创建
.so
库文件的示例?