在gradle中定义javah任务的最佳方法

时间:2015-05-08 22:13:03

标签: java groovy gradle java-native-interface

我对gradle和groovy相当新。以下是生成JNI标头的任务:

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

mainClassName = "com.my.example.HelloG"

task GenerateJniHeaders(dependsOn: 'classes') << {
    def classpath = "build/classes/main"
    def nativeIncludes = "src/native/include"
    "javah -d ${nativeIncludes} -classpath ${classpath} ${mainClassName}".execute()
}
classes.finalizedBy GenerateJniHeaders
build.dependsOn GenerateJniHeaders

它运作正常,但我觉得它有点难看。我怎样才能改进它?我感谢任何建议,特别是那些帮我删除硬编码的变量的建议。我还想使这个任务更通用 - 现在它只为主类生成JNI头,但我想为所有java文件运行它。 此外,当此任务失败时(例如,类路径错误),它不会打印任何错误消息并构建成功,这会产生误导。

1 个答案:

答案 0 :(得分:14)

  1. Gradle的任务类型类型为 Exec ,并带有命令行属性,因此更适合使用它:

    task generateJniHeaders(type:Exec) {
        def classpath = sourceSets.main.output.classesDir
        def nativeIncludes = "src/native/include"                     
        commandLine "javah", "-d", nativeIncludes, "-classpath", classpath, "$mainClassName"
    
        dependsOn classes
    }
    

    请注意,这样一来,此任务中的所有内容都是配置而不是操作(如果您不熟悉Gradle的构建生命周期,那么建议的阅读将是 this 部分。

  2. build.dependsOn GenerateJniHeaders应替换为jar.dependsOn GenerateJniHeaders

  3. 根本不需要
  4. classes.finalizedBy。请注意,finalizedBy通常用于清理,即使任务失败也会执行。