JAVA调用动态链接库DLL之JNative学习

4 篇文章 0 订阅

JAVA调用动态链接库DLL的方法有:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法;JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK、JIR环境下运行不了,在VMware下安装的WindowsXP下同样有问题;JNative是开源的,但相关资料文档也特别的少,好像已经停止更新了。JNative源码地址:http://jnative.cvs.sourceforge.net/viewvc/jnative/,jar包下载地址:http://sourceforge.net/projects/jnative/files/jnative/。

开发环境:myeclipse-10.7-offline-installer-windows

文件》新建》JAVA项目:


输入项目名称,单击“Finish”:


单击鼠标右键》新建》类:


输入包名,类名,勾选“public static void main(String[] args)”,单击“Finish”:


打开项目文件目录:


将要调用的DLL文件“EhfscliaxDll.dll”复制到此目录下,该DLL的代码请参考:VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

新建“lib”文件夹,将JNative.jar复制到此目录下:


配置编译目录:


单击“Add External JARs”添加jar包,下图为已经添加过的:


Helper类代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.ehfscliax;  
  2.   
  3. import org.xvolks.jnative.JNative;    
  4. import org.xvolks.jnative.Type;  
  5. import org.xvolks.jnative.exceptions.NativeException;    
  6. import org.xvolks.jnative.pointers.Pointer;  
  7.   
  8. public class Helper {  
  9.     /** 
  10.      * @param args 
  11.      * @throws NativeException  
  12.      */  
  13.     public static void main(String[] args) throws NativeException {  
  14.           
  15.         JNative.setLoggingEnabled(true);  
  16.         try {  
  17.             JNative getUrl = new JNative("EhfscliaxDll.dll""getUrl"); //创建 getUrl 方法的<span style="font-family: Arial, Helvetica, sans-serif;">JNative对象</span>  
  18.             getUrl.setRetVal(Type.STRING); //设置返回值类型为:String  
  19.             getUrl.setParameter(0"127.0.0.1"); //按顺序设置方法需要的参数值  
  20.             getUrl.setParameter(110087);  
  21.             getUrl.setParameter(2123);  
  22.             getUrl.invoke(); //调用方法  
  23.             System.out.println(getUrl.getRetVal()); //输出返回值  
  24.         } catch (IllegalAccessException e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.           
  28.         try {  
  29.             JNative getPlayUrl = new JNative("EhfscliaxDll.dll""getPlayUrl");  
  30.             getPlayUrl.setRetVal(Type.INT); //此方法在DLL中定义的返回值类型为:const wchar_t*,如果设置返回值类型为:String,则只能获取到返回值的第一个字符  
  31.               
  32.             String mgrIp = "127.0.0.1";  
  33.             Pointer ptr = Pointer.createPointerFromString(mgrIp);  
  34.               
  35.             getPlayUrl.setParameter(0, ptr);  
  36.             getPlayUrl.setParameter(110087);  
  37.             getPlayUrl.setParameter(2123);  
  38.             getPlayUrl.invoke();  
  39.             //个人理解getRetValAsInt是获取返回值的指针地址,<span style="font-family: Arial, Helvetica, sans-serif;">getUnicodeMemoryAsString方法从指针地址的内存中读取字符串</span>  
  40.             String url = JNative.getUnicodeMemoryAsString(getPlayUrl.getRetValAsInt());  
  41.             System.out.println(url);  
  42.         } catch (IllegalAccessException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  
  46. }  
执行结果:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Successfully loaded library 'EhfscliaxDll.dll', functionName = getUrl: hModule = 268435456  
  2. http://中文127.0.0.1:10087  
  3. 2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.pointers.memory.MemoryBlockFactory] [setPreferredMemoryType]: Using org.xvolks.jnative.pointers.memory.HeapMemoryBlock memory reservation strategy  
  4. http://-�17001:10087  
  5. 2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [unLoad]: Unloading native library 'EhfscliaxDll.dll'  
getUrl方法的返回值类型为:const char*,结果是正常的,getPlayUrl的返回值类型为:const wchar_t*,虽然通过getUnicodeMemoryAsString读取到了返回值,不是第一个字符,但中文乱码的问题一直没能解决。
本学习项目源码下载:http://download.csdn.net/detail/testcs_dn/7400203
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值