简介在JNA中,为了与native函数进行映射,我们可以有两种映射方式,第一种是接口映射,第二种是直接映射。虽然这两个方法不同,但是在具体的方法映射上,我们都需要在JAVA中定义一个映射到native方法的方法。而这个映射在JAVA中是JNA中的一个函数。通过or函数对象,我们可以实现一些非常强大的功能,一起来看看吧。function的定义先看JNA中Function的定义:publicclassFunctionextendsPointer,可以看到Function其实是一个Pointer,指向nativefunction的指针。那么如何获得Function的实例呢?我们知道JNA的流程是先映射Library,再映射Library中的Function。所以我们自然应该能够从Library中获取Function。我们看一下根据Library名称获取函数实例的方法定义:,编码);}this方法可以接受4个参数。前两个参数大家应该都不陌生。第三个参数是callFlags,表示函数调用的标志。函数定义了三个调用标志:publicstaticfinalintC_CONVENTION=0;publicstaticfinalintALT_CONVENTION=0x3F;publicstaticfinalintTHROW_LAST_ERROR=0x40;其中C_CONVENTION表示C语言类型的方法调用。ALT_CONVENTION指示的其他调用方法。THROW_LAST_ERROR表示如果本机函数的返回值非零,将抛出LastErrorException。最后一个参数是encoding,表示字符串的编码方式,实际上是指Javaunicode和native(constchar*)字符串的转换方式。除了根据Libraryname获取Function,JNA还提供了根据Pointer获取Function的方法。publicstaticFunctiongetFunction(Pointerp,intcallFlags,Stringencoding){returnnewFunction(p,callFlags,encoding);}这里的Pointer指的是执行native方法的指针,因为Function本身是继承自Pointer的。所以用Pointer创建Function的本质就是在Pointer的基础上增加一些Function特有的属性。有了Function的定义,更重要的是如何通过Function调用相应的方法。与反射类似,Function中也有一个invoke方法。通过调用invoke,我们可以执行对应Function的函数。Function中的invoke方法有两种,一种是一般的返回对象Object,另一种是有返回值的invoke方法,比如invokeString,invokePointer,invokeInt等Function的实际应用Function的实际使用有点类似于JAVA中的反射。它的工作流程是先获取要加载的NativeLibrary,然后从NativeLibrary中找到要调用的Function,最后调用Function的一些方法。C语言中的printf应该是大家最熟悉的native方法了。让我们看看如何使用Function来调用这个方法:NativeLibrarylib=NativeLibrary.getInstance(Platform.C_LIBRARY_NAME);函数f=lib.getFunction("printf");尝试{f.invoke(getClass(),newObject[]{getName()});fail("无效的返回类型应该抛出异常");}catch(IllegalArgumentExceptione){//expected}可以看到调用过程非常简单。如果是接口Mapping或者直接Mapping的形式,我们还需要自定义一个接口或者类,在里面定义对应的java方法映射。但是如果你使用Function,这些就不需要了。我们可以直接从NativeLibrary中获取对应的函数,最后调用其中的方法。C语言中printf的原型如下:#include
