下文参考自:http://blog.163.com/wex660@126/blog/static/2415306520103142363964/, 因为项目需要,用到了java调用dll文件中的方法。写成dll文件大多是用C、VB、Delphi语言弄成的,对于我这个纯粹干java的人员来说,着实让我太为难了。唉,也就是说我编程底子没有搭好,惭愧。要是这些语言我都会些,也不至少让我了解并应用这个技术花了很长时间。
我是用JNative技术做的一个例子。需要用到的是:JNative.jar,JNative.dll这些是在Windows中开发的,如果用Linus要用到libJNative.so 1.将JNative.dl,所要读的dll文件l放在C:\windows\system32下面。 2.将JNative.jar放在你的项目下的lib下面 3.将要读的dll文件放在跟使用的类相同的目录下。 4.我的类的源码 package sms; import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException; import org.xvolks.jnative.misc.basicStructures.AbstractBasicData; import org.xvolks.jnative.pointers.Pointer; import org.xvolks.jnative.pointers.memory.MemoryBlockFactory; public class SystemTime extends AbstractBasicData<SystemTime>{
public short wYear;
public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; /**
* 分配内存,并返回指针 */ public Pointer createPointer() throws NativeException { pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf())); return pointer; } /**
* 内存大小 */ public int getSizeOf(){ return 8 * 2; } /**
* 获取通过内存指针解析出结果 */ public SystemTime getValueFromPointer() throws NativeException { wYear = getNextShort(); wMonth = getNextShort(); wDayOfWeek = getNextShort(); wDay = getNextShort(); wHour = getNextShort(); wMinute = getNextShort(); wSecond = getNextShort(); wMilliseconds = getNextShort(); return this; } public SystemTime() throws NativeException{
super(null); createPointer(); } public String toString(){
return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds; } public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
// 创建对象 JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime"); SystemTime systemTime = new SystemTime(); // 设置参数 nGetSystemTime.setParameter(0, systemTime.getPointer()); nGetSystemTime.invoke(); // 解析结构指针内容 return systemTime.getValueFromPointer(); } public static void main(String[] args) throws NativeException, IllegalAccessException{
System.err.println(GetSystemTime()); } }
注:Kernel32.dll是我要读的dll文件,GetSystemTime是dll文件中的方法(就是所谓的函数名) That's ok,相信我这么不懂dll的都能做出来,你也能 因为项目需求,需要在java中调用dll文件。测试过几种方法,发现还是JNative最为便利。
1. 安装
JNativeCpp.dll 放在windows/system32目录下
libJNativeCpp.so linux下使用
JNative.jar 导入工程中
2. 使用
2.1. 加载dll文件
JNative可使用两种方式加载dll文件:
使用System.loadLibrary加载
使用此方法可加载系统目录中的dll文件。可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。
使用System.load加载
此方法参数为dll文件全路径名。
2.2. 调用函数
1、首先创建JNative对象:
JNative jnative = new JNative(dll文件名, 函数名);
2、设置返回值类型:
jnative.setRetVal(Type.INT);
3、设置参数
jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串
jnative.setParameter(1, Type.INT, String.valueof(…)); //设置第二个参数为整数
4、执行
n.invoke();
5、获取返回值
Integer.parseInt(jnative.getRetVal());
2.3. 一个实例
来自国外网上的一个实例,用于摸索struct处理方法:
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException; import org.xvolks.jnative.misc.basicStructures.AbstractBasicData; import org.xvolks.jnative.pointers.Pointer; import org.xvolks.jnative.pointers.memory.MemoryBlockFactory; /** * SystemTime * * typedef struct _SYSTEMTIME { * WORD wYear; * WORD wMonth; * WORD wDayOfWeek; * WORD wDay; * WORD wHour; * WORD wMinute; * WORD wSecond; * WORD wMilliseconds; * } SYSTEMTIME, */ public class SystemTime extends AbstractBasicData<SystemTime> { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; /** * 分配内存,并返回指针 */ public Pointer createPointer() throws NativeException { pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf())); return pointer; } /** * 内存大小 */ public int getSizeOf() { return 8 * 2; } /** * 获取通过内存指针解析出结果 */ public SystemTime getValueFromPointer() throws NativeException { wYear = getNextShort(); wMonth = getNextShort(); wDayOfWeek = getNextShort(); wDay = getNextShort(); wHour = getNextShort(); wMinute = getNextShort(); wSecond = getNextShort(); wMilliseconds = getNextShort(); return this; } public SystemTime() throws NativeException { super(null); createPointer(); } public String toString() { return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds; } public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException { // 创建对象 JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime"); SystemTime systemTime = new SystemTime(); // 设置参数 nGetSystemTime.setParameter(0, systemTime.getPointer()); nGetSystemTime.invoke(); // 解析结构指针内容 return systemTime.getValueFromPointer(); } public static void main(String[] args) throws NativeException, IllegalAccessException { System.err.println(GetSystemTime()); } }
|
|
来自: yan的图书41 > 《java 短信猫》