如何从JAR文件的`lib`子目录加载DLL?

时间:2018-10-28 18:44:14

标签: java gradle java-native-interface native

我已经(随Gradle一起)提供了一些带有本机库(DLL)的JAR,这些库与DLL文件上方的lib子目录一起包装:

enter image description here

不幸的是

System.loadLibrary('JCudaRuntime-0.9.2-windows-x86_64');

原因

java.lang.UnsatisfiedLinkError: no JCudaRuntime-0.9.2-windows-x86_64 in java.library.path

如何解决此问题?

是否可以为loadLibrary指定子目录?本地图书馆应该在哪里更好地定位?只是在JAR文件的根目录中?

我可以教Gradle在JAR中的lib下寻找本地人吗?

1 个答案:

答案 0 :(得分:1)

libs目录普通用于jaraar库。

x86_64程序集将转到src/main/jniLibs/x86_64

static {
    try {
        System.loadLibrary("JCudaDriver-0.9.2-windows-x86_64");
        System.loadLibrary("JCudaRuntime-0.9.2-windows-x86_64");
    } catch (UnsatisfiedLinkError e) {
        Log.e(LOG_TAG, e.getMessage());
    }
}

一个人也可以/也可以改变路径:

sourceSets {
    main {
        jniLibs.srcDir "src/main/jniLibs"
        jni.srcDirs = "src/main/cpp"
    }
}

问题仅在于,x86_64特定于平台的子目录仍会存在。从.dll中提取.jar并将其拖放到项目的jniLibs目录中可能是最简单的-因为当它们位于jar中且带有lib时目录中,可能找不到它们;不必要地使事情复杂化。