JNI学习积累之二 ---- 数据类型映射、域描述符说明
本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.NET/qinjuning
? ? 在Java存在兩種數(shù)據(jù)類型: 基本類型 和 引用類型 ,大家都懂的 。
? ? 在JNI的世界里也存在類似的數(shù)據(jù)類型,與Java比較起來,其范圍更具嚴(yán)格性,如下:
? ? ? ? 1、primitive types ----基本數(shù)據(jù)類型,如:int、 float 、char等基本類型
? ? ? ? 2、reference types----引用類型,如:類、實(shí)例、數(shù)組。
?
? ? ? 特別需要注意:數(shù)組 ------ 不管是對(duì)象數(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ù)進(jìn)行相應(yīng)的轉(zhuǎn)換后,才能使用
? ? ? ? 2、多維數(shù)組(包括二維數(shù)組)都是引用類型,需要使用 jobjectArray 類型存取其值 ;
? ? ? ? ? ? ? ? ?例如:二維整型數(shù)組就是指向一位數(shù)組的數(shù)組,其聲明使用方式如下:
? ? ? ? ? ? ? ? ? ??
[java] view plaincopy print?? ?另外,關(guān)于引用類型的一個(gè)繼承關(guān)系如下,我們可以對(duì)具有父子關(guān)系的類型進(jìn)行轉(zhuǎn)換:
? ? ? ? ? ? ? ? ? ??
? 類描述符
? ? 類描述符是類的完整名稱(包名+類名),將原來的 . 分隔符換成 / 分隔符。
? ? ? ? ? ?例如:在java代碼中的java.lang.String類的類描述符就是java/lang/String
? ? ? ?其實(shí),在實(shí)踐中,我發(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 + 該類型類描述符 + ; ??(注意,這兒的分號(hào)“;”只得是JNI的一部分,而不是我們漢語中的分段,下同)
? ? ? ? ? ? ? ? ? 例如:String類型的域描述符為 Ljava/lang/String; ?
? ? ? ? ? 對(duì)于數(shù)組,其為 : ?[ + 其類型的域描述符 + ;
?
? ? ? ? ? ? ? ? ? int[ ] ? ? 其描述符為[I
? ? ? ? ? ? ? ? ? float[ ] ? 其描述符為[F
? ? ? ? ? ? ? ? ? String[ ] ?其描述符為[Ljava/lang/String;
? ? ? ? ? ? ? ?? Object[ ]類型的域描述符為[Ljava/lang/Object;
? ? ? ? ? 多維數(shù)組則是 n個(gè)[ +該類型的域描述符 , N代表的是幾維數(shù)組。例如:
? ? ? ? ? ? ?int ?[ ][ ] 其描述符為[[I
????????????float[ ][ ] 其描述符為[[F
?
? 方法描述符
? ? ? ?將參數(shù)類型的域描述符按照申明順序放入一對(duì)括號(hào)中后跟返回值類型的域描述符,規(guī)則如下: (參數(shù)的域描述符的疊加)返回
? 類型描述符。對(duì)于,沒有返回值的,用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
?
?
? ? ?在編程時(shí),如果是利用javah工具的話,這些都不需要我們手動(dòng)編寫對(duì)應(yīng)的類型轉(zhuǎn)換,如果不能用javah工具,就只能手動(dòng)的
? 進(jìn)行類型轉(zhuǎn)換了。
? ? 下一篇將會(huì)以一個(gè)具體的實(shí)站去具體掌握J(rèn)NI。
??
? ? 分析一個(gè)使用Android NDK 開發(fā)的系列博客,覺得挺不錯(cuò)的:
? ? ? ? ? ??? ?《?Android的NDK開發(fā)(3)————JNI數(shù)據(jù)類型的詳解》
轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/6168949.html
總結(jié)
以上是生活随笔為你收集整理的JNI学习积累之二 ---- 数据类型映射、域描述符说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 下使用 Sar 简介
- 下一篇: 本地不安装Oracle,plsql远程连