学习JNA,Jnative个人总结

首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac 及javah命令,步骤繁琐2.JNA,Jnative相对简单只需要用实现接口,使用相对简单,但无论使用什么调用dll文件,比较令人头疼的都是JAVA与C之间类型对应与值对应。下面我将项目中对着JNA及jnative的使用总结下。


1.JNA样码


步骤如下:


a,下载JNAjar文件,拷贝至系统根目录或者系统system32下

b,代码很easy



package com.cn.app;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class DLLTEST {

// 1.实现PegRoute.dll 文件接口

public interface PegRoute extends Library {

// 2.PegRoute.dll 中 HCTInitEx方法
public int HCTInitEx(int Version, String pStrCurrentDirectory);
}

public static void main(String[] args) {
//3.加载DLL文件,执行dll方法
PegRoute epen = (PegRoute) Native.loadLibrary("PegRoute",
PegRoute.class);
if (epen != null) {
System.out.println("DLL加载成功!");
int success = epen.HCTInitEx(0,"");
System.out.println("1.设备初始化信息!" + success);
}
}
}



2.Jnative样码

1.下载jnative。jar 及JNativeCpp.dll
2.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下
3.样码


import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.misc.basicStructures.LONG;

public class JNativeT {

static JNative PegRoute = null;

public String init() throws NativeException, IllegalAccessException {
try {
if (PegRoute == null) {
// 1. 利用org.xvolks.jnative.JNative来加载DLL:参数1.PegRoute为类名
// 2.HCTInitEx方法名
PegRoute = new JNative("PegRoute", "HCTInitEx");

// 2.设置要调用方法中的参数:0 表示第一个以此类推
LONG versionLong = new LONG(10);
versionLong.setValue(0);

PegRoute.setParameter(0, Type.LONG, versionLong.toString());
PegRoute.setParameter(1, Type.STRING, "");

// 3.设置返回参数的类型
PegRoute.setRetVal(Type.INT);
// 4.执行方法
PegRoute.invoke();// 调用方法
}
System.out.println("调用的DLL文件名为:" + PegRoute.getDLLName());
System.out.println("调用的方法名为:" + PegRoute.getFunctionName());
// 5.返回值
return PegRoute.getRetVal();
} finally {
if (PegRoute != null) {
// 6.释放系统资源
PegRoute.dispose();
}
}
}

public static void main(String[] args) throws NativeException,
IllegalAccessException {

String mm = new JNativeT().init();
System.out.println(mm);
}
}



要使用的相关jar文件都在下方。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JNative 签名是指在 Java 程序中调用本地(Native)方法时,需要在 Java 代码中提供方法的签名信息,以便正确地传递参数和返回值。 Java 中的方法签名由方法的名称、参数类型和返回值类型组成。在调用 Native 方法时,需要通过 Java 代码中的方法签名来识别和定位具体的本地方法实现。 在 JNative 中,签名是通过使用 JNA 库来实现的。JNA(Java Native Access)是一个 Java 编程库,允许 Java 程序直接调用本地库而无需编写 Native 代码。JNA 提供了一个简单的 Java 接口,通过该接口可以直接声明本地函数的签名。 JNative 使用 JNA 提供的函数声明注解来对本地函数进行签名。在 JNative 中,可以使用诸如 @Function、@Library 等注解来定义本地函数的签名。在这些注解中,可以指定函数的名称、参数类型以及返回值类型,以便 JNative 可以正确地将 Java 语义转换为本地函数的调用。 使用 JNative 进行签名时,需要确保本地函数的签名与 Java 代码中的签名完全匹配。这包括函数名称、参数数量和类型,以及返回值类型等细节。只有当签名匹配时,JNative 才能正确地将传递的参数和返回值从 Java 代码传递到本地函数中,从而实现 Java 和本地代码的无缝集成。 因此,在 JNative 中,签名是非常重要的,它确保了 Java 代码和本地代码之间的正确交互。只有通过正确的签名,才能顺利地调用本地函数,并获得正确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值