首页 > 解决方案 > 如何设置使用 Java 和本机 C++ 代码的 Gradle 项目?

问题描述

我正在学习如何创建一个 Gradle 项目,在该项目中我想使用 JNI 从 Java 调用本机 C++ 代码。我正在关注这个 JetBrains教程,该教程对我来说效果很好,我对此有所了解。

但是本教程中的项目使用 C 本机代码,但我想改用 C++。问题是我尝试了几种方法,但老实说,我不知道我在做什么。我的尝试以一个问题结束,即如果我构建项目,则不会构建库(.dll 对我来说,因为我使用的是 Windows)。我没有收到错误消息,dll 就像我用 C 构建它一样存在。

我应该如何修改 build.gradle 以构建 C++ 本机代码而不是 C?

为我工作的 build.gradle(但使用 C,我想更改)如下所示:

apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'c'

mainClassName = 'HelloWorld'

repositories {
    mavenCentral()
}
dependencies {
    testCompile('junit:junit:4.12')
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

test {
    systemProperty "java.library.path", file("${buildDir}/libs/hello/shared").absolutePath
}

model {
    platforms {
        x64 {
            architecture "x64"
        }
    }

    components {
        hello(NativeLibrarySpec) {
            targetPlatform "x64"
            binaries.all {
                if (targetPlatform.operatingSystem.macOsX) {
                    cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
                    cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/darwin"
                    cCompiler.args '-mmacosx-version-min=10.4'
                    linker.args '-mmacosx-version-min=10.4'
                } else if (targetPlatform.operatingSystem.linux) {
                    cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
                    cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/linux"
                    cCompiler.args '-D_FILE_OFFSET_BITS=64'
                } else if (targetPlatform.operatingSystem.windows) {
                    cCompiler.args "-I${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
                    cCompiler.args "-I${org.gradle.internal.jvm.Jvm.current().javaHome}/include/win32"
                    linker.args "Shlwapi.lib", "Advapi32.lib"
                } else if (targetPlatform.operatingSystem.freeBSD) {
                    cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
                    cCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/freebsd"
                }
            }
        }
    }
}

test.dependsOn 'helloSharedLibrary'

标签: javac++gradlejava-native-interface

解决方案


推荐阅读