JNA--Java调用DLL


 

1、 起源

Java原生的调用本地函数(C/C++)的机制是JNI(JavaNative Interface),但是由于其使用的复杂,还需要写C代码,对许多入门级程序员来说实在不是个好的选择。JNA(Java Native Access)Sun公司主导开发的基于JNIjava调用原生函数的机制,是对JNI的再次封装。其优点是,使用简单,只需要编写一个包含指定函数的接口即可。JNA提供了动态的C 语言编写的转发器,可以自动实现Java C 的数据类型映射。而不必像使用JNI一样完全自己去做数据类型映射,不再需要编写那个烦人的C 动态链接库。当然,JNA相比于JNI,效率不高,会有部分性能损失,毕竟是对JNI的扩展。类似的优秀框架还有JNative

2、 数据类型映射(来源于JNA的官方JavaDoc文档首页)

Java types must be chosen to match native types of the samesize. Following are the types supported by the JNA library. (简单类型映射)

Java Type

C Type

Native Representation

boolean

int

32-bit integer (customizable)

byte

char

8-bit integer

char

wchar_t

platform-dependent

short

short

16-bit integer

int

int

32-bit integer

long

long long, __int64

64-bit integer

float

float

32-bit floating point

double

double

64-bit floating point

Buffer
  Pointer 

pointer

platform-dependent (32- or 64-bit  pointer to memory)

<T>[] (array of primitive  type)

pointer
  array

32- or 64-bit pointer to memory  (argument/return)
  contiguous memory (struct member)

 

In addition to the above types, which aresupported at the native layer, the JNA Java library automatically handles thefollowing types. All but NativeMapped and NativeLong are converted to Pointer before being passed to the native layer.(复杂类型映射)

String

char*

NUL-terminated array (native  encoding or jna.encoding)

WString

wchar_t*

NUL-terminated array (unicode)

String[]

char**

NULL-terminated array of C strings

WString[]

wchar_t**

NULL-terminated array of wide C  strings

Structure

struct*
  struct

pointer to struct (argument or  return) (or explicitly)
  struct by value (member of struct) (or explicitly)

Union

union

same as Structure

Structure[]

struct[]

array of structs, contiguous in  memory

Callback

<T> (*fp)()

function pointer (Java or native)

NativeMapped

varies

depends on definition

NativeLong

long

platform-dependent (32- or 64-bit  integer)

PointerType

pointer

same as Pointer

3、 Eclipse中使用DLL

Eclipse中,导入JNAjar包(如jna-3.5.1.jar),在需要使用DLL的项目的根目录下放置.dll文件,使用例子如下:

Dll文件为:MyDll.dll,其中申明的外部可调用方法有:

void   add1(int a,int b);

void   add2(int *a,int*b);//a和b是指向int型的指针

void   add3(int *a,int *b);//a和b是指向int[]的指针

void   add4(int a[],int b[]);

 

对应的java文件JNATest.java:

importcom.sun.jna.ptr.IntByReference;

public interface JNATestextends Library {

 

   JNATest JNATestIntance = (JNATest) Native.loadLibrary(

                     " MyDll ", JNATest.class);

   //c中的函数void   add1(int a,int b);

   public void add1(int a,int b);

   

              //void  add2(int *a,int*b);//a和b是指向int型的指针

   public void add2(IntByReference a,IntByReference b);

   

              //void   add3(int *a,int *b);//a和b是指向int[]的指针

   public void add3(int []a,int []b);

   

               //void  add4(int a[],int b[]);

   public void add4(int []a,int []b);

 

   public static void main(String args[])

   {

      int a=9;

      int b=4;

      int array1={1,4,5};

      int array2={3,1,5};

     JNATest.JNATestIntance.add1(a,b);

     JNATest.JNATestIntance.add2(newIntByReference(a),new IntByReference(b));

     JNATest.JNATestIntance.add3(array1,array2);

     JNATest.JNATestIntance. add4(array1,array2);

   }

}

 

其中IntByReference在表示指向int型的指针,类似的还有ByteByReference, DoubleByReference,

 FloatByReference,LongByReference, NativeLongByReference, PointerByReference,ShortByReference,

