2012-05-08 22:38:26 ap0806223 阅读数 2430

因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便。

  • 下截JNative组件

    jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2

  • 解压JNative-<st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.3.2</st1:chsdate>.zip

    获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。 
    JNativeCpp.dll Windows下用的,拷贝到windows / system32目录下;
    libJNativeCpp.so Linux下的,拷贝到系统目录下;
    JNative.jar 这是一个扩展包,导入工程LIB中或将其拷贝到jdk\jre\lib\ext 下,系统会自动加载。

  • 使用说明

    我的项目将使用JNative组件调用一个测试应用服务器状态的TestAppSvr.dll文件,Dll文件中包含一个TestConnect()方法,返回一个整形的结果(1或0)

    首先配置好JNative组件的windows环境:
    将Native要用到JNativeCpp.dll放在系统盘的\WINDOWS\system32

    将JNative.jar导入工程中,新建一个调用类:

    java 代码
    1. package com.tvjody;   
    2.   
    3. import java.io.File;   
    4. import java.io.FileOutputStream;   
    5. import java.io.IOException;   
    6. import java.io.InputStream;   
    7.   
    8. import org.xvolks.jnative.JNative;   
    9. import org.xvolks.jnative.Type;   
    10. import org.xvolks.jnative.exceptions.NativeException;   
    11.   
    12. public class AppSvrTestConnect {   
    13.   
    14.     public AppSvrTestConnect() {   
    15.   
    16.     }   
    17.        
    18.     /**  
    19.      * 测试应用服务器连接状态  
    20.      *   
    21.      *  TestConnect   
    22.      * @param ip 应用服务器IP  
    23.      * @param port 端口  
    24.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    25.      * @return int 1 :成功 0:失败  
    26.      * @throws NativeException  
    27.      * @throws IllegalAccessException  
    28.      */  
    29.     private static final int TestConnect(String ip, int port, int intrcpt)throws NativeException, IllegalAccessException {   
    30.         JNative n = null;   
    31.         try {              
    32.             n = new JNative("TestAppSvr.dll""TestConnect");   
    33.             n.setRetVal(Type.INT);   
    34.             int i = 0;   
    35.             n.setParameter(i++, Type.STRING, ip);   
    36.             n.setParameter(i++, Type.INT, "" + port);   
    37.             n.setParameter(i++, Type.INT, "" + intrcpt);   
    38.             n.invoke();   
    39.             return Integer.parseInt(n.getRetVal());   
    40.         } finally {   
    41.             if (n != null)   
    42.                 n.dispose();   
    43.         }   
    44.     }   
    45.     /**  
    46.      * 指定Dll文件路径,动态加载本地链接库,测试应用服务器连接状态  
    47.      * setDllPath  
    48.      * @param path Dll文件的路径,不包含DLL名称 例如:windows - d:\test\test\ unix - root/test/test/  
    49.      * @param ip 应用服务器IP  
    50.      * @param port 端口  
    51.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    52.      * @return int 1 :成功 0:失败  
    53.      * @throws NativeException  
    54.      * @throws IllegalAccessException  
    55.      */  
    56.     public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{   
    57.         path += "TestAppSvr.dll";   
    58.         System.load(path);   
    59.         return TestConnect(ip,port,intrcpt);   
    60.     }   
    61.     /**  
    62.      * Dll文件放在JRE\bin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库  
    63.      * TestConnectFromDllPath  
    64.      * @param ip 应用服务器IP  
    65.      * @param port 端口  
    66.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    67.      * @return int 1 :成功 0:失败  
    68.      * @throws NativeException  
    69.      * @throws IllegalAccessException  
    70.      */  
    71.     public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{   
    72.         System.loadLibrary("TestAppSvr");   
    73.         return TestConnect(ip,port,intrcpt);   
    74.     }   
    75. }  

    这个类实现了一个静态私有方法,用来调用Dll文件中的方法返回结果

    private static final int TestConnect(String ip, int port, int intrcpt)

    两个静态公共方法,分两种方式装载DLL文件

    public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt)  //通过DLL文件的路径
    public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) //通过ClassLoader

             然后新建一个类,调用AppSvrTestConnect.java,实现方法一调用,我是将TestAppSvr.dll文件与Demo.java放在一个目录下 ,所以得到Demo.java的路径后就可以得到TestAppSvr.dll的路径,调用AppSvrTestConnect.TestConnectFromDllPath()方法后就能返回正确的信息.方法二是已经将TestAppSvr.dll放在了Jre\bin目录下,在JVM的Classloader的时候会自动加载,然后通过System.loadLibrary("TestAppSvr")就可以装配DLL文件.

