在 Gradle 项目中设置 JNI 开发
IntelliJ IDEA 支持 在 Gradle 中进行 JNI 开发 项目。
本教程使用 Java 1.8 和 Gradle 7.4 版本。 教程使用了 软件模型。
如果您想使用 replacement plugins ,您可以查看 JNI Sample项目。
添加 JNI 支持
请打开 build.gradle 文件。
请将以下代码添加到 build.gradle :
import org.gradle.internal.jvm.Jvm plugins { id 'java' id 'application' id 'c' } mainClassName = 'HelloWorld' repositories { mavenCentral() } dependencies { testImplementation 'junit:junit:4.12' } sourceCompatibility = 1.8 targetCompatibility = 1.8 application { applicationDefaultJvmArgs = ["-Djava.library.path=" + file("${buildDir}/libs/hello/shared").absolutePath] } model { platforms { x64 { architecture "x86_64" } } components { hello(NativeLibrarySpec) { targetPlatform "x64" binaries.all { def jvmHome = Jvm.current().javaHome if (targetPlatform.operatingSystem.macOsX) { cCompiler.args '-I', "${jvmHome}/include" cCompiler.args '-I', "${jvmHome}/include/darwin" cCompiler.args '-mmacosx-version-min=10.4' linker.args '-mmacosx-version-min=10.4' } else if (targetPlatform.operatingSystem.linux) { cCompiler.args '-I', "${jvmHome}/include" cCompiler.args '-I', "${jvmHome}/include/linux" cCompiler.args '-D_FILE_OFFSET_BITS=64' } else if (targetPlatform.operatingSystem.windows) { cCompiler.args "-I${jvmHome}/include" cCompiler.args "-I${jvmHome}/include/win32" } else if (targetPlatform.operatingSystem.freeBSD) { cCompiler.args '-I', "${jvmHome}/include" cCompiler.args '-I', "${jvmHome}/include/freebsd" } } } } } classes.dependsOn 'helloSharedLibrary'import org.gradle.internal.jvm.Jvm plugins { id 'java' id 'application' id 'c' } mainClassName = 'HelloWorld' repositories { mavenCentral() } dependencies { testImplementation 'junit:junit:4.12' } sourceCompatibility = 1.8 targetCompatibility = 1.8 application { applicationDefaultJvmArgs = ["-Djava.library.path=" + file("${buildDir}/libs/hello/shared").absolutePath] } model { platforms { x64 { architecture "x86_64" } } components { hello(NativeLibrarySpec) { targetPlatform "x64" binaries.all { def jvmHome = Jvm.current().javaHome if (targetPlatform.operatingSystem.macOsX) { cCompiler.args '-I', "${jvmHome}/include" cCompiler.args '-I', "${jvmHome}/include/darwin" cCompiler.args '-mmacosx-version-min=10.9' linker.args '-mmacosx-version-min=10.9' linker.args '-stdlib=libc++' } else if (targetPlatform.operatingSystem.linux) { cCompiler.args '-I', "${jvmHome}/include" cCompiler.args '-I', "${jvmHome}/include/linux" cCompiler.args '-D_FILE_OFFSET_BITS=64' } else if (targetPlatform.operatingSystem.windows) { cCompiler.args "-I${jvmHome}/include" cCompiler.args "-I${jvmHome}/include/win32" } else if (targetPlatform.operatingSystem.freeBSD) { cCompiler.args '-I', "${jvmHome}/include" cCompiler.args '-I', "${jvmHome}/include/freebsd" } } } } } classes.dependsOn 'helloSharedLibrary'为了使您的设置顺利进行,请注意以下细节:
IntelliJ IDEA 使用位于 Gradle 设置中的 Gradle JVM 版本。
根据您的操作系统,编译器参数可能会有所不同,注意在更改
cCompiler.args和linker.args时的 build.gradle 。当应用程序在具有以下现有系统属性的情况下运行时:
application { applicationDefaultJvmArgs = ["-Djava.library.path=" + file("${buildDir}/libs/hello/shared").absolutePath] }此应用程序依赖
classes.dependsOn 'helloSharedLibrary',IntelliJ IDEA 为 项目 工具窗口中的共享库生成二进制 libhello.dylib 文件。
在 项目 工具窗口中,选择 src | java 目录。
右键点击 java 目录并选择 以创建一个将使用
C代码的 Java 类HelloWorld。在编辑器中打开创建的
HelloWorld类,然后输入以下代码:class HelloWorld { public native void print(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().print(); } }文件中指定的代码将加载生成的 system library。
在 项目 工具窗口,在 源 目录中,创建 hello/c/hello.c 文件,这是用于您的
C程序的文件。在编辑器中打开 hello.c 文件,并指定以下代码:
#include <jni.h> #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("Hello From C++ World!\n"); return; }
此时,您可以根据需要开始使用原生代码进一步开发您的应用程序。
运行您的应用程序
打开您的运行配置对话框。
如果您使用 macOS 作为您的操作系统,请将以下代码添加到 虚拟机选项 字段。

可以从 修改选项 列表中添加 VM options 字段。
请点击 OK 以保存更改。
请点击
工具栏。