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

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)文章

  • Springboot中的@Order如何使用

    Springboot中的@Order如何使用

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

    淺談多線程_讓程序更高效的運行

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

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

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

    Java線程中的interrupt詳解

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

    Guava的注解處理機制全面講解

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

    JDK keytool證書工具功能代碼解析

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

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

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

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

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

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

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

    深度解析Java中volatile的內(nèi)存語義實現(xiàn)以及運用場景

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

最新評論