java 代码
  1. public class Demo {   
  2.     public int getInfo() throws NativeException, IllegalAccessException{   
  3.            
  4.         String path=getClass().getResource(File.separator).getPath();          
  5.         path = path.substring(1,path.length());   
  6.         System.out.println(path);   //得到DLL文件的路径   
  7.            
  8.         String ip = "192.168.0.48"//服务器IP   
  9.         int port = 221;             //端口   
  10.         int intrcpt = 1;            //数据压缩方式传送,1为采用;0为不采用   
  11.         //方法1 传入Dll文件的路径   
  12.         //int info = AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);   
  13.            
  14.         //方法2 Dll文件已经放在JRE\bin目录下面   
  15.         int info = AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);   
  16.            
  17.         //1为成功,0为失败   
  18.         if (info == 1)   
  19.             System.out.println("应用服务器可用。");   
  20.         else  
  21.             System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。");   
  22.            
  23.         return info;   
  24.     }   
  25.       


 System.loadLibrary():装载Windows\System32下或jre\bin或Tomcat\bin目录下的本地链接库

System.load():根据具体的目录来加截本地链接库,必须是绝对路径

 

  • 备注

    上面的示例工程,因为是例子,所以没有大多的设计,只是实现了装载DLL文件,调用DLL文件方法,返回信息.

    JNative的详细说明,请参考JNative的源程序和例子.

    注意JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,所以在项目调试的时候,独立启动Web Server.

2008-12-08 00:43:00 iteye_10359 阅读数 58

