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

Gradle add native library dir to java.library.path (not for test but for run)

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

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

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

我知道您可以在 gradle.build 中添加 java.library.path 进行如下测试

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

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

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'。因为在其他任务中抛出 'No Signature Method exception'。当我尝试启动程序时,我得到 Exception in thread "main" java.lang.UnsatisfiedLinkError: no native in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib].

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

public class A {
    public static native void print0();

    static {
        System.loadLibrary("native");
    }

    public static void main(String[] args) {
        print0();
    }
}

是的,当我在 Run Configuration

中单独设置 -Djava.library.path... 时它有效

环境:

我只是改变了我的方法,现在我在 class 中的运行时加载我的本机库,它使用

定义本机函数
static {
   System.load('absolute Path to .so file')
}

很有魅力。