也许这里有人能帮我。我有一个Java项目,在这个项目中,我使用Gradle并在IntelliJ中处理整个事情。(规格如下)
在我的项目中,我使用JNI并编写了我自己的C++库。所以文件),我把它放在我的项目e中的一个目录中。例如./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中的所有类全局设置这个值,或者不可以?
我知道你可以在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
- Gradle 7.1
2条答案
按热度按时间6rqinv9w1#
我只是改变了我的方法,现在在运行时加载我的本机库,它使用
很管用。
zengzsys2#
对于
run
任务:为了让我的Kotlin项目有测试工作:
对于典型的Gradle项目: