java.lang.UnsatisfiedLinkError中甚至设置-Djava.library.

2019-09-29 13:42发布

我加载库到我的Java代码。 我已经把库中的系统正32文件夹,我还设置-Djava.library.path。

早些时候,该代码正在运行

try{


        System.loadLibrary("resources/TecJNI");

        System.out.println("JNI library loaded \n");
    }
    catch(UnsatisfiedLinkError e){
        System.out.println("Did not load library");
        e.printStackTrace();
    }

但自上周以来,它显示

java.lang.UnsatisfiedLinkError: no resources/TecJNI in java.library.path.

这是我在Java代码或DLL加载我一些其他应用程序所使用的DLL文件的一些权限问题。

也用上了与装载在不同的工作区相同的dll的所有其他我运行的应用程序没有正在运行。

谁能给我建议?

编辑:我使用 -

Djava.library.path = “$ {} workspace_loc /org.syntec.ivb.application/resources; $ {ENV_VAR:PATH}”

在我的Eclipse VM参数。 我认为这是用这个。

Answer 1:

预计的System.loadLibrary库名称,而不是一个路径。 以方含该库的目录的路径应该在PATH(Windows)中环境变量或-Djava.library.path设置



Answer 2:

当谈到加载库在JVM中,我喜欢的库复制到一个临时目录,然后将临时目录中加载它们。 这里是代码:

private synchronized static void loadLib(String dllPath,String libName) throws IOException {
    String osArch = System.getProperty("os.arch").contains("64")?"_X64":"_X86";
    String systemType = System.getProperty("os.name");
    String libExtension = (systemType.toLowerCase().indexOf("win") != -1) ? ".dll"
            : ".so";
    String libFullName = libName+osArch+ libExtension;
    String nativeTempDir = System.getProperty("java.io.tmpdir");

    InputStream in = null;
    BufferedInputStream reader = null;
    FileOutputStream writer = null;

    File extractedLibFile = new File(nativeTempDir + File.separator
            + libFullName);
    if (!extractedLibFile.exists()) {
        try {
            in = new FileInputStream(dllPath+ File.separator+
                    libFullName);
            reader = new BufferedInputStream(in);
            writer = new FileOutputStream(extractedLibFile);

            byte[] buffer = new byte[1024];

            while (reader.read(buffer) > 0) {
                writer.write(buffer);
                buffer = new byte[1024];
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null)
                in.close();
            if (writer != null)
                writer.close();
        }
    }
    System.load(extractedLibFile.toString());
}


Answer 3:

为什么你需要额外的“资源”?

当使用System.loadLibrary("resources/TecJNI"); 您在子文件夹中寻找TecJNI.dll "resources"的的java.library.path的。 所以,如果你把C:\ Windows \ System32下的库路径(这你就不需要,因为它是默认的搜索路径),您的图书馆应该是C:\windows\system32\resources\TecJNI.dll



文章来源: java.lang.UnsatisfiedLinkError even on setting -Djava.library.path