首页 > 解决方案 > 如何从 JAR 文件的“lib”子目录加载 DLL?

问题描述

我已经包含(使用 Gradle)一些带有本机库 (DLL) 的 JAR,这些 JAR 包含lib在 DLL 文件上方的子目录中:

在此处输入图像描述

很遗憾,

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 文件的根目录中?

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

标签: javagradlejava-native-interfacenative

解决方案


普通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目录中,但它们可能无法在预期的地方找到;这不必要地使事情复杂化。


推荐阅读