欢迎来到天天文库
浏览记录
ID:9281488
大小:22.56 KB
页数:11页
时间:2018-04-26
《jna(转自csdn沈东良)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、介绍给大家介绍一个最新的访问本机代码的Java框架—JNA。JNA(JavaNativeAccess)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。JNA项目地址:https://jna.dev.java.net/ 非常强大、易用,功能上类似与.NET的P/Invoke。 不堪回首的JNI我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的。如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个
2、.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的 dll/so中公布的函数。然后再在Java中载入这个适配器dll/so,再编写Java native函数作为dll中函数的代理。经过2个繁琐的步骤才能在Java中调用本地代码。因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点! .NET平台上强大的P/Invoke而在.NET平台上,强大的P/Invoke技术使我们
3、Java程序员非常羡慕。使用P/Invoke技术,只需要使用编写一个.NET函数,再加上一个声明的标注,就可以直接调用dll中的函数。不需要你再使用C语言编写dll来适配。 不逊于P/Invoke的JNA现在,不需要再羡慕.NET的P/Invoke机制了。JNA把对dll/.so共享库的调用减少到了和P/Invoke相同的程度。 使用JNA,不需要再编写适配用的.dll/.so,只需要在Java中编写一个接口和一些代码,作为.dll/.so的代理,就可以在Java程序中调用dll/so。 JNA快速
4、启动 现在让我们直接进入JNA的世界。 你只需要下载一个jar包,就可以使用JNA的强大功能方便地调用动态链接库中的C函数。1,下载jna.jar。在这里https://jna.dev.java.net/servlets/ProjectDocumentList?folderID=7408&expandFolder=7408&folderID=0 2,现在你已经可以使用JNA了。为了方便你参考JNA的java类库,我制作了《JNA3.09API参考手册》,是CHM格式的。你可以到这里下载htt
5、p://download.csdn.net/source/900438 JNA例子 例子1 现在让我们运行一个JNA程序,感受它的强大威力。1,在Java项目中引入jna.jar包。2,创建一个类: importcom.sun.jna.Library;importcom.sun.jna.Native;importcom.sun.jna.Platform; /**Simpleexampleofnativelibrarydeclarationandusage.*/publicclassHelloW
6、orld{ publicinterfaceCLibraryextendsLibrary{ CLibraryINSTANCE=(CLibrary) Native.loadLibrary((Platform.isWindows()?"msvcrt":"c"), CLibrary.class); voidprintf(Stringformat,Object...args); }
7、 publicstaticvoidmain(String[]args){ CLibrary.INSTANCE.printf("Hello,World/n"); for(inti=0;i8、序实际上是使用msvcrt.dll这个C运行时库中的printf函数打印出上面这些字符的。 看,多简单,不需要写一行C代码,就可以直接在Java中调用外部动态链接库中的函数! 例子2 上面那个例子使用了操作系统自带的动态链接库,现在我们再自己写一个动态链接库试试。 1,在VS中选择C++语言,然后选择创建一个Win32程序。 选择dll类型。 2,发布的C函数是: #define MYLIBAPI extern
8、序实际上是使用msvcrt.dll这个C运行时库中的printf函数打印出上面这些字符的。 看,多简单,不需要写一行C代码,就可以直接在Java中调用外部动态链接库中的函数! 例子2 上面那个例子使用了操作系统自带的动态链接库,现在我们再自己写一个动态链接库试试。 1,在VS中选择C++语言,然后选择创建一个Win32程序。 选择dll类型。 2,发布的C函数是: #define MYLIBAPI extern
此文档下载收益归作者所有