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