亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java高級(jí)用法之JNA中的Function

 更新時(shí)間:2022年04月18日 16:16:25   作者:程序那些事  
這篇文章主要介紹了java高級(jí)用法之JNA中的Function,JAVA中的映射在JNA中就是一個(gè)function。通過(guò)或者function對(duì)象,我們可以實(shí)現(xiàn)一些非常強(qiáng)大的功能,下面一起進(jìn)入文章看看具體內(nèi)容吧

簡(jiǎn)介

在JNA中,為了和native的function進(jìn)行映射,我們可以有兩種mapping方式,第一種是interface mapping,第二種是direct mapping。雖然兩種方式不同,但是在具體的方法映射中,我們都需要在JAVA中定義一個(gè)和native方法進(jìn)行映射的方法。

而這個(gè)JAVA中的映射在JNA中就是一個(gè)function。通過(guò)或者function對(duì)象,我們可以實(shí)現(xiàn)一些非常強(qiáng)大的功能,一起看看吧。

function的定義

先來(lái)看下JNA中Function的定義:

public class Function extends Pointer

可以看到Function實(shí)際上是一個(gè)Pointer,指向的是native function的指針。

那么怎么得到一個(gè)Function的實(shí)例呢?

我們知道JNA的流程是先進(jìn)行Library的映射,然后再對(duì)Library中的Function進(jìn)行映射。所以很自然的我們應(yīng)該可以從Library中得到Function。

我們看一下根據(jù)Library name得到function實(shí)例的方法定義:

public static Function getFunction(String libraryName, String functionName, int callFlags, String encoding) {
        return NativeLibrary.getInstance(libraryName).getFunction(functionName, callFlags, encoding);
    }

這個(gè)方法可以接受4個(gè)參數(shù),前面兩個(gè)參數(shù)大家應(yīng)該很熟悉了,第三個(gè)參數(shù)是callFlags,表示的是函數(shù)調(diào)用的flags,F(xiàn)unction定義了三個(gè)callFlags:

    public static final int C_CONVENTION = 0;

    public static final int ALT_CONVENTION = 0x3F;

    public static final int THROW_LAST_ERROR = 0x40;

其中C_CONVENTION表示的是C語(yǔ)言類(lèi)型的方法調(diào)用。

ALT_CONVENTION表示的其他的調(diào)用方式。

THROW_LAST_ERROR表示如果native函數(shù)的返回值是非零值的時(shí)候,將會(huì)拋出一個(gè)LastErrorException。

最后一個(gè)參數(shù)是encoding,表示的是字符串的編碼方式,實(shí)際上指的是 Java unicode和native (const char*) strings 的轉(zhuǎn)換方式。

除了根據(jù)Library name獲取Function之外,JNA還提供了根據(jù)Pointer來(lái)獲取Function的方法。

    public static Function getFunction(Pointer p, int callFlags, String encoding) {
        return new Function(p, callFlags, encoding);
    }

這里的Pointer指的是一個(gè)執(zhí)行native方法的指針,因?yàn)镕unction本身就是繼承自Pointer。所以跟Pointer來(lái)創(chuàng)建Function的本質(zhì)就是在Pointer的基礎(chǔ)上添加了一些Function特有的屬性。

有了Function的定義,更為重要的是如何通過(guò)Function來(lái)調(diào)用對(duì)應(yīng)的方法。跟反射很類(lèi)似,F(xiàn)unction中也有一個(gè)invoke方法,通過(guò)調(diào)用invoke,我們就可以執(zhí)行對(duì)應(yīng)的Function的功能。

Function中的invoke方法有兩種,一種是通用的返回對(duì)象Object,一種是帶有返回值的invoke方法,比如invokeString,invokePointer,invokeInt等。

Function的實(shí)際應(yīng)用

Function的實(shí)際使用和JAVA中的反射有點(diǎn)類(lèi)似,其工作流程是首先獲得要加載的NativeLibrary,然后從該NativeLibrary中找到要調(diào)用的Function,最后invoke該Function的某些方法。

