上海莫尔丽信息科技有限公司 > 产品展示 >

Java Native Interface(JNA)介绍
发布于2025-02-19 17:37 文章作者:妙双
JNA引见
JNA(Java Native Access )供给1组Java对象类用于正在运转期动静拜候体系当地库(native library:如Window的dll)而没有须要编写所有Native/JNI代码。开辟职员只需正在1个java交心中描写方针native library的函数取布局,JNA将主动完毕Java交心到native function的映照。
https://github.com/java-native-access/jna
http://java-native-access.github.io/jna/5.2.0/javadoc/
长处
JNA能够让您像移用普通java办法一致曲交挪用内陆办法。便战曲交施行内地办法好没有多,并且挪用要地办法借不必特地的其余处置大概设备甚么的,也没有须要过剩的援用大概编码,应用很便当。
JNA描写
JNA类库应用1个很小的要地类库sub 动静的挪用内地代码。次序员只须要应用1个特定的java交心描写1停将要挪用的内地代码的办法的构造战少少根本属性。如许便省了为了适配多个仄台而洪量的摆设战编译代码。由于挪用的皆是JNA供给的公用jar 包中的交心。
差池
JNA是创立正在JNI技能底子之上的1个Java类库,本去应用JNI,您必需脚工用C写1个动静链交库,正在C发言中映照Java的数据类别。JNA中,它供应了1个动静的C发言编写的转收器,能够主动兑现Java战C的数据范例映照。您没有再须要编写C动静链交库。固然,那也表示着,应用JNA技能比应用JNI技能挪用动静链交库会有些微的功能益得。大概快度会落矮几倍。但浸染没有年夜。
对于jna-platform
本来许多环境停,jna.jar便完好知足普通名目开辟的须要了,例如数据 范例的映照战经常使用的办法等等,那些C/C++中底子的映照一经能够兑现,包含少少根基的仄台办法,然则,确凿波及到对照深远的仄台办法的时分,便须要platform.jar的资助了,platform.jar是依靠于jna.jar达成的,包含了FileMonitor、FileUtils、KeyboardUtils、WindowUtil等Win32战争台相干的简化动静拜候功效类中的年夜个人经常使用办法,为开辟者开辟本身的跨仄台映照办法供给参照。
因此,platform.jar对待jna.jar是1种弥补战扩大,jna.jar相称于核,platfrorm.jar十分于删量插件。
Maven援用:
<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.5.1</version></dependency><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna-platform</artifactId><version>4.5.1</version></dependency>应用的函数必需取链交库中的函数原形维持分歧,那是JNA以至全部跨仄台挪用的易面,原因C/C++的典型取Java的类别是没有一致的,您必需调动成java对于应典型让它们坚持分歧,那便是规范映照(Type Mappings),JNA民圆给出的默许类别映照表以下:
个中范例映照的易面正在于构造体、指针战函数归调。
示例代码,挨启1个Win窗心:
packagecom.mt.test.jna;importcom.sun.jna.Callback;importcom.sun.jna.platform.win32.Kernel32;importcom.sun.jna.platform.win32.Kernel32Util;importcom.sun.jna.platform.win32.User32;importcom.sun.jna.platform.win32.User32Util;importcom.sun.jna.platform.win32.WinDef;importcom.sun.jna.platform.win32.WinUser;publicclassCWindow{publicstaticvoidmain(String[]args){CWindowwin=newCWindow();win.test();}classWindowProcimplementsCallback{publicWinDef.LRESULTcallback(WinDef.HWNDhwnd,WinDef.UINTuMsg,WinDef.WPARAMwParam,WinDef.LPARAMlParam){switch(uMsg.intValue()){caseWinUser.WM_CLOSE:User32.INSTANCE.PostQuitMessage(0);break;}returnUser32.INSTANCE.DefWindowProc(hwnd,uMsg.intValue(),wParam,lParam);}}publicbooleantest(){StringwndClassName="窗心备案称呼";StringwndTitle="那是窗心题目";WinDef.HINSTANCEhInstance=null;WinUser.WNDCLASSEXwndClassEx=newWinUser.WNDCLASSEX();wndClassEx.lpfnWndProc=newWindowProc();wndClassEx.cbClsExtra=0;wndClassEx.cbWndExtra=0;wndClassEx.style=1|2;wndClassEx.lpszClassName=wndClassName;wndClassEx.hInstance=hInstance;wndClassEx.hCursor=null;wndClassEx.hIcon=null;wndClassEx.hbrBackground=null;wndClassEx.lpszMenuName=null;if(User32.INSTANCE.RegisterClassEx(wndClassEx).intValue()==0){System.out.println("registerwindowfailed!");System.out.println(""+Kernel32.INSTANCE.GetLastError()+"\n"+Kernel32Util.getLastErrorMessage());returnfalse;}WinDef.HWNDhWnd=User32Util.createWindowEx(0,wndClassName,wndTitle,WinUser.WS_OVERLAPPEDWINDOW,100,100,500,400,null,null,hInstance,null);if(hWnd==null){System.out.println("createwindowfailed!");System.out.println(""+Kernel32.INSTANCE.GetLastError()+"\n"+Kernel32Util.getLastErrorMessage());returnfalse;}User32.INSTANCE.ShowWindow(hWnd,WinUser.SW_SHOWNORMAL);User32.INSTANCE.UpdateWindow(hWnd);WinUser.MSGmsg=newWinUser.MSG();while(User32.INSTANCE.GetMessage(msg,hWnd,0,0)!=0){User32.INSTANCE.TranslateMessage(msg);User32.INSTANCE.DispatchMessage(msg);}returntrue;}}END
推举您浏览更多相关于“ 通讯JNIJNAplatformC++dll ”的著作