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

java高級用法之JNA中使用類型映射

 更新時間:2022年03月30日 10:58:47   作者:程序那些事  
JNA中有很多種映射,本文主要介紹了java高級用法之JNA中使用類型映射,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

簡介

JNA中有很多種映射,library的映射,函數(shù)的映射還有函數(shù)參數(shù)和返回值的映射,libary和函數(shù)的映射比較簡單,我們在之前的文章中已經(jīng)講解過了,對于類型映射來說,因為JAVA中的類型種類比較多,所以這里我們將JNA的類型映射提取出來單獨講解。

類型映射的本質(zhì)

我們之前提到在JNA中有兩種方法來映射JAVA中的方法和native libary中的方法,一種方法叫做interface mapping,一種方式叫做direct mapping。

但是我們有沒有考慮過這兩種映射的本質(zhì)是什么呢?

比如native有一個方法,我們是如何將JAVA代碼中的方法參數(shù)傳遞給native方法,并且將native方法的返回值轉(zhuǎn)換成JAVA中函數(shù)的返回類型呢?

答案就是序列化。

因為本質(zhì)上一切的交互都是二進制的交互。JAVA類型和native類型進行轉(zhuǎn)換,最簡單的情況就是JAVA類型和native類型底層的數(shù)據(jù)長度保持一致,這樣在進行數(shù)據(jù)轉(zhuǎn)換的時候就會更加簡單。

我們看下JAVA類型和native類型的映射和長度關系:

C TypeNative類型的含義Java Type
char8-bit整型byte
wchar_t和平臺相關char
short16-bit整型short
int32-bit整型int
intboolean flagboolean
enum枚舉類型int (usually)
long long, __int6464-bit整型long
float32-bit浮點數(shù)float
double64-bit浮點數(shù)double
pointer (e.g. void*)平臺相關Buffer Pointer
pointer (e.g. void*), array平臺相關

[] (原始類型數(shù)組)

上面的JAVA類型都是JDK自帶的類型(Pointer除外)。

除了JAVA自帶的類型映射,JNA內(nèi)部也定義了一些數(shù)據(jù)類型,可以跟native的類型進行映射:

C TypeNative類型的含義Java Type
long和平臺相關(32- or 64-bit integer)NativeLong
const char*字符串 (native encoding or jna.encoding)String
const wchar_t*字符串 (unicode)WString
char**字符串數(shù)組String[]
wchar_t**字符串數(shù)組(unicode)WString[]
void**pointers數(shù)組Pointer[]
struct* struct結(jié)構(gòu)體指針和結(jié)構(gòu)體Structure
union結(jié)構(gòu)體Union
struct[]結(jié)構(gòu)體數(shù)組Structure[]
void (*FP)()函數(shù)指針 (Java or native)Callback
pointer ( *)指針PointerType
other整數(shù)類型IntegerType
other自定義映射類型NativeMapped

TypeMapper

除了定義好的映射關系之外,大家也可以使用TypeMapper來對參數(shù)類型進行自定義轉(zhuǎn)換,先來看下TypeMapper的定義:

public interface TypeMapper {

    FromNativeConverter getFromNativeConverter(Class<?> javaType);

    ToNativeConverter getToNativeConverter(Class<?> javaType);
}

TypeMapper是一個interface,它定義了兩個converter方法,分別是getFromNativeConverter和getToNativeConverter。

如果要使用TypeMapper則需要實現(xiàn)它而這兩個方法即可。我們看一下官方的W32APITypeMapper是怎么實現(xiàn)的:

 TypeConverter stringConverter = new TypeConverter() {
                @Override
                public Object toNative(Object value, ToNativeContext context) {
                    if (value == null)
                        return null;
                    if (value instanceof String[]) {
                        return new StringArray((String[])value, true);
                    }
                    return new WString(value.toString());
                }
                @Override
                public Object fromNative(Object value, FromNativeContext context) {
                    if (value == null)
                        return null;
                    return value.toString();
                }
                @Override
                public Class<?> nativeType() {
                    return WString.class;
                }
            };
            addTypeConverter(String.class, stringConverter);
            addToNativeConverter(String[].class, stringConverter);

首先定義一個TypeConverter,在TypeConverter中實現(xiàn)了toNative,fromNative和nativeType三個方法。在這個例子中,native type是WString,而JAVA type是String。而這個TypeConverter就是最終要使用的FromNativeConverter和ToNativeConverter。

有了typeMapper,應該怎么使用呢?最簡單的方法就是將其添加到Native.load的第三個參數(shù)中,如下所示:

 TestLibrary lib = Native.load("testlib", TestLibrary.class, Collections.singletonMap(Library.OPTION_TYPE_MAPPER, mapper));

NativeMapped

TypeMapper需要在調(diào)用Native.load方法的時候傳入,從而提供JAVA類型和native類型的轉(zhuǎn)換關系。TypeMapper可以看做是類型轉(zhuǎn)換關系的外部維護者。

可能很多朋友已經(jīng)想到了,既然能在JAVA類型外部維護轉(zhuǎn)換關系,那么可不可以在JAVA類型本身對這個轉(zhuǎn)換關系進行維護呢?答案是肯定的,我們只需要在要實現(xiàn)轉(zhuǎn)換類型關系的JAVA類型實現(xiàn)NativeMapped接口即可。

先來看下NativeMapped接口的定義:

public interface NativeMapped {