C語(yǔ)言中的printf應(yīng)該是大家最熟悉的native方法了。我們看一下如何使用Function來(lái)調(diào)用這個(gè)方法吧:

可以看到調(diào)用的流程非常簡(jiǎn)潔。如果是用interface Mapping或者direct Mapping的形式,我們還需要自定義一個(gè)interface或者class,并且在其中定義一個(gè)相應(yīng)的java方法映射。但是如果使用Function的話,這些都不需要了。我們直接可以從NativeLibrary中拿到對(duì)應(yīng)的函數(shù),并最終調(diào)用其中的方法。

C語(yǔ)言中的printf的原型如下:

# include <stdio.h>
int printf(const char *format, ...);

printf帶有返回值的,如果要輸出這個(gè)返回值,則可以調(diào)用Function中的invokeInt命令。

我們?cè)賮?lái)看一個(gè)有返回值的調(diào)用例子:

NativeLibrary lib = NativeLibrary.getInstance(Platform.C_LIBRARY_NAME);
        Function f = lib.getFunction("printf");
        Object[] args = new Object[Function.MAX_NARGS+1];
        // Make sure we don't break 'printf'
        args[0] = getName();
        try {
            f.invokeInt(args);
            fail("Arguments should be limited to " + Function.MAX_NARGS);
        } catch(UnsupportedOperationException e) {
            // expected
        }

總結(jié)

使用Function可以減少手寫(xiě)Mapping的工作,在某些情況下是非常好用的,但是Function的invoke支持TypeMapper,并不支持FunctionMapper,所以在使用中還是有一些限制。

到此這篇關(guān)于java高級(jí)用法之JNA中的Function的文章就介紹到這了,更多相關(guān)java 中的Function內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot中的@Order如何使用

    Springboot中的@Order如何使用

    本文主要介紹了Springboot中的@Order如何使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 淺談多線程_讓程序更高效的運(yùn)行

    淺談多線程_讓程序更高效的運(yùn)行

    下面小編就為大家?guī)?lái)一篇淺談多線程_讓程序更高效的運(yùn)行。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • IntelliJ IDEA 安裝及初次使用圖文教程(2020.3.2社區(qū)版)

    IntelliJ IDEA 安裝及初次使用圖文教程(2020.3.2社區(qū)版)

    這篇文章主要介紹了IntelliJ IDEA 安裝及初次使用(2020.3.2社區(qū)版),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java線程中的interrupt詳解

    Java線程中的interrupt詳解

    這篇文章主要介紹了Java線程中的interrupt詳解,interrupt翻譯成中文為“打斷”的意思,但實(shí)際上,interrupt()方法并非將一個(gè)線程打中斷的意思,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • Guava的注解處理機(jī)制全面講解

    Guava的注解處理機(jī)制全面講解

    這篇文章主要為大家介紹了Guava的注解處理機(jī)制全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • JDK  keytool證書(shū)工具功能代碼解析

    JDK keytool證書(shū)工具功能代碼解析

    這篇文章主要介紹了JDK keytool證書(shū)工具功能代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • java導(dǎo)出大批量(百萬(wàn)以上)數(shù)據(jù)的excel文件

    java導(dǎo)出大批量(百萬(wàn)以上)數(shù)據(jù)的excel文件

    這篇文章主要為大家詳細(xì) 介紹了java導(dǎo)出大批量即百萬(wàn)以上數(shù)據(jù)的excel文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表的示例代碼

    springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表的示例代碼

    本文主要介紹了springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java使用renderer將pdf按頁(yè)轉(zhuǎn)換為圖片

    java使用renderer將pdf按頁(yè)轉(zhuǎn)換為圖片

    這篇文章主要為大家詳細(xì)介紹了java使用renderer將pdf按頁(yè)轉(zhuǎn)換為圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 深度解析Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景

    深度解析Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景

    這篇文章主要介紹了Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景,通過(guò)JVM的機(jī)制來(lái)分析volatile關(guān)鍵字在線程編程中的作用,需要的朋友可以參考下
    2015-12-12

最新評(píng)論