SmartJNI —— 更簡潔更高效的JNI接口封裝

引入
      平時我們在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上給我反饋,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章