【发布时间】:2019-01-22 22:19:05
【问题描述】:
我有一个使用 JNI 的 Java 应用程序,我正在使用 gradle 构建 C++ 共享库,其中包含我作为 JNI 的一部分加载的代码。 C++ 构建是根构建的子项目。我可以从我的根项目的run 或jar 任务中依赖:jnisubproject:assembleRelease,这确实构建了共享库(在jnisubproject/build/lib/main/release/libjnisubproject.so),但它不会将该共享库添加到我的JAR 文件中,也不会它是否设置了我的 Java 库路径以便能够在运行时访问共享对象。通过一些hackery(在我的运行任务中显式修改java.library.path 系统属性),当我使用gradle run 时,我可以让它工作,但我希望能够构建一个JAR 文件以进行重新分发。
我尝试通过添加将子项目添加为运行时依赖项
dependencies {
runtime project(":jnisubproject")
// runtime ":jnisubproject:assembleRelease" also doesn't work
}
到我的根项目的依赖项,但这不足以让gradle jar 构建子项目,也不足以将其文件包含在 JAR 中;这实际上似乎什么也没做。如果我在 JAR 任务中添加显式依赖项,如下所示:
jar {
dependsOn ":jnisubproject:assembleRelease"
}
当我运行gradle jar 时,它将构建我的子项目,但不出所料,共享库不会在 JAR 中结束。我尝试的最后一件事是上面的 sn-p 除了在输出目录上添加文件依赖外,还具有显式依赖:
dependencies {
runtime files('jnisubproject/build/lib/main/release/*')
}
但这两者都感觉非常hacky并且不起作用,一个很棒的组合。如果我通过这样做在 JAR 中明确包含构建的文件
jar {
include 'jnisubproject/build/lib/main/release/*'
}
然后我的 JAR 文件除了清单之外完全是空的。
简而言之,我的问题是这样的:
- 我有一个构建共享库的子项目
- 我希望根项目(Java 项目)表达对该共享库的依赖。
- 我希望该依赖项能够将共享库添加到
java.library.path和我的输出 JAR 文件中。
有什么想法吗?
【问题讨论】:
标签: java gradle java-native-interface