java—将jni与gradle(和lombok)结合使用

4dc9hkyq  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(384)

我正在尝试将我的java应用程序连接到我编写的c代码中。
我从在线教程中收集到的是:
你用 javac-h 为具有本机方法的类生成c/c
头的标志
然后将生成的头文件导入c/c++应用程序并实现它们
将实现的应用程序构建到动态库文件中
将构建的库文件放在javalibs路径中(不管它在哪里)
然后添加一个静态 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代码生成并不是为这个任务完成的。有可能这样做吗?

cqoc49vn

cqoc49vn1#

您可以尝试通过添加编译器参数来强制lombok运行 -processorpath path/to/lombok.jar .
如果这个特殊任务的目的只是生成头文件而不是别的什么,那么另一个选择是首先让lombok-delombok将所有源代码放到tempdir中,然后在此基础上运行javac。也许有点激烈。

vsaztqbk

vsaztqbk2#

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

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注解并正确生成头文件

相关问题