JNI學習積累之二 ---- 數據類型映射、域描述符說明

原文地址: http://blog.csdn.net/qinjuning/article/details/7599796

在Java存在兩種數據類型: 基本類型 和 引用類型 ,大家都懂的 。


    在JNI的世界裏也存在類似的數據類型,與Java比較起來,其範圍更具嚴格性,如下:


        1、primitive types ----基本數據類型,如:int、 float 、char等基本類型

        2、reference types----引用類型,如:類、實例、數組。

 

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

 

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


                


        這些基本數據類型都是可以在Native層直接使用的 。

 

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


                        Java類型                      Native Type                                          描述

              


     注意   

        1、引用數據類型則不能直接使用,需要根據JNI函數進行相應的轉換後,才能使用

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

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

                    

  1. //獲得一維數組 的類引用,即jintArray類型  
  2.     jclass intArrayClass = env->FindClass("[I");   
  3.     //構造一個指向jintArray類一維數組的對象數組,該對象數組初始大小爲dimion  
  4.     jobjectArray obejctIntArray  =  env->NewObjectArray(dimion ,intArrayClass , NULL);  
  5.     ...//具體操作  


   另外,關於引用類型的一個繼承關係如下,我們可以對具有父子關係的類型進行轉換:

                    


  類描述符


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

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


       其實,在實踐中,我發現可以直接用該類型的域描述符取代,也是可以成功的。

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

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


   數組類型的描述符則爲,則爲:  [ + 其類型的域描述符        (後文說明)

           例如:

                  int [ ]     其描述符爲[I

                  float [ ]   其描述符爲[F

                  String [ ]  其描述符爲[Ljava/lang/String;

 

  域描述符


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


                           

 

 

     2、引用類型的描述符


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

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


          對於數組,其爲 :  [ + 其類型的域描述符 + ;

                  int[ ]     其描述符爲[I

                  float[ ]   其描述符爲[F

                  String[ ]  其描述符爲[Ljava/lang/String;

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


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

             int  [ ][ ] 其描述符爲[[I

            float[ ][ ] 其描述符爲[[F

 

  方法描述符


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

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


                 Java層方法                                               JNI函數簽名

                String test ( )                                              Ljava/lang/String;

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

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

 

 

     在編程時,如果是利用javah工具的話,這些都不需要我們手動編寫對應的類型轉換,如果不能用javah工具,就只能手動的

  進行類型轉換了。



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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章