日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JNI学习积累之二 ---- 数据类型映射、域描述符说明

發(fā)布時間:2024/9/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI学习积累之二 ---- 数据类型映射、域描述符说明 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文原創(chuàng),轉(zhuǎn)載請注明出處:http://blog.csdn.NET/qinjuning



? ? 在Java存在兩種數(shù)據(jù)類型: 基本類型 和 引用類型 ,大家都懂的 。


? ? 在JNI的世界里也存在類似的數(shù)據(jù)類型,與Java比較起來,其范圍更具嚴格性,如下:


? ? ? ? 1、primitive types ----基本數(shù)據(jù)類型,如:int、 float 、char等基本類型

? ? ? ? 2、reference types----引用類型,如:類、實例、數(shù)組。

?

? ? ? 特別需要注意:數(shù)組 ------ 不管是對象數(shù)組還是基本類型數(shù)組,都作為reference types存在。

?

? ? ?1、primitive types (基本數(shù)據(jù)類型)映射參見下表:?


? ? ? ? ? ? ? ??


? ? ? ? 這些基本數(shù)據(jù)類型都是可以在Native層直接使用的 。

?

? ? ? 2、reference types (引用數(shù)據(jù)類型)映射參見下表


? ? ? ? ? ? ? ? ? ? ? ? Java類型 ? ? ? ? ? ? ? ? ? ? ?Native Type ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述

? ? ? ? ? ? ??


? ? ?注意? ?

? ? ? ? 1引用數(shù)據(jù)類型則不能直接使用,需要根據(jù)JNI函數(shù)進行相應(yīng)的轉(zhuǎn)換后,才能使用

? ? ? ? 2、多維數(shù)組(包括二維數(shù)組)都是引用類型,需要使用 jobjectArray 類型存取其值 ;

? ? ? ? ? ? ? ? ?例如:二維整型數(shù)組就是指向一位數(shù)組的數(shù)組,其聲明使用方式如下:

? ? ? ? ? ? ? ? ? ??

[java] view plaincopy print?
  • //獲得一維數(shù)組?的類引用,即jintArray類型??
  • ????jclass?intArrayClass?=?env->FindClass("[I");???
  • ????//構(gòu)造一個指向jintArray類一維數(shù)組的對象數(shù)組,該對象數(shù)組初始大小為dimion??
  • ????jobjectArray?obejctIntArray??=??env->NewObjectArray(dimion?,intArrayClass?,?NULL);??
  • ????...//具體操作??

  • ? ?另外,關(guān)于引用類型的一個繼承關(guān)系如下,我們可以對具有父子關(guān)系的類型進行轉(zhuǎn)換:

    ? ? ? ? ? ? ? ? ? ??


    ? 類描述符


    ? ? 類描述符是類的完整名稱(包名+類名),將原來的 . 分隔符換成 / 分隔符。

    ? ? ? ? ? ?例如:在java代碼中的java.lang.String類的類描述符就是java/lang/String


    ? ? ? ?其實,在實踐中,我發(fā)現(xiàn)可以直接用該類型的域描述符取代,也是可以成功的。

    ? ? ? ? ? ? ? 例如: ? ??? ?jclass intArrCls = env->FindClass("java/lang/String")

    ? ? ? ? ? ? ? ? 等同于 ? ???jclass intArrCls = env->FindClass("Ljava/lang/String;")


    ? ?數(shù)組類型的描述符則為,則為: ?[ + 其類型的域描述符 ? ? ? ?(后文說明)

    ? ? ? ? ? ?例如:

    ? ? ? ? ? ? ? ? ? int [ ] ? ? 其描述符為[I

    ? ? ? ? ? ? ? ? ? float [ ] ? 其描述符為[F

    ? ? ? ? ? ? ? ? ? String [ ] ?其描述符為[Ljava/lang/String;

    ?

    ? 域描述符


    ? ? ? 1、基本類型的描述符已經(jīng)被定義好了,如下表所示:


    ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    ?

    ?

    ? ? ?2、引用類型的描述符


    ? ? ? ? ?一般引用類型則為 L + 該類型類描述符 + ; ??(注意,這兒的分號“;”只得是JNI的一部分,而不是我們漢語中的分段,下同)

    ? ? ? ? ? ? ? ? ? 例如:String類型的域描述符為 Ljava/lang/String; ?


    ? ? ? ? ? 對于數(shù)組,其為 : ?[ + 其類型的域描述符 + ;

    ?

    ? ? ? ? ? ? ? ? ? int[ ] ? ? 其描述符為[I

    ? ? ? ? ? ? ? ? ? float[ ] ? 其描述符為[F

    ? ? ? ? ? ? ? ? ? String[ ] ?其描述符為[Ljava/lang/String;

    ? ? ? ? ? ? ? ?? Object[ ]類型的域描述符為[Ljava/lang/Object;


    ? ? ? ? ? 多維數(shù)組則是 n個[ +該類型的域描述符 , N代表的是幾維數(shù)組。例如:

    ? ? ? ? ? ? ?int ?[ ][ ] 其描述符為[[I

    ????????????float[ ][ ] 其描述符為[[F

    ?

    ? 方法描述符


    ? ? ? ?將參數(shù)類型的域描述符按照申明順序放入一對括號中后跟返回值類型的域描述符,規(guī)則如下: (參數(shù)的域描述符的疊加)返回

    ? 類型描述符。對于,沒有返回值的,用V(表示void型)表示。舉例如下:


    ? ? ? ? ? ? ? ? ?Java層方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? JNI函數(shù)簽名

    ? ? ? ? ? ? ? ? String test ( ) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Ljava/lang/String;

    ? ? ? ? ? ? ? ? int f (int i, Object object) ? ? ? ? ? ? ? ? ? ? ? ? ? ?(ILjava/lang/Object;)I

    ? ? ? ? ? ? ? ? void set (byte[ ] bytes) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?([B)V

    ?

    ?

    ? ? ?在編程時,如果是利用javah工具的話,這些都不需要我們手動編寫對應(yīng)的類型轉(zhuǎn)換,如果不能用javah工具,就只能手動的

    ? 進行類型轉(zhuǎn)換了。



    ? ? 下一篇將會以一個具體的實站去具體掌握JNI。

    ??

    ? ? 分析一個使用Android NDK 開發(fā)的系列博客,覺得挺不錯的:


    ? ? ? ? ? ??? ?《?Android的NDK開發(fā)(3)————JNI數(shù)據(jù)類型的詳解》

    轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/6168949.html

    總結(jié)

    以上是生活随笔為你收集整理的JNI学习积累之二 ---- 数据类型映射、域描述符说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。