由于公司最近要搞跨平臺,而平臺的核心是用C++,所以著(zhù)實(shí)研究了兩個(gè)月的NDK和JNI。
經(jīng)過(guò)資料的閱讀和兄弟幾個(gè)的測試,總結了幾個(gè)結論,可能對想在項目當中使用NDK的有所幫助:
第一、調用效率方面的測試結構。我們測完以后,NDK環(huán)境下的JNI和SUN的官方文檔中說(shuō)的差不多:
1、Java調用C/C++。單純函數調用花費的時(shí)間上面,和Java之間的調用相差無(wú)幾。
2、C/C++調用Java。是Java調用C/C++花費時(shí)間的10~20倍。
第二、適用范圍。NDK的官方文檔中說(shuō)過(guò)的,我們測試后才徹底死心的:把NDK當成一種輔助,程序主要邏輯仍要用Java來(lái)寫(xiě),可以把以前的代碼或者計算量比較大的代碼用C/C++來(lái)實(shí)現(比較游戲當中的智能搜索算法)。不要想著(zhù)用C/C++的位置擺的太重。
第三、API在有限。幾乎只支持標準庫,甚至標準庫都支持的不完整。我們在移植C/C++源代碼過(guò)程中發(fā)現的localeconv();這個(gè)函數支持就有問(wèn)題。在NDK中找到頭文件后,發(fā)現定義是空的。
第四、JNI的調用帶來(lái)的風(fēng)險。這個(gè)在SUN官方的JNI規范中提出過(guò)好多次了,盡量不要使用,如果一定要用,保持C/C++和Java之間的獨立,把接口盡量做簡(jiǎn)單。否則的話(huà),很可能的結果是,Java的優(yōu)勢沒(méi)了,C/C++的優(yōu)勢也沒(méi)體現出來(lái)。
第四、對一個(gè)正規項目來(lái)說(shuō),這或許最大的危險。目前針對NDK還沒(méi)有完整的開(kāi)發(fā)調試環(huán)境。JNI相關(guān)的代碼你是不能在Android開(kāi)發(fā)環(huán)境中調試的。
另外,附贈一個(gè)研究過(guò)程中的一個(gè)成果。哈~
看JNI時(shí),發(fā)現中文資料非常的少,所以差不多理解完以后,就把SUN官方文檔中關(guān)于JNI編程指南和規范的英文文檔翻譯出來(lái)了。資源分設置的比較高,不過(guò),真的是很值的,你下載下來(lái)后就知道了。哥窮的很,可是哥真的從不騙人。
聯(lián)系客服