W32API.HANDLEByReference, X11.AtomByReference,X11.WindowByReference

PointerByReference 类表示指向指针的指针。

 

当然,涉及指针时也可以使用Pointer这个类,它是一个单例,不允许用构造函数创建。可以使用PointerType自定义。具体实现参考JavaDoc文档。Pointer使用:

import com.sun.jna.ptr.IntByReference;

public interface JNATestextends Library {

 

   JNATest JNATestIntance = (JNATest) Native.loadLibrary(

                     "Sense2020Dll", JNATest.class);

   //c中的函数void   add1(int a,int b);

   public void add1(int a,int b);

   

              //void   add2(int *a,int*b);//a和b是指向int型的指针

   public void add2(Pointer a,Pointer b);

 

   public static void main(String args[])

   {

      int a=9;

      int b=4;

      JNATest.JNATestIntance.add1(a,b);

      JNATest.JNATestIntance.add2(newIntByReference(a). getPointer(),

                           newIntByReference(b).     getPointer());

      

   }

}

 


 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: jna-5.9.0.jar是Java Native Access(JNA)的一个软件包。JNA是一个Java编程语言的库,用于访问本地平台特定的API,如Microsoft Windows上的Win32 API和Linux上的POSIX。这个库允许Java开发人员直接与本地代码交互,从而充分利用本地平台功能,提高应用程序的性能和功能。 使用JNAJava开发人员可以调用一个本地库中的函数或动态链接库,并使其在Java应用程序中可用。在调用本地方法时,不需要手动编写JNI(Java Native Interface)代码,只需编写Java参数和返回类型的映射。这使得JNA在开发跨平台程序时特别有用。 jna-5.9.0.jar是JNA的最新版本,它包括了许多新的特性和改进,例如性能、安全性和自定义类型等。此外,它还包括许多实用程序和示例,提供了丰富的资源和文档,使得Java开发人员可以更轻松地理解和使用JNA。 总之,jna-5.9.0.jar是一个非常重要的软件包,它为Java开发人员提供了一种强大的方式来访问本地平台功能,使得Java应用程序可以更加高效和功能丰富。 ### 回答2: jna-5.9.0.jar是Java Native Access(JNA)框架的一个版本,该框架允许Java应用程序直接访问本地机器上的原生库。它提供了一个纯Java库,可以轻松的调用本地库函数,而不需要手动编写JNI代码。这个框架可以帮助Java程序员通过本地代码来提供更高的性能和更大的灵活性。 JNA框架在操作系统和其他原生库之间提供了一个接口层,Java程序员可以自由地使用Java API来调用原生库。这使得Java开发者可以使用原生的操作系统调用和底层硬件,从而实现更高效、更具响应性的程序。在很多应用中,JNA可以显着提高性能和扩展性,从而使得应用程序更加稳定和可靠。 jna-5.9.0.jar提供了一些新的特性和改进,例如支持Java 14和15,通过内联函数来提高性能,以及对Windows 11和macOS Monterey的支持。此外,该版本还修复了一些bugs和其它问题,以提供更好的用户体验。 总之,jna-5.9.0.jar是一个值得关注的框架版本,它能够帮助Java程序员更便捷地访问原生库,从而实现更高效、更具响应性的程序。 ### 回答3: jna-5.9.0.jar是Java Native Access(JNA)的Java包。它提供了一种简单的Java API,可用于为所有平台编写和使用本机程序库,而无需编写任何本机代码或尝试了解平台特定的C或C ++ API。JNA通过使用Java的反射功能来自动查找本机函数和数据类型来实现这一点。此外,JNA还提供了对所有平台的动态链接共享库(DLL或SO文件)进行加载和处理的功能。由于JNAJava代码,因此它可以很容易地部署和集成到Java应用程序中,并且避免了编写平台依赖的本机代码的繁琐工作。通过使用JNAJava程序员可以直接调用底层的本机API,无需了解底层操作系统。选择使用JNA,可以提高开发效率和代码复用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值