java调用dll动态库文件的一般总结

来源:互联网 发布:java递归算法 编辑:程序博客网 时间:2024/06/05 09:55

  前一段时间,在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。

  首先需要明白的是,在java中是不能直接调用动态库文件的,因为动态库文件是使用c或是c++编写的,作为一种跨     平台的编程语言,java提供了一些用来读取dll文件方法,

  一种是直接用JNI,这种方法一般来说用的人比较少,因为其中涉及到c++调用文件的编写,这里就不再叙述,下面直接说我们java程序员常用的两种调用动态库的方法

   1.Jna调用动态库,

    JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

   使用步骤:

     (1):调入jar包,使用Jna之前我们需要在项目中首先导入Jna的jar包,有两个,jna-3.3.0-platform.jar 和 jna.jar

     (2):将需要调用的第三方dll文件放在项目的根目录下

     (3):编写调用的方法

        import com.sun.jna.Native;
        import com.sun.jna.win32.StdCallLibrary;
        public class HelloWorld {
    public interface Dll extends StdCallLibrary { 

 
            Dll INSTANCE = (Dll) Native.loadLibrary("SiInterface", Dll.class);//加载动态库文件


            public int INIT();//动态库中调用的方法
       }
    public static void main(String[] args) {
System.out.println(Dll.INSTANCE.INIT());
      }
      }

     需要注意:当dll文件不在项目的根目录下,路径要写成绝对路径

    2.Jnative调用动态库

     使用步骤:

    (1):首先下载JNative的jar包,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so这三个包。

            JNative.jar是需要导入到Java工程的lib下。 通过Build Path即可导入。 建议将JNative.jar放在jdk的jre\lib\ext文             件里。

           JNativeCpp.dll是必须放入到jdk的jre\bin文件里,否则就会报JNative找不到的错误。

            libJNativeCpp.so是Linux操作系统的,由于没有做过实验,所以暂时不予说明。

   (2):由于  JNativeCpp.dll是32为windows程序,所以需要下载jdk 32位的版本才可以。这一点要注意了

   (3):将需要调用的dll动态链接库放置到system32文件里,否则就会出现找不到dll文件的错误。

   (4):下面是代码部分

     import java.io.IOException;
     import java.io.PrintWriter;
     import javax.servlet.ServletException;
     import javax.servlet.http.HttpServlet;
     import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;
     import org.xvolks.jnative.JNative;
     import org.xvolks.jnative.Type;
     import org.xvolks.jnative.exceptions.NativeException;
     public class testServlet extends HttpServlet {
  static JNative jnt = null; 
  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
try {
String  filePath =request.getSession().getServletContext().getRealPath("/");  
                //下面用的是文件的绝对路径
              System.load("D:\\myeclipse\\JnaWeb\\WebRoot\\jna\\SiInterface.dll");
         if (jnt == null) {  
             // 1.利用org.xvolks.jnative.JNative来加载DLL:参数1.类名  
             // 2.方法名  
             jnt = new JNative("SiInterface.dll", "INIT");  
             jnt.setParameter(0, "error");
             // 3.设置返回参数的类型  
             jnt.setRetVal(Type.INT);  
             // 4.执行方法  
             jnt.invoke();// 调用方法  
         } 
         // 5.返回值  
         String string=jnt.getRetVal(); 
         System.out.println("string="+string);
     } catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {  
         if (jnt != null) {  
             // 6.释放系统资源  
             try {
jnt.dispose();
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}  
         }  
     } 
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}


   

0 0
原创粉丝点击