如何解决将 JNI 与 Gradle和 lombok一起使用
我正在尝试将我的 Java 应用程序连接到我编写的 C++ 代码。
我从在线教程中收集到的是:
- 您使用带有
javac
标志的-h
为具有本机方法的类生成 c/c++ 标头 - 然后您将生成的头文件导入您的 c/c++ 应用程序并实现它们
- 您将实现的应用构建为动态库文件
- 您将构建的库文件放在 java libs 路径中(无论它在哪里)
- 然后添加静态
System.loadLibrary
调用以加载到构建的库中,因此现在您可以使用本机函数 - 由您的库实现。
我遇到问题的第一步是第 1 步 - 我遇到了大量关于依赖项的编译错误,所以我在网上搜索了一些关于如何在 gradle 中使用 JNI - 而不是纯 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 代码生成没有为此任务完成。可以这样做吗?
解决方法
像这样为编译配置注解处理器:
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注解,可以正常生成头文件
,您可以尝试通过添加编译器参数 -processorpath path/to/lombok.jar
来强制 lombok 运行。
如果这个特定任务的重点是只是生成头文件而不是别的,另一种选择是首先让 lombok delombok 将所有源文件放入一个临时目录,然后在其上运行 javac。也许有点激烈。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。