我有一个使用JNI的Java应用程序,并且正在使用gradle构建C ++共享库,其中包含我作为JNI的一部分加载的代码。 C ++构建是根构建的子项目。我可以从根项目的:jnisubproject:assembleRelease
或run
任务中对jar
进行依赖,它们确实会建立共享库(位于jnisubproject/build/lib/main/release/libjnisubproject.so
处),但是并没有添加共享库添加到我的JAR文件中,也没有设置我的Java库路径以能够在运行时访问共享库。有了一些黑客手段(我在运行任务中明确修改了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中。我尝试的最后一件事是上面的两个片段都带有显式依赖项,除了在输出目录上添加文件依赖项之外:
dependencies {
runtime files('jnisubproject/build/lib/main/release/*')
}
但是这两种感觉都非常骇人,无法正常工作,真是太棒了。如果我通过这样做将构建的文件明确地包含在JAR中,
jar {
include 'jnisubproject/build/lib/main/release/*'
}
然后,我的JAR文件最终不是清单文件,而是完全为空。
简而言之,我的问题是这样:
java.library.path
和我的输出JAR文件中。有什么想法吗?
答案 0 :(得分:1)
在您的根项目中尝试:
processResources {
from project(':jnisubproject').buildDir + '/lib/main/release/*'
}
它将告诉主要processResources
任务包括您的库。
关于java.library.path
的添加,我认为不可能从Jar内直接链接库。更多信息here。