由于项目需要,使用读卡机,C++没学好,一些动态库使用起来很困难,在网上搜了好久发现JNative是一个很好的选择,简单,方便,只需要简单的几步就能很好调用动态库,下面是我写一段测试代码:

  1. packageJNative;
  2. importjava.io.IOException;
  3. importjava.util.StringTokenizer;
  4. importorg.xvolks.jnative.JNative;
  5. importorg.xvolks.jnative.Type;
  6. importorg.xvolks.jnative.exceptions.NativeException;
  7. importorg.xvolks.jnative.pointers.Pointer;
  8. importorg.xvolks.jnative.pointers.memory.MemoryBlockFactory;
  9. publicclassT2{
  10. /**
  11. *@paramargs
  12. *@throwsNativeException
  13. *@throwsIllegalAccessException
  14. *@throwsIOException
  15. */
  16. publicstaticvoidmain(String[]args)throwsNativeException,IllegalAccessException,IOException{
  17. T2t=newT2();
  18. t.Init();
  19. t.getName();
  20. //======CVR_ReadBaseMsg==================
  21. JNativen8=newJNative("termb.dll","CVR_ReadBaseMsg");
  22. Pointerpointer11=newPointer(MemoryBlockFactory.createMemoryBlock(1000));
  23. Pointerpointer12=newPointer(MemoryBlockFactory.createMemoryBlock(256));
  24. Pointerpointer13=newPointer(MemoryBlockFactory.createMemoryBlock(1024*1000));
  25. Pointerpointer14=newPointer(MemoryBlockFactory.createMemoryBlock(1024));
  26. inti=0;
  27. n8.setParameter(i++,pointer11);
  28. n8.setParameter(i++,pointer12);
  29. n8.setParameter(i++,pointer13);
  30. n8.setParameter(i++,pointer14);
  31. n8.setParameter(i++,4);
  32. n8.setRetVal(Type.INT);
  33. n8.invoke();
  34. Stringmsg=pointer11.getAsString();
  35. StringTokenizerst=newStringTokenizer(msg);
  36. /*while(st.hasMoreElements()){
  37. System.out.println(st.nextElement());
  38. }*/
  39. t.Close();
  40. }
  41. /**
  42. *分配内存,并返回指针
  43. */
  44. publicstaticPointercreatePointer()throwsNativeException{
  45. Pointerpointer=newPointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
  46. returnpointer;
  47. }
  48. /**
  49. *内存大小
  50. */
  51. publicstaticintgetSizeOf(){
  52. return2*2;
  53. }
  54. publicStringgetName()throwsNativeException,IllegalAccessException{
  55. //读姓名
  56. JNativen4=newJNative("termb.dll","GetPeopleName");
  57. Pointerpointer3=newPointer(MemoryBlockFactory.createMemoryBlock(10));
  58. Pointerpointer4=newPointer(MemoryBlockFactory.createMemoryBlock(2));
  59. n4.setParameter(0,pointer3);
  60. n4.setParameter(1,pointer4);
  61. n4.setRetVal(Type.INT);
  62. n4.invoke();
  63. Stringname=pointer3.getAsString();
  64. if(n4.getRetValAsInt()==1){
  65. //System.out.println(n4.getRetVal());
  66. System.out.println("读取完毕!");
  67. }
  68. //System.out.println("返回值:"+n4.getRetValAsInt());
  69. System.out.println("姓名是--长度:"+name.length()+"姓名--"+name);
  70. returnname;
  71. }
  72. publicStringgetSex()throwsNativeException,IllegalAccessException{
  73. //读性别
  74. JNativen2=newJNative("termb.dll","GetPeopleSex");
  75. Pointerpointer1=newPointer(MemoryBlockFactory.createMemoryBlock(8));
  76. Pointerpointer2=newPointer(MemoryBlockFactory.createMemoryBlock(2));
  77. n2.setParameter(0,pointer1);
  78. n2.setParameter(1,pointer2);
  79. n2.setRetVal(Type.INT);
  80. n2.invoke();
  81. Stringsex=pointer1.getAsString();
  82. if(n2.getRetValAsInt()==1){
  83. System.out.println(n2.getRetVal());
  84. System.out.println("读取完毕!");
  85. }
  86. System.out.println("返回值:"+n2.getRetValAsInt());
  87. System.out.println("性别是--长度:"+sex.length()+"性别--"+sex);
  88. returnsex;
  89. }
  90. publicStringgetIDNo()throwsNativeException,IllegalAccessException{
  91. //读身份证号
  92. JNativen5=newJNative("termb.dll","GetPeopleIDCode");
  93. Pointerpointer5=newPointer(MemoryBlockFactory.createMemoryBlock(18));
  94. Pointerpointer6=newPointer(MemoryBlockFactory.createMemoryBlock(2));
  95. n5.setParameter(0,pointer5);
  96. n5.setParameter(1,pointer6);
  97. n5.setRetVal(Type.INT);
  98. n5.invoke();
  99. StringIDNo=pointer5.getAsString();
  100. if(n5.getRetValAsInt()==1){
  101. System.out.println(n5.getRetVal());
  102. System.out.println("读取完毕!");
  103. }
  104. System.out.println("返回值:"+n5.getRetValAsInt());
  105. System.out.println("身份证号是--长度:"+IDNo.length()+"身份证号--"+IDNo);
  106. returnIDNo;
  107. }
  108. publicStringgetAddress()throwsNativeException,IllegalAccessException{
  109. //读地址
  110. JNativen6=newJNative("termb.dll","GetPeopleAddress");
  111. Pointerpointer7=newPointer(MemoryBlockFactory.createMemoryBlock(100));
  112. Pointerpointer8=newPointer(MemoryBlockFactory.createMemoryBlock(2));
  113. n6.setParameter(0,pointer7);
  114. n6.setParameter(1,pointer8);
  115. n6.setRetVal(Type.INT);
  116. n6.invoke();
  117. Stringaddress=pointer7.getAsString();
  118. if(n6.getRetValAsInt()==1){
  119. System.out.println(n6.getRetVal());
  120. System.out.println("读取完毕!");
  121. }
  122. System.out.println("返回值:"+n6.getRetValAsInt());
  123. System.out.println("地址是--长度:"+address.length()+"地址--"+address);
  124. returnaddress;
  125. }
  126. publicStringgetDepartment()throwsNativeException,IllegalAccessException{
  127. //读发证机关
  128. JNativen7=newJNative("termb.dll","GetDepartment");
  129. Pointerpointer9=newPointer(MemoryBlockFactory.createMemoryBlock(100));
  130. Pointerpointer10=newPointer(MemoryBlockFactory.createMemoryBlock(2));
  131. n7.setParameter(0,pointer9);
  132. n7.setParameter(1,pointer10);
  133. n7.setRetVal(Type.INT);
  134. n7.invoke();
  135. Stringdepartment=pointer9.getAsString();
  136. if(n7.getRetValAsInt()==1){
  137. System.out.println(n7.getRetVal());
  138. System.out.println("读取完毕!");
  139. }
  140. System.out.println("返回值:"+n7.getRetValAsInt());
  141. System.out.println("地址是--长度:"+department.length()+"地址--"+department);
  142. returndepartment;
  143. }
  144. publicStringgetBirth()throwsNativeException,IllegalAccessException{
  145. //读生日
  146. JNativen9=newJNative("termb.dll","GetPeopleBirthday");
  147. Pointerpointer15=newPointer(MemoryBlockFactory.createMemoryBlock(100));
  148. Pointerpointer16=newPointer(MemoryBlockFactory.createMemoryBlock(2));
  149. n9.setParameter(0,pointer15);
  150. n9.setParameter(1,pointer16);
  151. n9.setRetVal(Type.INT);
  152. n9.invoke();
  153. Stringbirth=pointer15.getAsString();
  154. if(n9.getRetValAsInt()==1){
  155. System.out.println(n9.getRetVal());
  156. System.out.println("读取完毕!");
  157. }
  158. System.out.println("返回值:"+n9.getRetValAsInt());
  159. System.out.println("生日是--长度:"+birth.length()+"生日--"+birth);
  160. returnbirth;
  161. }
  162. publicvoidInit()throwsNativeException,IllegalAccessException{
  163. JNativen=newJNative("termb.dll","CVR_InitComm");
  164. n.setRetVal(Type.INT);
  165. n.setParameter(0,1001);
  166. n.invoke();
  167. System.out.println("请放置身份证!");
  168. intcnt=0;
  169. for(inti=0;;i++){
  170. //System.out.println("请正确放置身份证!");
  171. cnt++;
  172. JNativen3=newJNative("termb.dll","CVR_Authenticate");
  173. n3.setRetVal(Type.INT);
  174. n3.invoke();
  175. //System.out.println(n3.getRetVal());
  176. intr=n3.getRetValAsInt();
  177. if(r==1){
  178. break;
  179. }
  180. }
  181. System.out.println("正确放置,身份证初始化完成,卡放置正确!");
  182. JNativen1=newJNative("termb.dll","CVR_Read_Content");
  183. n1.setParameter(0,6);
  184. n1.setRetVal(Type.INT);
  185. n1.invoke();
  186. //System.out.println(n1.getRetVal());
  187. if(n1.getRetValAsInt()==1){
  188. System.out.println("读卡操作正确!");
  189. }
  190. }
  191. publicvoidClose()throwsNativeException,IllegalAccessException{
  192. JNativen1=newJNative("termb.dll","CVR_CloseComm");
  193. n1.invoke();
  194. //intt=n1.getRetValAsInt();
  195. }
  196. }
