006android初級篇之jni數據類型映射

JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其餘語言的通訊(主要是C&C++)java

使用JNI的反作用

一旦使用JNI,JAVA程序就喪失了JAVA平臺的兩個優勢:數組

  1. 程序再也不跨平臺。要想跨平臺,必須在不一樣的系統環境下從新編譯本地語言部分。
  2. 程序再也不是絕對安全的,本地代碼的不當使用可能致使整個程序崩潰。一個通用規則是,你應該讓本地方法集中在少數幾個類當中。這樣就下降了JAVA和C之間的耦合性。

數據類型映射

在Java存在兩種數據類型:基本類型和引用類型(primitive types 和reference types)
在JNI中也一樣存在相似類型的映射安全

基本類型映射表

Java類型 本地C類型(NativeType) 實際表示的c類型 說明
boolean jboolean unsigned char
byte jbyte signed char
char jchar unsigned char
short jshort unsigned short
int jint long 有符號,32 位
long jlong __int64 有符號,64 位
float jfloat float
double jdouble double
void void N/A

引用類型映射表

Java類型 本地C類型(NativeType) 說明
Object jobject Class類對象
String jstring 字符串對象
Object[] jobjectArray 對象數組
boolean[] jbooleanArray 布爾類型數組
byte[] jbyteArray
char[] jcharArray 字符型數組
short[] jshortArray
int[] jintArray
long[] jlongArray 長整型數組
float[] jfloatArray
double[] jdoubleArray 雙精度浮點型數組

注意

  1. 基本類型在Native層能夠直接引用
  2. 引用數據類型則不能直接使用,須要根據JNI函數進行相應的轉換後,才能使用
  3. 多維數組(包括二維數組)都是引用類型,須要使用 jobjectArray 類型存取其值 ;

描述符

類描述符

是類的完整名稱(包名+類名),將原來的 . 分隔符換成 / 分隔符。
如在java代碼中的java.lang.String類的類描述符就是java/lang/String函數

域描述符

1. 基本類型的域描述符已經定義好

Java語言類型 域描述符
boolean Z
byte B
char C
short S
int I
long J(?爲何不是L)
float F
double D

2. 引用類型的描述符

  1. 通常引用類型則爲 L + 該類型類描述符 + 「;」 。學習

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

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

    int[ ] 其描述符爲[Iblog

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

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

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

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

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

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

參考連接

  1. JNI學習積累之二 ---- 數據類型映射、域描述符說明
  2. Android的NDK開發(3)————JNI數據類型的詳解
相關文章
相關標籤/搜索