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.
(强调他们的。)
您有两个选择:
- 在 Java 启动时设置
java.library.path
:java -Djava.library.path=/home/daniel/configuration/devices/printer/CITIZENS2000 -jar MyApplication.jar
- 忘记库路径,直接使用System.load(filename)加载驱动文件而不是Sytem.loadLibrary:
System.load("/home/daniel/configuration/devices/printer/CITIZENS2000/libCSJjposCom.so")
显然,第一个选项只有在您有权指定 JVM 选项时才可用。并且第二个选项仅适用于该文件所在的一台计算机。
如果您需要可移植性,您可以将库与您的应用程序捆绑在一起,然后将其复制到临时目录并从那里加载。
我在路径上有打印机驱动程序:/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)
, orclearProperty(String)
may not have the desired effect.
(强调他们的。)
您有两个选择:
- 在 Java 启动时设置
java.library.path
:java -Djava.library.path=/home/daniel/configuration/devices/printer/CITIZENS2000 -jar MyApplication.jar
- 忘记库路径,直接使用System.load(filename)加载驱动文件而不是Sytem.loadLibrary:
System.load("/home/daniel/configuration/devices/printer/CITIZENS2000/libCSJjposCom.so")
显然,第一个选项只有在您有权指定 JVM 选项时才可用。并且第二个选项仅适用于该文件所在的一台计算机。
如果您需要可移植性,您可以将库与您的应用程序捆绑在一起,然后将其复制到临时目录并从那里加载。