Android NDK開發之Jni的數據類型

在前面的一篇博客《Android NDK開發簡介》,我簡單地說明了Android NDK開發的流程,以及其重要的一環:JNI層得開發。今天我再詳細說明一下本身的學習經驗。 c++

JNI是Java代碼和C/C++代碼通訊的橋樑,其角色在某種意義上就是一個翻譯員,從設計模式來看叫適配器。 算法


二者的溝通,首要的必定要對嘴型,對channel,溝通才能到位。計算機程序的基本組成,從狹義來說,就是數據結構+算法。因爲Java和C/C++是兩種不一樣的編程語言,它們各自擁有自家定義的數據類型和結構。JNI的第一步就是統一轉換其中一方的數據類型,這就比如咱們跟外國友人溝通,咱們得說英語同樣子。下表是Java的8大基本類型,在Jni層對應的數據描述: 編程

Java  Native(jni.h)
boolean  jboolean
byte  jbyte
char  jchar
short  jshort
int jint
long  jlong
float jfloat
double  jdouble


複雜一點的對象類型,其對應的數據描述以下圖: 設計模式

這裏補充說明一下: 數組

  1. Java中的返回值void和JNI中的void是徹底對應的 
  2. Java中的基本數據類型(boolean, byte, char, short, int, long, float, double),在JNI中對應的數據類型只要在前面加上 j 就對應了(jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble) 
  3.  Java中的對象,包括類庫中定義的類、接口以及自定義的類接口,都對應於JNI中的 jobject
  4.  Java中基本數據類型的數組對應與JNI中的 jarray 類型。(type就是上面說的8種基本數據類型)
  5.  Java中對象的數組對應於JNI中的 jobjectArray 類型。(在Java中一切對象、接口以及數組都是對象

關於數據類型的轉換,JNI還提供的強悍的函數庫來支持。對於基本的類型的轉換,咱們先來複習一下,先關注一下Java基本類型的精度。 數據結構

類型 字節數 範圍/精度
float 4 32位IEEE754單精度
double 8 64位IEEE754雙精度
byte 1 -128到127
short 2 -32,768到32,767
int 4 -2,147,483,648到2,147,483,647
long 8 -9,223,372,036,854,775,808到9,223,372,036,854,775,807
char 2 整個Unicode字符集
boolean 1 True或者false


Java 的基本數據類型是不存在有符號和無符號這種概念的,它們的取值範圍是固定的,不會隨着機器硬件環境或者操做系統的改變而改變。 編程語言

      像 byte 的範圍是 -128 到 127,你想要變爲 0到255 怎麼辦,,跟 0XFF 作與運算就能夠了:b & 0XFF  函數

      如 byte b ,若是你想賦值它值 255,那是不行的, 就算賦值了,b的值也是 255 對 256 求模後的值 -1,即 b = -1,  而後 b & 0XFF 結果即爲 255,這個與運算後的結果會隱式轉換爲int 類型的, 由於 byte 放不下了,與運算仍是很快的,,比加減法還快的。  學習

因此Jni層使用Java的基本類型數據,對於上面八種基本的數據類型,jni層的c/c++代碼能夠用強制直接轉換成對應長度的c/c++類型數據。 spa

如:unsigned char tmp = (unsigned char) m_jboolean;        

     unsigned short tmp = (unsigned short) m_jchar;        

或者同長度類型的數據,能夠直接賦值,int tmp = m_jint;


關於Jni操做對象類型或更複雜數據類型的說明,請留意以後的博客。


本文轉自Zhiweiofli's Blog,轉載請註明出處,謝謝。

相關文章
相關標籤/搜索