Java通过JNA调用系统API,java jfinal
00-1010函数定义介绍函数实际应用总结
00-1010在JNA,为了用原生函数映射,我们可以有两种映射方式,第一种是接口映射,第二种是直接映射。虽然两种方法不同,但是在具体的方法映射中,我们都需要在JAVA中定义一个方法,与原生方法进行映射。
JAVA中的这种映射是JNA的一个功能。或者通过函数对象,我们可以实现一些非常强大的功能。让我们看一看。
目录
先来看下JNA中Function的定义:
public Function extends Pointer可以看出,函数实际上是一个指针,指向native function的指针。
那么如何获得函数的实例呢?
我们知道JNA过程是先映射库,再映射库中的函数。所以自然地,我们应该能够从库中获取函数。
我们看一下根据Library name得到function实例的方法定义:
公共静态函数getFunction(String libraryName,String functionName,int callFlags,String encoding){ return native library . getinstance(library name)。getFunction(函数名,调用标志,编码);}这个方法可以接受四个参数。前两个参数您应该很熟悉。第三个参数是callFlags,表示函数调用的标志。函数定义了三个调用标志:
public static final int C _ conventi on=0;public static final int ALT _ conventi on=0x3F;public static final int THROW _ LAST _ ERROR=0x 40;C_CONVENTION表示C语言类型的方法调用。
ALT_CONVENTION指示的其他呼叫模式。
THROW_LAST_ERROR是指如果原生函数的返回值非零,就会抛出LastErrorException。
最后一个参数是encoding,表示字符串的编码,实际指的是Java unicode和native (const char*)字符串之间的转换。
除了根据库名获取函数,JNA还提供了根据指针获取函数的方法。
公共静态函数getFunction(指针p,int callFlags,字符串编码){返回新函数(p,callFlags,编码);}这里的指针指的是执行原生方法的指针,因为函数本身是继承自指针的。所以用指针创建函数的本质就是在指针的基础上增加一些函数特有的属性。
有了函数的定义,更重要的是通过函数调用相应的方法。与反射类似,函数中也有invoke方法。通过调用invoke,我们可以执行相应函数的功能。
函数中的调用方法有两种,一种是一般的返回对象Object,一种是有返回值的调用方法,比如调用string、调用指针、调用int等。
简介
函数的实际使用有点类似于JAVA中的反射。它的工作流程是先获取要加载的NativeLibrary,然后从NativeLibrary中找到要调用的函数,最后调用函数的一些方法。
C语言的Printf应该是大家最熟悉的原生方法。让我们来看看如何使用函数来调用这个方法:
可以看到调用过程非常简洁。如果是接口映射或者直接映射的形式,我们还需要自定义一个接口或者类,在里面定义一个对应的java方法映射。但是如果使用函数,这些就不需要了。我们可以直接从NativeLibrary中获取相应的函数,最后调用其中的方法。
C语言中的printf的原型如下:
# include stdio . hint printf(const char *格式,);带有返回值的Printf。如果要输出这个返回值,可以在Function中调用invokeInt命令。
我们再来看一个有返回值的调用例子:
本地库lib=本地库。getinstance(平台.c _库_名);函数f=lib。getfunction( printf );Object[]args=new Object[Function .MAX _ NARGS 1];//确保我们没有中断" printf " args[0]=getName();请尝试{ f . invoke int(args);失败(参数应限于函数. MAX _ NAR GS);} catch(UnsupportedOperationException e){//应为}
function的定义
使用功能可以减少手写绘图的工作,在某些情况下是非常好用的,但是功能的引起支持类型映射器,并不支持函数映射器,所以在使用中还是有一些限制。
到此这篇关于爪哇岛高级用法之美甲师协会中的功能的文章就介绍到这了,更多相关爪哇岛中的功能内容请搜索盛行信息技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。