2008-02-18 14:28:00 volant_hoo 阅读数 4686
  
因为项目需求,需要在java中调用dll文件。测试过几种方法,发现还是JNative最为便利。
1.   安装
JNativeCpp.dll     放在windows/system32目录下
libJNativeCpp.so    linux下使用
JNative.jar          导入工程中
2.   使用
2.1.     加载dll文件
JNative可使用两种方式加载dll文件:
使用System.loadLibrary加载
使用此方法可加载系统目录中的dll文件。可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。
使用System.load加载
此方法参数为dll文件全路径名。
2.2.     调用函数
1、首先创建JNative对象:
JNative jnative = new JNative(dll文件名, 函数名);
2、设置返回值类型:
jnative.setRetVal(Type.INT);
3、设置参数
jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串
jnative.setParameter(1, Type.INT, String.valueof(…));       //设置第二个参数为整数
4、执行
n.invoke();
5、获取返回值
Integer.parseInt(jnative.getRetVal());
2.3.     一个实例
来自国外网上的一个实例,用于摸索struct处理方法:
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;


/**
 * SystemTime
 * 
 * typedef struct _SYSTEMTIME {
 *     WORD wYear;
 *     WORD wMonth;
 *     WORD wDayOfWeek;
 *     WORD wDay;
 *     WORD wHour;
 *     WORD wMinute;
 *     WORD wSecond;
 *     WORD wMilliseconds;
 * } SYSTEMTIME, 
 
*/

