在Java程序中使用JNative调用dll文件

本文介绍了如何在Java程序中使用JNative库调用DLL文件,详细讲解了加载DLL、设置返回值类型、参数传递以及一个具体的SystemTime结构体处理实例,帮助开发者理解和实现Java与DLL的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  
因为项目需求,需要在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());
    }


}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值