JNI是Java Native Interface的縮寫(xiě),是Java平臺(tái)的重要特性,使得Java代碼可以方便地與C/C++代碼編譯生成的動(dòng)態(tài)鏈接庫(kù)進(jìn)行交互。本文主要給出一份示例代碼(工程文件見(jiàn)附件),描述如何在Android的JNI層開(kāi)啟一個(gè)線程,并在線程中回調(diào)Java層的函數(shù)。
創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元烏蘭察布做網(wǎng)站,已為上家服務(wù),為烏蘭察布各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792代碼主要分為Java層(java代碼)和JNI層(c語(yǔ)言代碼),首先看看Java層的代碼(Native.java)。
如上所示,Java層與JNI層的接口代碼主要封裝在Native類中,該類定義了三個(gè)native函數(shù),分別完成jni庫(kù)的初始化,調(diào)用jni層開(kāi)啟線程,調(diào)用jni層關(guān)閉線程等功能。并且提供一個(gè)回調(diào)函數(shù)(onNativeCallback),供jni層調(diào)用,并在回調(diào)函數(shù)中打印count的值。
再看看JNI層是如何開(kāi)啟線程并回調(diào)Java層的(native.c),關(guān)鍵的地方都在代碼中進(jìn)行了注釋:
1. 頭文件包含和全局變量的定義
2. 初始化函數(shù)的實(shí)現(xiàn)
3. 開(kāi)啟關(guān)閉線程的實(shí)現(xiàn)
4. 線程的實(shí)現(xiàn)(關(guān)鍵)
由上述代碼可以看到,JNI層通過(guò)pthread庫(kù)完成了線程的創(chuàng)建,需要特別注意的是,JNI層的線程中,必須通過(guò)全局的JavaVM來(lái)獲取到環(huán)境變量,也必須通過(guò)全局的jobject獲取java類對(duì)象,從而找到j(luò)ava端的函數(shù),進(jìn)行回調(diào)。
代碼的工程文件見(jiàn)附件,編譯運(yùn)行后,會(huì)在logcat調(diào)試窗口不斷打印count的值。本文就介紹到這,主要是提供一份示例代碼給初學(xué)者,有疑問(wèn)歡迎留言或者來(lái)信lujun.hust@gmail.com交流,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。
附件:http://down.51cto.com/data/2364058另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。