public class SystemTime extends AbstractBasicData<SystemTime> {

    
public short wYear;
    
public short wMonth;
    
public short wDayOfWeek;
    
public short wDay;
    
public short wHour;
    
public short wMinute;
    
public short wSecond;
    
public short wMilliseconds;

    
/**
     * 分配内存,并返回指针
     
*/

    
public Pointer createPointer() throws NativeException {
        pointer 
= new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
        
return pointer;
    }


    
/**
     * 内存大小
     
*/

    
public int getSizeOf() {
        
return 8 * 2;
    }


    
/**
     * 获取通过内存指针解析出结果
     
*/

    
public SystemTime getValueFromPointer() throws NativeException {
        wYear 
= getNextShort();
        wMonth 
= getNextShort();
        wDayOfWeek 
= getNextShort();
        wDay 
= getNextShort();
        wHour 
= getNextShort();
        wMinute 
= getNextShort();
        wSecond 
= getNextShort();
        wMilliseconds 
= getNextShort();
        
return this;
    }


    
public SystemTime() throws NativeException {
        
super(null);
        createPointer();
    }


    
public String toString() {
        
return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond
                
+ ":" + wMilliseconds;
    }


    
public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
        
// 创建对象
        JNative nGetSystemTime = new JNative("Kernel32.dll""GetSystemTime");
        SystemTime systemTime 
= new SystemTime();
        
// 设置参数
        nGetSystemTime.setParameter(0, systemTime.getPointer());
        nGetSystemTime.invoke();
        
// 解析结构指针内容
        return systemTime.getValueFromPointer();
    }


    
public static void main(String[] args) throws NativeException, IllegalAccessException {
        System.err.println(GetSystemTime());
    }


}

2012-05-17 11:09:15 B_H_L 阅读数 3188

因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便。

  • 下截JNative组件

    jnative.sourceforge.net/  到这里下载JNative开源项目,我下载的是1.3.2

  • 解压JNative-<st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.3.2</st1:chsdate>.zip

    获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。 
    JNativeCpp.dll Windows下用的,拷贝到windows / system32目录下;
    libJNativeCpp.so Linux下的,拷贝到系统目录下;
    JNative.jar 这是一个扩展包,导入工程LIB中或将其拷贝到jdk\jre\lib\ext 下,系统会自动加载。

  • 使用说明

    我的项目将使用JNative组件调用一个测试应用服务器状态的TestAppSvr.dll文件,Dll文件中包含一个TestConnect()方法,返回一个整形的结果(1或0)

    首先配置好JNative组件的windows环境:
    将Native要用到JNativeCpp.dll放在系统盘的\WINDOWS\system32

    将JNative.jar导入工程中,新建一个调用类:

    java 代码
    1. package com.tvjody;   
    2.   
    3. import java.io.File;   
    4. import java.io.FileOutputStream;   
    5. import java.io.IOException;   
    6. import java.io.InputStream;   
    7.   
    8. import org.xvolks.jnative.JNative;   
    9. import org.xvolks.jnative.Type;   
    10. import org.xvolks.jnative.exceptions.NativeException;   
    11.   
    12. public class AppSvrTestConnect {   
    13.   
    14.     public AppSvrTestConnect() {   
    15.   
    16.     }   
    17.        
    18.     /**  
    19.      * 测试应用服务器连接状态  
    20.      *   
    21.      *  TestConnect   
    22.      * @param ip 应用服务器IP  
    23.      * @param port 端口  
    24.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    25.      * @return int 1 :成功 0:失败  
    26.      * @throws NativeException  
    27.      * @throws IllegalAccessException  
    28.      */  
    29.     private static final int TestConnect(String ip, int port, int intrcpt)throws NativeException, IllegalAccessException {   
    30.         JNative n = null;   
    31.         try {              
    32.             n = new JNative("TestAppSvr.dll""TestConnect");   
    33.             n.setRetVal(Type.INT);   
    34.             int i = 0;   
    35.             n.setParameter(i++, Type.STRING, ip);   
    36.             n.setParameter(i++, Type.INT, "" + port);   
    37.             n.setParameter(i++, Type.INT, "" + intrcpt);   
    38.             n.invoke();   
    39.             return Integer.parseInt(n.getRetVal());   
    40.         } finally {   
    41.             if (n != null)   
    42.                 n.dispose();   
    43.         }   
    44.     }   
    45.     /**  
    46.      * 指定Dll文件路径,动态加载本地链接库,测试应用服务器连接状态  
    47.      * setDllPath  
    48.      * @param path Dll文件的路径,不包含DLL名称 例如:windows - d:\test\test\ unix - root/test/test/  
    49.      * @param ip 应用服务器IP  
    50.      * @param port 端口  
    51.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    52.      * @return int 1 :成功 0:失败  
    53.      * @throws NativeException  
    54.      * @throws IllegalAccessException  
    55.      */  
    56.     public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{   
    57.         path += "TestAppSvr.dll";   
    58.         System.load(path);   
    59.         return TestConnect(ip,port,intrcpt);   
    60.     }   
    61.     /**  
    62.      * Dll文件放在JRE\bin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库  
    63.      * TestConnectFromDllPath  
    64.      * @param ip 应用服务器IP  
    65.      * @param port 端口  
    66.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    67.      * @return int 1 :成功 0:失败  
    68.      * @throws NativeException  
    69.      * @throws IllegalAccessException  
    70.      */  
    71.     public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{   
    72.         System.loadLibrary("TestAppSvr");   
    73.         return TestConnect(ip,port,intrcpt);   
    74.     }   
    75. }  

    这个类实现了一个静态私有方法,用来调用Dll文件中的方法返回结果

    private static final int TestConnect(String ip, int port, int intrcpt)

    两个静态公共方法,分两种方式装载DLL文件

    public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt)  //通过DLL文件的路径
    public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) //通过ClassLoader

             然后新建一个类,调用AppSvrTestConnect.java,实现方法一调用,我是将TestAppSvr.dll文件与Demo.java放在一个目录下 ,所以得到Demo.java的路径后就可以得到TestAppSvr.dll的路径,调用AppSvrTestConnect.TestConnectFromDllPath()方法后就能返回正确的信息.方法二是已经将TestAppSvr.dll放在了Jre\bin目录下,在JVM的Classloader的时候会自动加载,然后通过System.loadLibrary("TestAppSvr")就可以装配DLL文件.

