JNI 加载动态库 有更新!

  cheney

JNI 提供了 java 调用动态库的方案,但是不是很方便,动态库需要专门编写,目前已经有更好的方案 JNA 方案。

示例

最简单的一个调用动态库的示例:

package me.gpio;

public class test
{
   //测试接口
  public static native int GetVersion(String InPath);
  
  static
  {

       System.out.println( System.getProperty("java.library.path") );
       System.loadLibrary("test");
     }

}

通过调试信息可以看到,java.library.path 的最后一个通常是当前目录。也就说,如果使用 IDE 调试,只需要把动态库 test.dll 放在项目的根目录就好了。
把项目打成 jar 包后,就需要把动态库放在 jar 包旁边。还注意到一点,动态库的扩展名是自动根据平台类型加上的。

方案

根据以上信息可以设计如下方案。

  • 将动态库按照类型放在 resources 路径下。
  • reource
    • dlib
      • dllx86
        • test.dll
      • dllx64
        • test.dll
      • sox86
        • test.so
      • sox64
        • test.so
  • 类被加载时,将 dlib 下的对应平台的动态库释放到当前路径下。

  • System.loadLibrary
  • linux 下动态库和 java 都需要设置权限。