最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java高級用法之JNA中的Function

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

簡介

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

而這個JAVA中的映射在JNA中就是一個function。通過或者function對象,我們可以實現(xiàn)一些非常強大的功能,一起看看吧。

function的定義

先來看下JNA中Function的定義:

public class Function extends Pointer

可以看到Function實際上是一個Pointer,指向的是native function的指針。

那么怎么得到一個Function的實例呢?

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

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

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

這個方法可以接受4個參數(shù),前面兩個參數(shù)大家應(yīng)該很熟悉了,第三個參數(shù)是callFlags,表示的是函數(shù)調(diào)用的flags,F(xiàn)unction定義了三個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語言類型的方法調(diào)用。

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

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

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

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

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

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

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

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

Function的實際應(yīng)用

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

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

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

C語言中的printf的原型如下:

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

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

我們再來看一個有返回值的調(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可以減少手寫Mapping的工作,在某些情況下是非常好用的,但是Function的invoke支持TypeMapper,并不支持FunctionMapper,所以在使用中還是有一些限制。

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

相關(guān)文章

  • MyBatis獲取插入記錄的自增長字段值(ID)

    MyBatis獲取插入記錄的自增長字段值(ID)

    本文分步驟給大家介紹了MyBatis獲取插入記錄的自增長字段值的方法,在文中給大家提到了mybatis返回插入數(shù)據(jù)的自增長id,需要的朋友可以參考下
    2017-11-11
  • springboot獲取微信JSDK簽名信息的實現(xiàn)示例

    springboot獲取微信JSDK簽名信息的實現(xiàn)示例

    本文介紹了如何在Spring Boot應(yīng)用中獲取微信JSDK的簽名信息,包括獲取接口URL、參數(shù)設(shè)置、簽名算法和獲取簽名結(jié)果的步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java調(diào)用DeepSeek?api實現(xiàn)方法記錄

    Java調(diào)用DeepSeek?api實現(xiàn)方法記錄

    這篇文章主要介紹了如何在Java中調(diào)用DeepSeek?API,包括在官網(wǎng)獲取APIKeys、創(chuàng)建API請求工具類以及處理返回結(jié)果的步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • Java中實現(xiàn)在一個方法中調(diào)用另一個方法

    Java中實現(xiàn)在一個方法中調(diào)用另一個方法

    下面小編就為大家分享一篇Java中實現(xiàn)在一個方法中調(diào)用另一個方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Java的split方法使用詳解

    Java的split方法使用詳解

    這篇文章主要詳細(xì)介紹了Java的split方法使用說明,十分的細(xì)致全面,有需要的小伙伴可以參考下。
    2015-07-07
  • 淺談Spring 重定向指南

    淺談Spring 重定向指南

    本篇文章主要介紹了淺談Spring 重定向指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 關(guān)于synchronized的參數(shù)及其含義

    關(guān)于synchronized的參數(shù)及其含義

    這篇文章主要介紹了synchronized的參數(shù)及其含義詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 一文盤點Java創(chuàng)建實例對象的方式

    一文盤點Java創(chuàng)建實例對象的方式

    Java對象是通過加載、鏈接、初始化三大步驟來完成對象的創(chuàng)建及初始化,那么接下來就說一下Java創(chuàng)建實例對象的方式有哪幾種,文中并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 詳解Mybatis Generator的具體使用教程

    詳解Mybatis Generator的具體使用教程

    Mybatis Generator可以幫助我們自動生成很多結(jié)構(gòu)化的代碼,比如每張表對應(yīng)的Entity、Mapper接口和Xml文件,可以省去很多繁瑣的工作,今天通過本文給大家介紹Mybatis Generator的具體使用教程,感興趣的朋友一起看看吧
    2022-02-02
  • IDEA2021.2永久激活碼最新超詳細(xì)(激活到2099)

    IDEA2021.2永久激活碼最新超詳細(xì)(激活到2099)

    這篇文章主要介紹了IDEA2021.2永久激活碼,是idea2021版最新激活方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

塔城市| 长丰县| 天水市| 郁南县| 易门县| 乌什县| 十堰市| 明溪县| 湾仔区| 濮阳县| 秦安县| 芜湖市| 永修县| 犍为县| 怀仁县| 东源县| 理塘县| 荃湾区| 鹤庆县| 吉木萨尔县| 巴南区| 修文县| 徐闻县| 屏东市| 益阳市| 光泽县| 天祝| 勐海县| 余江县| 嘉定区| 宽甸| 定南县| 宽甸| 司法| 来凤县| 曲沃县| 班玛县| 永泰县| 新竹市| 石柱| 杂多县|