逐步将本机库目录添加到java.library.path中(不是为了测试,而是为了运行)



也许这里有人能帮我。我有一个Java项目,我在其中使用Gradle并在IntelliJ中处理整个过程。(规格如下(

在我的项目中,我使用JNI并编写自己的C++库(.so文件(,我将其放在项目中的一个目录中,例如./native/build/lib/main/debug/libnative.so

现在,当在IntelliJ中正常运行我的程序时,我希望VM将我的.so-库的路径添加到java.library.path,并相应地使用它。目前,我必须通过转到Edit Configurations并在Modify Options > Add VM Options下添加-Djava.library.path=...../native/build/lib/main/debug来分别为每个主类执行此操作。但不知何故,一定有可能为所有年级的班级全局设置这个值,或者不可以?

我知道你可以在gradle.build中添加java.library.path来进行以下之类的测试

test {
systemProperty 'java.library.path','path/to/directory'
}

但我不需要这个来进行测试,而是在单击IntelliJ中的绿色箭头时正常运行/启动类中的主函数。我已经尝试将其添加到所有任务中,如以下

compileJava {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}
processResources {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}
classes {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}
jar {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}
startScripts {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}
installDist {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}
build {
"-Djava.library.path=${System.getProperty('java.library.path')}:${project(':native').buildDir}/lib/main/debug"
}

但没有成功。请注意,只有在test中才能使用"systemProperty"。由于在其他任务中会抛出"无签名方法异常"。当我尝试启动程序时,我会得到Exception in thread "main" java.lang.UnsatisfiedLinkError: no native in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib]

我在这里简单地使用以下类:

public class A {
public static native void print0();
static {
System.loadLibrary("native");
}
public static void main(String[] args) {
print0();
}
}

是的,当我在Run Configuration中单独设置-Djava.library.path...时,它就工作了

环境:

  • IntelliJ IDEA Ultimate 2021.3.2
  • 采用OpenJDK 11.0.11+9 hs
  • 7.1级

我只是改变了我的方法,现在在运行时加载我的本机库,该类使用定义本机函数

static {
System.load('absolute Path to .so file')
}

工作起来很有魅力。

对于run任务:

application {
mainClass.set("x.y.ApplicationKt")
applicationDefaultJvmArgs += listOf(
"-Djava.library.path=${projectDir}/libs/your_native_library_folder/"
)
}

对于我的Kotlin项目进行测试:

tasks.withType<Test>().all {
systemProperty(
"java.library.path",
"someAbsolutePath:anotherPath" //Replace : with ; for windows
)
}

对于典型的Gradle项目:

test{
systemProperty(
"java.library.path",
"someAbsolutePath:anotherPath" //Replace : with ; for windows
)
}

最新更新