在Gradle项目中设置JNI开发
最后修改时间:2023 年 4 月 16 日IntelliJ IDEA 支持Gradle 项目中的 JNI 开发。
本教程使用Java 1.8和Gradle 7.4版本。本教程使用软件模型。
如果你想使用替换插件,你可以查看JNI Sample项目。
笔记
如果您在项目中使用 Kotlin,请查看Kotlin 教程。
添加 JNI 支持
打开build.gradle文件。
将以下代码添加到build.gradle:
在 Windows 上运行在 macOS 上运行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] }
并且此应用程序依赖于IntelliJ IDEA 在项目工具窗口中为共享库
classes.dependsOn 'helloSharedLibrary'
生成二进制libhello.dylib文件。笔记
请注意,libhello.dylib取决于您所拥有的操作系统。例如,对于 Windows,二进制文件的名称将为hello.dll。
在项目工具窗口中,选择src | java目录。
右键单击java目录并选择新建| Java 类创建
HelloWorld
将使用C
代码的 Java 类。在编辑器中打开创建的
HelloWorld
类并输入以下代码:class HelloWorld { public native void print(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().print(); } }
文件中指定的代码将加载生成的系统库。
在“项目”工具窗口的src目录中,创建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 选项字段。
可以从“修改选项”列表中添加 VM 选项字段。
单击“确定”保存更改。
单击主工具栏上的 。
感谢您的反馈意见!