将JNI与Gradle(和lombok)一起使用 我试图连接我的java应用程序来编写C++代码。

将JNI与Gradle(和lombok)一起使用 我试图连接我的java应用程序来编写C++代码。,java,gradle,java-native-interface,lombok,Java,Gradle,Java Native Interface,Lombok,我从在线教程中收集到的信息是: 使用带有-h标志的javac为使用本机方法的类生成c/c++头 然后将生成的头导入到c/c++应用程序中并实现它们 将实现的应用程序构建到动态库文件中 将构建的库文件放置在java libs路径中(无论它在哪里) 然后添加一个staticSystem.loadLibrary调用,以加载到构建的库中,因此现在可以使用由库实现的本机函数 我遇到麻烦的第一步是第1步——我收到了大量关于依赖项的编译错误,因此我在网上搜索了如何将JNI与gradle结合使用——而不仅仅是

我从在线教程中收集到的信息是:

  • 使用带有
    -h
    标志的
    javac
    为使用本机方法的类生成c/c++头
  • 然后将生成的头导入到c/c++应用程序中并实现它们
  • 将实现的应用程序构建到动态库文件中
  • 将构建的库文件放置在java libs路径中(无论它在哪里)
  • 然后添加一个static
    System.loadLibrary
    调用,以加载到构建的库中,因此现在可以使用由库实现的本机函数

  • 我遇到麻烦的第一步是第1步——我收到了大量关于依赖项的编译错误,因此我在网上搜索了如何将JNI与gradle结合使用——而不仅仅是纯java编译器,我发现了这个任务:

    task generateJniHeaders(type: JavaCompile) {
        classpath = sourceSets.main.compileClasspath
        destinationDir file("${buildDir}/generated/jni")
        source = sourceSets.main.java
        options.compilerArgs += [
                '-h', file("${buildDir}/generated/jni"),
                '-d', file("${buildDir}/generated/jni-tmp")
        ]
        // options.verbose = true
        doLast {
            delete file("${buildDir}/generated/jni-tmp")
        }
    }
    
    这个任务似乎很有效,但现在我遇到的问题是它无法通过lombok注释编译;例如,我得到了一个由lombok生成的getter函数的未找到符号


    我已经正确地设置了lombok-我的正常gradle构建工作正常-但是我假设lombok代码生成没有针对这个任务完成。可以这样做吗?

    您可以尝试通过将编译器arg
    -processorpath/to/lombok.jar
    来强制运行lombok


    如果这个特殊任务的目的只是生成头文件而不是其他文件,那么另一个选择是首先让lombok将所有源代码都放到tempdir中,然后在此基础上运行javac。可能有点夸张。

    为编译配置注释处理器,如下所示:

    dependencies {
        annotationProcessor 'org.projectlombok:lombok'
        // ... 
    }
    
    task generateJniHeaders(type: JavaCompile) {
        classpath = sourceSets.main.compileClasspath
        destinationDir file("${buildDir}/generated/jni")
        source = sourceSets.main.java
        options.compilerArgs += [
                '-h', file("${buildDir}/generated/jni"),
                '-d', file("${buildDir}/generated/jni-tmp")
        ]
        
        options.annotationProcessorPath = configurations.annotationProcessor
        // ^^^^ use the configured annotation processor ^^^^
        
        doLast {
            delete file("${buildDir}/generated/jni-tmp")
        }
    }
    

    现在将处理lombok注释,并且可以正确生成头文件

    如何生成后者?我觉得在本地gradle deps路径中硬编码lombok jar文件会很奇怪,您必须执行
    java-jar path/to/lombok.jar delombok[args for delombok]
    ,我想这也有点奇怪。javadoc也是如此,也许一些搜索“gradle delombok”的网站展示了一些例子,希望能在没有大量硬编码JAR路径的情况下实现