Android JNI開發提高篇
有關JNI的開發技術,我們繼續圍繞Android平臺進行,JNI可以支援C或C++,從目前為止我們寫過的JNI程式碼均為C實現的,即檔名為.C而C++的和這些有什麼不同呢? Android平臺上的JNI一般使用C還是C++編寫呢?
Android平臺在中間層和大部分的類庫的底層使用了C++的開發方式,字尾為.cpp,比如Android Framework、OpenCore、Webkit、SQLite等等。使用C++好處就是可以使用很多庫但目前Android不支援STL,我們知道 C表示字串都是字元陣列,但C++可以使用類似string這樣的型別表示。
1. 程式碼上編寫C和C++有啥區別
這裡Android123就以將Java的unicode字串轉為jni中的utf8,然後再返回一個jstring型別為例子,可以看到jni和java之間字串的轉換方法。
C的實現:
C++的實現:
我們加粗了主要區別的關鍵字,可以看到C++的程式碼更簡練。
2. JNI運算元組程式碼
JNI中處理陣列通用物件為jobjectArray 當然常規的型別比如整形為jintArray,布林型為jbooleanArray,但沒有出現jstringArray這樣的型別,有關字元陣列的處理我們將在下次的 Android JNI開發進階篇 詳細說明 。處理陣列時我們需要考慮陣列的長度不能為0才能繼續操作,不然就會有訪問越界等問題,在JNI中提供了通用型別的GetArrayLength函式。我們從Java傳入一個以整形陣列,在JNI中將每個元素相加為例返回一個整形告訴Java運算的結果。
如何在JNI中構造一個數組呢? Android開發網給大家一個簡單的示例,返回一個整形陣列:
3. JNI中有關異常的處理
JNI中丟擲異常沒有try...catch這樣的,而是直接丟擲錯誤
方法1: 使用ThrowNew,比如IOException類發生了FileNotFound
方法2: 使用Throw,自己構造