首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 调用 加载 .dll资料 ( 转 原地址:http://tvjody.iteye.com/blog/125643)

2012-12-21 
Java 调用 加载 .dll文件( 转 原地址:http://tvjody.iteye.com/blog/125643)Java调用.dll文件关键字: jnat

Java 调用 加载 .dll文件 ( 转 原地址:http://tvjody.iteye.com/blog/125643)
Java调用.dll文件

关键字: jnative dll


获得三个文件,分别是: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. import?java.io.File; ??import?java.io.FileOutputStream; ??
  3. import?java.io.IOException; ??import?java.io.InputStream; ??
  4. ??import?org.xvolks.jnative.JNative; ??
  5. import?org.xvolks.jnative.Type; ??import?org.xvolks.jnative.exceptions.NativeException; ??
  6. ??public?class?AppSvrTestConnect?{ ??
  7. ??????public?AppSvrTestConnect()?{ ??
  8. ??????} ??
  9. ???? ??????/** ?
  10. ?????*?测试应用服务器连接状态 ??????*? ?
  11. ?????*??TestConnect? ??????*?@param?ip?应用服务器IP ?
  12. ?????*?@param?port?端口 ??????*?@param?intrcpt??是否采用数据压缩方式?1?:true?0:false ?
  13. ?????*?@return?int?1?:成功?0:失败 ??????*?@throws?NativeException ?
  14. ?????*?@throws?IllegalAccessException ??????*/??
  15. ????private?static?final?int?TestConnect(String?ip,?int?port,?int?intrcpt)throws?NativeException,?IllegalAccessException?{ ??????????JNative?n?=?null; ??
  16. ????????try?{??????????? ??????????????n?=?new?JNative("TestAppSvr.dll",?"TestConnect"); ??
  17. ????????????n.setRetVal(Type.INT); ??????????????int?i?=?0; ??
  18. ????????????n.setParameter(i++,?Type.STRING,?ip); ??????????????n.setParameter(i++,?Type.INT,?""?+?port); ??
  19. ????????????n.setParameter(i++,?Type.INT,?""?+?intrcpt); ??????????????n.invoke(); ??
  20. ????????????return?Integer.parseInt(n.getRetVal()); ??????????}?finally?{ ??
  21. ????????????if?(n?!=?null) ??????????????????n.dispose(); ??
  22. ????????} ??????} ??
  23. ????/** ??????*?指定Dll文件路径,动态加载本地链接库,测试应用服务器连接状态 ?
  24. ?????*?setDllPath ??????*?@param?path?Dll文件的路径,不包含DLL名称?例如:windows?-?d:\test\test\?unix?-?root/test/test/ ?
  25. ?????*?@param?ip?应用服务器IP ??????*?@param?port?端口 ?
  26. ?????*?@param?intrcpt??是否采用数据压缩方式?1?:true?0:false ??????*?@return?int?1?:成功?0:失败 ?
  27. ?????*?@throws?NativeException ??????*?@throws?IllegalAccessException ?
  28. ?????*/??????public?static?final?int?TestConnectFromDllPath(String?path,String?ip,?int?port,?int?intrcpt)?throws?NativeException,?IllegalAccessException{ ??
  29. ????????path?+=?"TestAppSvr.dll"; ??????????System.load(path); ??
  30. ????????return?TestConnect(ip,port,intrcpt); ??????} ??
  31. ????/** ??????*?Dll文件放在JRE\bin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库 ?
  32. ?????*?TestConnectFromDllPath ??????*?@param?ip?应用服务器IP ?
  33. ?????*?@param?port?端口 ??????*?@param?intrcpt??是否采用数据压缩方式?1?:true?0:false ?
  34. ?????*?@return?int?1?:成功?0:失败 ??????*?@throws?NativeException ?
  35. ?????*?@throws?IllegalAccessException ??????*/??
  36. ????public?static?final?int?TestConnectFromDllPath(String?ip,?int?port,?int?intrcpt)?throws?NativeException,?IllegalAccessException{ ??????????System.loadLibrary("TestAppSvr"); ??
  37. ????????return?TestConnect(ip,port,intrcpt); ??????} ??
  38. }??

这个类实现了一个静态私有方法,用来调用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?{ ??????public?int?getInfo()?throws?NativeException,?IllegalAccessException{ ??
  2. ???????? ??????????String?path=getClass().getResource(File.separator).getPath();??????? ??
  3. ????????path?=?path.substring(1,path.length()); ??????????System.out.println(path);???//得到DLL文件的路径 ??
  4. ???????? ??????????String?ip?=?"192.168.0.48";?//服务器IP ??
  5. ????????int?port?=?221;?????????????//端口 ??????????int?intrcpt?=?1;????????????//数据压缩方式传送,1为采用;0为不采用 ??
  6. ????????//方法1?传入Dll文件的路径 ??????????//int?info?=?AppSvrTestConnect.TestConnectFromDllPath(path,?ip,?port,?intrcpt); ??
  7. ???????? ??????????//方法2?Dll文件已经放在JRE\bin目录下面 ??
  8. ????????int?info?=?AppSvrTestConnect.TestConnectFromDllPath(ip,?port,?intrcpt); ?????????? ??
  9. ????????//1为成功,0为失败 ??????????if?(info?==?1) ??
  10. ????????????System.out.println("应用服务器可用。"); ??????????else??
  11. ????????????System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。"); ?????????? ??
  12. ????????return?info; ??????} ??
  13. ??????


?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.

热点排行