跳到主要内容

如何设置java_library_path

问题说明

在使用Java验证精锐5授权的过程中,有时会出现下面的错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'slm_runtime_java': 找不到指定的模块
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:379)
at com.sun.jna.Native.loadLibrary(Native.java:364)
at LC.<clinit>(LC.java:8)
at LC_TEST.main(LC_TEST.java:8)

出现这个报错的原因是精锐5使用了JNI调用c语言的动态库,但动态库没有进行设置,不在Java的环境里,所以找不到动态库。

提示

JNI是Java提供的一种编程接口,用于在Java程序中调用和被本地代码调用。它允许Java应用程序与本地代码(如C、C++)进行交互,实现跨语言的功能扩展和调用。

解决方法:

解决这个问题,需要把动态库放到特定的路径下,或者把动态库所在目录配置到Java的环境里。

方法1:设置java.library.path

提示

java.library.path是Java虚拟机(JVM)在加载本地库时搜索的路径。通过设置java.library.path,可以告诉JVM在指定路径中查找本地库文件。

说明:

Java有两个环境变量,一个是classpath,用于定位编译出的class文件;另一个是java.library.path,用于查找动态库等非class文件。

在使用JNI调用时,可以通过设置java.library.path的方式,把动态库所在目录,设置到java环境里。

假设动态库的存放路径是:

/path/to/dll

脚本方式:

在Java脚本中,添加-Djava.library.path=命令选项,指定java.library.path,例如:

java -Djava.library.path=/path/to/dll MyProgram

代码方式:

在代码中使用System.setProperty方法设置java.library.path。例如:

System.setProperty("java.library.path", "/path/to/dll");

在IDEA中配置:

java.library.path可在Run/Debug Configurations选项中进行设置,设置方法如图:

1688521120555

配置动态库所在目录到PATH

提示

环境变量,也称path。用于指定可执行文件的搜索路径。配置path可以使操作系统在任意位置查找DLL文件。

PATH是操作系统环境变量之一,用于指定可执行文件的搜索路径。它的加载时机早于java.library.path,Java启动时,一定会加载PATH到Java环境中,可以通过设置PATH的方式,把动态库所在目录放到环境变量中:

  • Windows:

    • 在命令行中使用set命令设置path(单次有效)。

      set PATH "%PATH%;C:\path\to\dll"
  • Linux:

    • 在终端中使用export命令设置path(单次有效)。

      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/dll

使用绝对路径加载

System.load()方法用于加载本机库文件,可以通过指定绝对路径来加载动态库。

在代码中使用System.load()方法加载DLL,可以提供DLL文件的绝对路径作为参数。例如:

System.load("/path/to/dll/mylib.dll");