在前面的一篇博客《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 |
複雜一點的對象類型,其對應的數據描述以下圖: 設計模式
這裏補充說明一下: 數組
關於數據類型的轉換,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,轉載請註明出處,謝謝。