2011年5月18日 星期三

Java Native Interface (JNI) 的使用時機及影響

JNI的使用時機及影響

上篇的實作後,整理一下JNI的使用時機及影響:

什麼時機下應該使用JNI
下面提出幾個項目避免使用JNI:
1、JAVA程式和本地程式使用TCP/IP或者IPC。
2、當用JAVA程式連接本地資料庫時,使用JDBC提供的API。
3、JAVA程式可以使用分散式物件技術,如JAVA IDL API。
上述三項共同點是JAVA和C 處於不同的執行緒,或者不同的機器上。這樣當C程式部分異常時,會影響到JAVA程式。

接著那何時需要使用JNI呢? 下列情況是在同一進程內無法避免JNI的使用:
1、程式當中使用到了JAVA API 沒有提供的特殊系統環境加上使用跨進程操無法不現實情況下,如與硬體進行通訊時。
2、想使用一些已經有的本地庫(native library),但又不想付出跨進程調用時的延宕(overhead),如效率,記憶體,資料傳遞方面。
3、JAVA程式當中的一部分代碼對效率要求非常高,如演算法計算,繪圖等。
總之,只有當你必須在同一進程中調用本地代碼(nativecode)時,建議使用JNI。

JNI的副作用:
1、程式失去跨平臺。如想跨平臺在不同的系統環境下須重新編譯C語言部分。
2、影響程式的穩定,本地代碼的不當使用可能導致整個程式損壞或當掉。
通用規則是應該讓本地方法集中在少數幾個類(class)中,減少JAVA和C之間的通訊。

以上詳細內容出至The Java™ Native Interface Programmer's Guide and Specification;請參閱:
1.3 Implications of Using the JNI
1.4 When to Use the JNI

1 則留言:

  1. 你好

    請教一下,我若做一個jni去呼叫 android現有的連結檔,如libmedia.so 或 libmediaplayerservice.so這樣做可行嗎? 跟你所介紹的這避免使用三點有關係嗎?

    回覆刪除