java 代码
  1. public class Demo {   
  2.     public int getInfo() throws NativeException, IllegalAccessException{   
  3.            
  4.         String path=getClass().getResource(File.separator).getPath();          
  5.         path = path.substring(1,path.length());   
  6.         System.out.println(path);   //得到DLL文件的路径   
  7.            
  8.         String ip = "192.168.0.48"//服务器IP   
  9.         int port = 221;             //端口   
  10.         int intrcpt = 1;            //数据压缩方式传送,1为采用;0为不采用   
  11.         //方法1 传入Dll文件的路径   
  12.         //int info = AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);   
  13.            
  14.         //方法2 Dll文件已经放在JRE\bin目录下面   
  15.         int info = AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);   
  16.            
  17.         //1为成功,0为失败   
  18.         if (info == 1)   
  19.             System.out.println("应用服务器可用。");   
  20.         else  
  21.             System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。");   
  22.            
  23.         return info;   
  24.     }   
  25.       


 System.loadLibrary():装载Windows\System32下或jre\bin或Tomcat\bin目录下的本地链接库

System.load():根据具体的目录来加截本地链接库,必须是绝对路径

 

  • 备注

    上面的示例工程,因为是例子,所以没有大多的设计,只是实现了装载DLL文件,调用DLL文件方法,返回信息.

    JNative的详细说明,请参考JNative的源程序和例子.

    注意JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,所以在项目调试的时候,独立启动Web Server.

2012-05-14 14:39:16 tjmljw 阅读数 35


// 调用DLL,取出数组中的最大值
public voic fnGetMax(int[] arrInt) {

try
...
...

// 创建JNative对象
JNative jnative = JNative("test.dll","fnGetMax");

// 为数组创建空间
Pointer aArrIntInput = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * arrInt.length));

// 初始化数组
for (int i = 0; i < arrInt.length; i++) {
aArrIntInput.setIntAt(4 * i, arrInt[i]);
}

// 设定传入参数
jnative.setParameter(0, pArrIntInput); // 数组指针
jnative.setParameter(1, arrInt.length); // 数组大小

// 设定返回类型
jnative.setRetVal(Type.INT);

// 调用DLL
jnative.invoke();

// 打印返回值
int iRet = jnative.getRetValAsInt();
System.out.println(iRet);

catch
...
...
}


double的场合

// 传入和返回类型是double
double dParam = 10.23;
...
...
jnative.setParameter(0, Type.DOUBLE, Stirng.valueOf(dParam));
...
jnative.setRetVal(Type.DOUBLE);
...
String dRet = jnative.getRetVal();
System.out.println(dRet);

JNative

阅读数 19

没有更多推荐了,返回首页