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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

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项目:

JAVA调用动态链接库DLL之JNative学习_第1张图片

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

JAVA调用动态链接库DLL之JNative学习_第2张图片

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

JAVA调用动态链接库DLL之JNative学习_第3张图片

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

JAVA调用动态链接库DLL之JNative学习_第4张图片

打开项目文件目录:

JAVA调用动态链接库DLL之JNative学习_第5张图片

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

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

JAVA调用动态链接库DLL之JNative学习_第6张图片

配置编译目录:

JAVA调用动态链接库DLL之JNative学习_第7张图片

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

JAVA调用动态链接库DLL之JNative学习_第8张图片

Helper类代码:

package com.ehfscliax;import org.xvolks.jnative.JNative;  import org.xvolks.jnative.Type;import org.xvolks.jnative.exceptions.NativeException;  import org.xvolks.jnative.pointers.Pointer;public class Helper /**  * @param args  * @throws NativeException   */ public static void main(String[] args) throws NativeException {    JNative.setLoggingEnabled(true);  try {   JNative getUrl = new JNative("EhfscliaxDll.dll", "getUrl"); //创建 getUrl 方法的JNative对象   getUrl.setRetVal(Type.STRING); //设置返回值类型为:String   getUrl.setParameter(0, "127.0.0.1"); //按顺序设置方法需要的参数值   getUrl.setParameter(1, 10087);   getUrl.setParameter(2, 123);   getUrl.invoke(); //调用方法   System.out.println(getUrl.getRetVal()); //输出返回值  } catch (IllegalAccessException e) {   e.printStackTrace();  }    try {   JNative getPlayUrl = new JNative("EhfscliaxDll.dll", "getPlayUrl");   getPlayUrl.setRetVal(Type.INT); //此方法在DLL中定义的返回值类型为:const wchar_t*,如果设置返回值类型为:String,则只能获取到返回值的第一个字符      String mgrIp = "127.0.0.1";   Pointer ptr = Pointer.createPointerFromString(mgrIp);      getPlayUrl.setParameter(0, ptr);   getPlayUrl.setParameter(1, 10087);   getPlayUrl.setParameter(2, 123);   getPlayUrl.invoke();   //个人理解getRetValAsInt是获取返回值的指针地址,getUnicodeMemoryAsString方法从指针地址的内存中读取字符串   String url = JNative.getUnicodeMemoryAsString(getPlayUrl.getRetValAsInt());   System.out.println(url);  } catch (IllegalAccessException e) {   e.printStackTrace();  } }}
执行结果:

2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Successfully loaded library 'EhfscliaxDll.dll', functionName = getUrl: hModule = 268435456http://中文127.0.0.1:100872014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.pointers.memory.MemoryBlockFactory] [setPreferredMemoryType]: Using org.xvolks.jnative.pointers.memory.HeapMemoryBlock memory reservation strategyhttp://-�17001:100872014-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

你可能会遇到以下问题:

 

如何捕获 System.loadLibrary 产生的异常?


           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

JAVA调用动态链接库DLL之JNative学习_第9张图片

你可能感兴趣的:(JAVA调用动态链接库DLL之JNative学习)