在用Gradle构建的Java代码中使用C ++代码的正确方法是什么?

问题描述 投票:1回答:1

我一直在努力将Android本机Java代码库移植到使用等级构建的Plain Java应用程序中。

Android代码的build.gradle文件使用C ++代码,并且此依赖项已声明如下。

android {

    ...

    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
        }
    }
}

对于使用Gradle生成的Java应用程序执行此操作的正确方法是什么(我遵循this教程)

这是到目前为止我的build.grade文件的外观。

plugins {
    id 'java'
    id 'application'
}

repositories {
    jcenter()
}

dependencies {
    implementation 'com.google.guava:guava:28.0-jre'
    testImplementation 'junit:junit:4.12'
    implementation 'org.greenrobot:eventbus:3.1.1'

}

application {
    mainClassName = 'demo.App'
}

我正在使用Java 8,并且gradle版本是5.6.2,openjdk版本1.8.0_222

EDIT:环顾四周后,我知道可以使用JNI在Java中使用C ++。

但是在android studio中,Android项目可以在创建时配置为使用C ++。另外,该项目使用了makefile,不确定如何使用JNI来完成此操作

java android gradle makefile build.gradle
1个回答
0
投票

最后得到了它的工作,这是它的工作方式,假设我想从Java中执行System.loadLibrary(“ nativeCpp”)

步骤1:

将所有C ++代码移至src/nativeCpp/cpp/并删除CMAKE.txt文件。

步骤2:确保build.gradle如下所示:

plugins {
    id 'java'
    id 'application'
    id 'cpp'
}

repositories {
    jcenter()
}

dependencies {
    implementation 'com.google.guava:guava:28.0-jre'
    testImplementation 'junit:junit:4.12'        
}

application {
    mainClassName = 'demo.App'
}
run {
    systemProperty "java.library.path", file("${buildDir}/libs/nativeCpp/shared").absolutePath
}
model {
    platforms {
        x64 {
            architecture "x64"
        }
    }

    components {
        nativeCpp(NativeLibrarySpec) {


            binaries.all {
                cppCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
                cppCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/linux"
                cppCompiler.args '-fPIC'
            }

        }
    }
}

run.dependsOn  'nativeCppSharedLibrary'

说明: Gradle要求您将所有本机组件及其名称保存在src目录中,它引用此目录(在我的情况下为src / nativeApp)来构建您的本机代码。

当您使用gradle run执行运行任务时,要从build.gradle的run属性中选择要传递给语言编译器(在这种情况下为Java)的任何特殊指令。我想传递java.library.path以确保Java可以读取它,没有它,您将在构建期间得到java.lang.UnsatisfiedLinkError

接下来,我们在模型块内定义组件以及如何构建它们,binaries.all属性中的指令在命令行中转换为此:

gcc -I /usr/lib/jvm/java-1.8.0-openjdk-amd64/include -I /usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux -shared -o librendering.so native.cpp -fPIC

我们指定-I选项,以告诉gcc编译器JNI在我们系统上的位置。该路径可能因您而异。

这将编译您的C ++代码并将其存储在/libs/nativeCpp/shared可以找到它的run

© www.soinside.com 2019 - 2024. All rights reserved.