jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

[教育訓練紀錄] Android 的 JNI 開發,排名第一名的誤用是?

.作者:jollen/
.日期:September 27, 2011 12:21 AM


Java 與 native code 的溝通介面稱為 JNI,這是 Android 底層開發的基本技術。不過,有許多 C 語言遺留下來的壤習慣,讓很多系統程式的開發者,一不小心就把 JNI 的程式碼寫錯。本週將會在一場論壇上說明幾個「誤用 C 語言」的例子,希望對 Android 底層開發的初學者有幫助。

近期在協助一家企業進行 Android 內訓,也遇到工程師問起「Java 如何與 C 傳遞資料」的問題,以傳遞陣列來說,其程式碼的寫法,跟傳統的 C 語言寫法有點不同。

從過去的教育訓練經驗裡也能歸納發現,排行榜第一名的誤用莫過於「陣列傳遞」,當 Java 透過 JNI 傳遞 Array 給 native code 時,native code 必須使用 JNI 的 GetIntArrayRegion() method 來讀取,而不是使用 C Pointer 的做法。

例如:

int intArrayAdd(int *num)
{
   int i, sum = 0;
   
   for (i = 0; i < 10; i++) {
      sum += num[i];
   }
}

換成 JNI 的話,應該改寫成:

intArraryAdd(JNIEnv *env, jobject obj, jintArray arr)
 {
     jint buf[10];
     jint i, sum = 0;
 
     (*env)->GetIntArrayRegion(env, arr, 0, 10, buf);
 
     for (i = 0; i < 10; i++) {
         sum += buf[i];
     }
     return sum;
 }

這裡的概念是,將陣列 copy 到 native code 裡後再使用。相關的完整說明,可參考「The Java Native Interface. Programmer's Guide and Specification」第 3.3 節。

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2011 www.jollen.org. All rights reserved.
Last update: 2026-07-22