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

7 java java-native-interface intellij-idea gradle

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

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

现在,当在 IntelliJ 中正常运行我的程序时,我希望虚拟机将我的库的路径添加.sojava.library.path并相应地使用它。目前,我必须通过转到addEdit Configurations并在Modify Options > Add VM Optionsadd下单独为每个主类执行此操作-Djava.library.path=...../native/build/lib/main/debug。但不知何故,必须可以为 gradle 中的所有类进行全局设置,或者不能?

我知道您可以添加gradle.buildjava.library.path 进行测试,如下所示

test {
    systemProperty 'java.library.path','path/to/directory'
}
Run Code Online (Sandbox Code Playgroud)

但我不需要这个来进行测试,而是在单击 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"
}
Run Code Online (Sandbox Code Playgroud)

但没有成功。注意,只有在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 Code Online (Sandbox Code Playgroud)

是的,当我单独设置时它会-Djava.library.path...起作用Run Configuration

环境:

  • IntelliJ IDEA 旗舰版 2021.3.2
  • 采用OpenJDK 11.0.11+9 hs
  • 摇篮7.1

小智 2

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

static {
   System.load('absolute Path to .so file')
}
Run Code Online (Sandbox Code Playgroud)

奇迹般有效。