由于项目需要,要驱动dll文件从平台中取值,所有做了一个java类读取dll文件,执行函数
?
package com.stm.dll; import org.xvolks.jnative.JNative; import org.xvolks.jnative.Type; import org.xvolks.jnative.pointers.Pointer; import org.xvolks.jnative.pointers.memory.MemoryBlockFactory; /** * 执行此函数需要把JNative.jar中的lib-bin\JNativeCpp.dll文件拷贝到C:\Windows\System32下; * 并且把zjnet.dll文件也拷贝到C:\Windows\System32下 * @author LOVCC * @date 2011/12/28 * */ public class JavaCallsDLL { //系统调用的dll文件名 private static final String dllName = "zjnet.dll" ; //dll文件中定义的初始化函数 private static final String initFunName = "InitSocketEnvironment" ; //dll文件中定义的交易函数 private static final String tradeFunName = "SendDateToTXZFAndReceiveFromTXZF" ; //dll文件中定义的释放资源函数 private static final String closeFunName = "FinalSocketEnvironment" ; //为返回消息而设置的内存大小 private static final int memorySize = 65535 ; //JNative对象用于操作dll文件 private static JNative jn = null ; /** * 初始化资源 * @return 返回初始化的状态码 * >0 代表成功 * @throws Exception */ public static int open() throws Exception { jn = new JNative(dllName, initFunName) ; jn.setRetVal(Type.INT); jn.invoke() ; return jn.getRetValAsInt() ; } /** * 交易函数 * @param send * @param receive * @return 返回执行函数的信息 * 失败返回null * @throws Exception */ public static String trade(String send, String receive) throws Exception{ jn = new JNative(dllName, tradeFunName) ; jn.setRetVal(Type.INT) ; Pointer point = new Pointer(MemoryBlockFactory.createMemoryBlock(memorySize)); point.setStringAt(0, receive) ; jn.setParameter(0, Type.STRING, send) ; jn.setParameter(1, point) ; jn.invoke() ; int i = jn.getRetValAsInt() ; if(i>=0){ String str = point.getAsString() ; point.dispose() ; return str ; } else return null; } /** * 释放系统资源函数 * @return * @throws Exception */ public static String close() throws Exception{ int i ; String message ; jn = new JNative(dllName, closeFunName) ; jn.setRetVal(Type.INT); jn.invoke() ; i = jn.getRetValAsInt() ; if(i>0) message = "资源释放成功!" ; else message = "资源释放失败!" ; return message ; } /** * 把以上三个函数封装 * 调用函数直接执行 * 初始化信息,进行交易,释放资源 * 三步 * @param send * @param receive * @return 返回交易信息 */ public static String getInfo(String send, String receive){ String info = null ; try{ int i = open() ; if(i>0) info = trade(send, receive) ; else throw new Exception("建立连接失败") ; System.out.println(close()) ; }catch(Exception e){ e.printStackTrace() ; } return info ; } }
?
?类用到了JNative插件来操作dll文件的
JNative中有个类Pointer实现了类似于c语言中的指针的作用!当是以为实现指针是驱动了自己jar包中dll文件实现的,但是我把C:\Windows\System32下的JNativeCpp.dll和它自身jar包中的JNativeCpp.dll都删了,但是它依然可以工作,于是查看源代码,结果更迷惑了!!!
Pointer是用setStringAt方法往里面赋值的,而setStringAt方法调用了JNative.setMemory()方法,
JNative.setMemory()方法调用了自身的nSetMemory()方法,但是?nSetMemory方法是这样定义的:
?
private static native void nSetMemory(int pointer, byte[] buff, int offset, int len) throws NativeException;?
?
到这里就结束了.........
到底也不知道它是怎么实现Pointer的???