SmartJNI —— 更簡潔更高效的JNI介面封裝__android
來源:互聯網
上載者:User
引入 平時我們在android NDK開發過程中,碰到最多的情況就是通過JNI回調java的API。JNI可以理解為java反射架構的本地版本。JNI所提供的原生介面,如果需要通過反射擷取methodID或fieldID,需要先寫出寫函數和欄位的簽名(sign),而且調用過程極其繁瑣,詳細的使用說明,可以參考連結 JNI使用教程。 另外,相比之下,JAVA層下的反射API,使用起來簡潔方便得多, 可參考連結 JAVA反射教程。 而SmartJNI的引入,目的主要有兩個: 其一,屏避掉JAVA和JNI兩套反射API在使用上的差異; 其二,採用物件導向的方式封裝JNI的原生API, 大大減少開發代碼量,而且可讀性更強。
實現原理 SmartJNI實現的技術要點,主要有如下兩點: 其一,就是屏避掉函數簽名的細節, 不需要調用方編寫簽名字串; 詳細的實現,請參見源碼 Method.cpp。
其二,本地代碼中可變參數與Java層可變參數之間的傳遞; 詳細的實現,請參見源碼 Method.cpp。
樣本對比 原生的JNI調用樣本就不提供了,網上很多,下面是採用SmartJNI和Java API的樣本對比:
SmartJNI調用樣本
JAVA 調用樣本
通過SmartJNI的封裝,兩者在使用上,除了本身文法上的一些限制,基本上已經一致了。
最後說明 目前SmartJNI還不能完成替代JNI,但基本可以用。要完全替換掉JNI,還需要花些時間慢慢完善,SmartJNI項目已經在googlecode上開源,地址是http://code.google.com/p/smart-jni/,大家可以通過 svn checkout下來。另外,如果有興趣跟我一起完善SmartJNI的話,也可以私下找我,我開通讀寫權限。
PS:如果你有什麼好的建議,可以直接在 googlecode 上的Wiki上給我反饋,謝謝。