学习JNA,Jnative个人总结

来源:互联网 发布:网络在线棋牌游戏 编辑:程序博客网 时间:2024/06/05 11:04
首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac 及javah命令,步骤繁琐2.JNA,Jnative相对简单只需要用实现接口,使用相对简单,但无论使用什么调用dll文件,比较令人头疼的都是JAVA与C之间类型对应与值对应。下面我将项目中对着JNA及jnative的使用总结下。 


1.JNA样码 


步骤如下: 


a,下载JNAjar文件,拷贝至系统根目录或者系统system32下 

b,代码很easy 

Java代码  收藏代码
  1. package com.cn.app;  
  2.   
  3. import com.sun.jna.Library;  
  4. import com.sun.jna.Native;  
  5.   
  6. public class DLLTEST {  
  7.   
  8.     // 1.实现PegRoute.dll 文件接口  
  9.       
  10.     public interface PegRoute extends Library {  
  11.   
  12.         // 2.PegRoute.dll 中 HCTInitEx方法  
  13.         public int HCTInitEx(int Version, String pStrCurrentDirectory);  
  14.     }  
  15.       
  16.     public static void main(String[] args) {  
  17.                  //3.加载DLL文件,执行dll方法    
  18.         PegRoute epen = (PegRoute) Native.loadLibrary("PegRoute",  
  19.                 PegRoute.class);  
  20.         if (epen != null) {  
  21.             System.out.println("DLL加载成功!");  
  22.             int success = epen.HCTInitEx(0,"");  
  23.             System.out.println("1.设备初始化信息!" + success);  
  24.                     }  
  25.     }  
  26. }  



2.Jnative样码 

1.下载jnative。jar 及JNativeCpp.dll 
2.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下 
3.样码 

Java代码  收藏代码
  1. import org.xvolks.jnative.JNative;  
  2. import org.xvolks.jnative.exceptions.NativeException;  
  3. import org.xvolks.jnative.Type;  
  4. import org.xvolks.jnative.misc.basicStructures.LONG;  
  5.   
  6. public class JNativeT {  
  7.   
  8.     static JNative PegRoute = null;  
  9.   
  10.     public String init() throws NativeException, IllegalAccessException {  
  11.         try {  
  12.             if (PegRoute == null) {  
  13.                 // 1. 利用org.xvolks.jnative.JNative来加载DLL:参数1.PegRoute为类名  
  14.                 // 2.HCTInitEx方法名  
  15.                 PegRoute = new JNative("PegRoute""HCTInitEx");  
  16.   
  17.                 // 2.设置要调用方法中的参数:0 表示第一个以此类推  
  18.                 LONG versionLong = new LONG(10);  
  19.                 versionLong.setValue(0);  
  20.   
  21.                 PegRoute.setParameter(0, Type.LONG, versionLong.toString());  
  22.                 PegRoute.setParameter(1, Type.STRING, "");  
  23.   
  24.                 // 3.设置返回参数的类型  
  25.                 PegRoute.setRetVal(Type.INT);  
  26.                 // 4.执行方法  
  27.                 PegRoute.invoke();// 调用方法  
  28.             }  
  29.             System.out.println("调用的DLL文件名为:" + PegRoute.getDLLName());  
  30.             System.out.println("调用的方法名为:" + PegRoute.getFunctionName());  
  31.             // 5.返回值  
  32.             return PegRoute.getRetVal();  
  33.         } finally {  
  34.             if (PegRoute != null) {  
  35.                 // 6.释放系统资源  
  36.                 PegRoute.dispose();  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41.         public static void main(String[] args) throws NativeException,  
  42.             IllegalAccessException {  
  43.           
  44.         String mm = new JNativeT().init();  
  45.         System.out.println(mm);  
  46.     }  
  47. }