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
库文件的示例?