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导入工程中,新建一个调用类:
- package?com.tvjody; ????
- import?java.io.File; ??import?java.io.FileOutputStream; ??
- import?java.io.IOException; ??import?java.io.InputStream; ??
- ??import?org.xvolks.jnative.JNative; ??
- import?org.xvolks.jnative.Type; ??import?org.xvolks.jnative.exceptions.NativeException; ??
- ??public?class?AppSvrTestConnect?{ ??
- ??????public?AppSvrTestConnect()?{ ??
- ??????} ??
- ???? ??????/** ?
- ?????*?测试应用服务器连接状态 ??????*? ?
- ?????*??TestConnect? ??????*?@param?ip?应用服务器IP ?
- ?????*?@param?port?端口 ??????*?@param?intrcpt??是否采用数据压缩方式?1?:true?0:false ?
- ?????*?@return?int?1?:成功?0:失败 ??????*?@throws?NativeException ?
- ?????*?@throws?IllegalAccessException ??????*/??
- ????private?static?final?int?TestConnect(String?ip,?int?port,?int?intrcpt)throws?NativeException,?IllegalAccessException?{ ??????????JNative?n?=?null; ??
- ????????try?{??????????? ??????????????n?=?new?JNative("TestAppSvr.dll",?"TestConnect"); ??
- ????????????n.setRetVal(Type.INT); ??????????????int?i?=?0; ??
- ????????????n.setParameter(i++,?Type.STRING,?ip); ??????????????n.setParameter(i++,?Type.INT,?""?+?port); ??
- ????????????n.setParameter(i++,?Type.INT,?""?+?intrcpt); ??????????????n.invoke(); ??
- ????????????return?Integer.parseInt(n.getRetVal()); ??????????}?finally?{ ??
- ????????????if?(n?!=?null) ??????????????????n.dispose(); ??
- ????????} ??????} ??
- ????/** ??????*?指—ll文件路径,动态加载本地链接库,测试应用服务器连接状态 ?
- ?????*?setDllPath ??????*?@param?path?Dll文件的路径,不包含DLL名称?例如:windows?-?d:\test\test\?unix?-?root/test/test/ ?
- ?????*?@param?ip?应用服务器IP ??????*?@param?port?端口 ?
- ?????*?@param?intrcpt??是否采用数据压缩方式?1?:true?0:false ??????*?@return?int?1?:成功?0:失败 ?
- ?????*?@throws?NativeException ??????*?@throws?IllegalAccessException ?
- ?????*/??????public?static?final?int?TestConnectFromDllPath(String?path,String?ip,?int?port,?int?intrcpt)?throws?NativeException,?IllegalAccessException{ ??
- ????????path?+=?"TestAppSvr.dll"; ??????????System.load(path); ??
- ????????return?TestConnect(ip,port,intrcpt); ??????} ??
- ????/** ??????*?Dll文件放在JRE\bin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库 ?
- ?????*?TestConnectFromDllPath ??????*?@param?ip?应用服务器IP ?
- ?????*?@param?port?端口 ??????*?@param?intrcpt??是否采用数据压缩方式?1?:true?0:false ?
- ?????*?@return?int?1?:成功?0:失败 ??????*?@throws?NativeException ?
- ?????*?@throws?IllegalAccessException ??????*/??
- ????public?static?final?int?TestConnectFromDllPath(String?ip,?int?port,?int?intrcpt)?throws?NativeException,?IllegalAccessException{ ??????????System.loadLibrary("TestAppSvr"); ??
- ????????return?TestConnect(ip,port,intrcpt); ??????} ??
- }??
这个类实现了一个静态私有方法,用来调用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 代码- public?class?Demo?{ ??????public?int?getInfo()?throws?NativeException,?IllegalAccessException{ ??
- ???????? ??????????String?path=getClass().getResource(File.separator).getPath();??????? ??
- ????????path?=?path.substring(1,path.length()); ??????????System.out.println(path);???//得到DLL文件的路径 ??
- ???????? ??????????String?ip?=?"192.168.0.48";?//服务器IP ??
- ????????int?port?=?221;?????????????//端口 ??????????int?intrcpt?=?1;????????????//数据压缩方式传送,1为采用;0为不采用 ??
- ????????//方法1?传入Dll文件的路径 ??????????//int?info?=?AppSvrTestConnect.TestConnectFromDllPath(path,?ip,?port,?intrcpt); ??
- ???????? ??????????//方法2?Dll文件已经放在JRE\bin目录下面 ??
- ????????int?info?=?AppSvrTestConnect.TestConnectFromDllPath(ip,?port,?intrcpt); ?????????? ??
- ????????//1为成功,0为失败 ??????????if?(info?==?1) ??
- ????????????System.out.println("应用服务器可用。"); ??????????else??
- ????????????System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。"); ?????????? ??
- ????????return?info; ??????} ??
- ??????
?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.