    Object fromNative(Object nativeValue, FromNativeContext context);

    Object toNative();

    Class<?> nativeType();
}

可以看到NativeMapped中定義要實現(xiàn)的方法基本上和FromNativeConverter、ToNativeConverter中定義的方法一致。

下面舉一個具體的例子來說明一下NativeMapped到底應該怎么使用。首先我們定義一個enum類實現(xiàn)NativeMapped接口:

    public enum TestEnum implements NativeMapped {
        VALUE1, VALUE2;

        @Override
        public Object fromNative(Object nativeValue, FromNativeContext context) {
            return values()[(Integer) nativeValue];
        }

        @Override
        public Object toNative() {
            return ordinal();
        }

        @Override
        public Class<?> nativeType() {
            return Integer.class;
        }
    }

這個類實現(xiàn)了從Integer到TestEnum枚舉的轉(zhuǎn)換。

要想使用該TestEnum類的話,需要定義一個interface:

    public static interface EnumerationTestLibrary extends Library {
        TestEnum returnInt32Argument(TestEnum arg);
    }

具體調(diào)用邏輯如下:

EnumerationTestLibrary lib = Native.load("testlib", EnumerationTestLibrary.class);
assertEquals("Enumeration improperly converted", TestEnum.VALUE1, lib.returnInt32Argument(TestEnum.VALUE1));
assertEquals("Enumeration improperly converted", TestEnum.VALUE2, lib.returnInt32Argument(TestEnum.VALUE2));

可以看到,因為NativeMapped中已經(jīng)包含了類型轉(zhuǎn)換的信息,所以不需要再指定TypeMapper了。

注意,這里用到了testlib,這個testlib是從JNA的native模塊中編譯出來的,如果你是MAC環(huán)境的話可以拷貝JNA代碼,運行ant native即可得到,編譯完成之后,將這個libtestlib.dylib拷貝到你項目中的resources目錄下面darwin-aarch64或者darwin-x86即可。

有不會的同學,可以聯(lián)系我。

總結(jié)

本文講解了JNA中的類型映射規(guī)則和自定義類型映射的方法。

本文的代碼:https://github.com/ddean2009/learn-java-base-9-to-20

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

相關文章

  • Springboot基于websocket實現(xiàn)簡單在線聊天功能

    Springboot基于websocket實現(xiàn)簡單在線聊天功能

    這篇文章主要介紹了Springboot基于websocket實現(xiàn)簡單在線聊天功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot中自定義首頁(默認頁)及favicon的方法

    SpringBoot中自定義首頁(默認頁)及favicon的方法

    這篇文章主要介紹了SpringBoot中如何自定義首頁(默認頁)及favicon,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Servlet機制Pushlet原理及用法詳解

    Servlet機制Pushlet原理及用法詳解

    這篇文章主要介紹了Servlet機制Pushlet原理及用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • java中如何截取字符串最后一位

    java中如何截取字符串最后一位

    這篇文章主要介紹了java中如何截取字符串最后一位的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 解決maven父子工程install的時候排除某些子模塊,讓子模塊不install問題

    解決maven父子工程install的時候排除某些子模塊,讓子模塊不install問題

    在Maven父子工程中,如果希望某個子模塊不被安裝到本地倉庫,可以在該子模塊的`pom.xml`文件中添加以下配置: ```xml ... org.apache.maven.plugins maven-install-plugin 2.5.2 true
    2024-12-12
  • Java項目中防止SQL注入的四種方案總結(jié)

    Java項目中防止SQL注入的四種方案總結(jié)

    SQL注入是一種代碼注入技術(shù),通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意的SQL命令,下面我們就來看看如何在項目中防止SQL注入吧
    2023-10-10
  • Java連接MQ實現(xiàn)信息查詢的操作過程

    Java連接MQ實現(xiàn)信息查詢的操作過程

    本文介紹了如何使用Java連接ApacheRocketMQ實現(xiàn)信息查詢的功能,通過編寫Java代碼連接MQ并實現(xiàn)生產(chǎn)者發(fā)送消息和消費者接收并處理消息的過程,展示了如何在分布式系統(tǒng)中實現(xiàn)訂單處理系統(tǒng)的解耦,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • mybatis中映射文件include標簽的應用

    mybatis中映射文件include標簽的應用

    這篇文章主要介紹了mybatis中映射文件include標簽的應用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java上傳視頻實例代碼

    Java上傳視頻實例代碼

    本文通過實例代碼給大家講解了java上傳視頻功能,代碼分為頁面前臺和后臺,工具類,具體實例代碼大家通過本文學習吧
    2018-01-01
  • Kafka Java Producer代碼實例詳解

    Kafka Java Producer代碼實例詳解

    這篇文章主要介紹了Kafka Java Producer代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06

最新評論

绵阳市| 大洼县| 卢氏县| 峨边| 日土县| 峨眉山市| 翁牛特旗| 长岭县| 射洪县| 内丘县| 紫金县| 仙桃市| 宁城县| 芦溪县| 彩票| 永州市| 柳州市| 亳州市| 双牌县| 夏河县| 通道| 汤原县| 囊谦县| 镇巴县| 静安区| 灵石县| 凤凰县| 中牟县| 莱西市| 广平县| 金门县| 称多县| 东丰县| 万盛区| 九龙坡区| 三都| 灯塔市| 原阳县| 巢湖市| 稷山县| 桐城市|