Java 加载本机库

Java Loading Native Libraries

我在路径上有打印机驱动程序:/home/daniel/configuration/devices/printer/CITIZENS2000/libCSJjposCom.so

我需要将此驱动程序加载到我的 java 应用程序中,我正在使用以下代码:

@Override
public void addLibraryPath(String pathToAdd) {
    try {
        System.setProperty("java.library.path", System.getProperty("java.library.path") + ":/home/daniel/configuration/devices/printer/CITIZENS2000");

        System.loadLibrary("CSJjposCom");
    } catch (Exception e) {
        throw new IllegalStateException("Failed to load library", e);
    }
}


但是我在 loadLibrary() method: Method threw 'java.lang.UnsatisfiedLinkError' 异常。 (java.library.path 中没有 CSJjposCom);

我该如何解决?

虽然可以在代码中设置java.library.path,但不会有任何效果。来自 the documentation of System.getProperties():

Changing a standard system property may have unpredictable results unless otherwise specified. Property values may be cached during initialization or on first use. Setting a standard property after initialization using getProperties(), setProperties(Properties), setProperty(String, String), or clearProperty(String) may not have the desired effect.

(强调他们的。)

您有两个选择:

  1. 在 Java 启动时设置 java.library.pathjava -Djava.library.path=/home/daniel/configuration/devices/printer/CITIZENS2000 -jar MyApplication.jar
  2. 忘记库路径,直接使用System.load(filename)加载驱动文件而不是Sytem.loadLibrary:System.load("/home/daniel/configuration/devices/printer/CITIZENS2000/libCSJjposCom.so")

显然,第一个选项只有在您有权指定 JVM 选项时才可用。并且第二个选项仅适用于该文件所在的一台计算机。

如果您需要可移植性,您可以将库与您的应用程序捆绑在一起,然后将其复制到临时目录并从那里加载。