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

dl5txlt9  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(140)

也许这里有人能帮我。我有一个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
6rqinv9w

6rqinv9w1#

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

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

很管用。

zengzsys

zengzsys2#

对于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
    )
}

相关问题