97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠(yuǎn)見(jiàn)教育科技集團(tuán) >> 新聞動(dòng)態(tài) >> Android資料 >> Android Java JNI機(jī)制詳解  
 
Android Java JNI機(jī)制詳解
分享到:

在Android中,為了完成上層應(yīng)用和底層服務(wù)之間的相互調(diào)用,根據(jù)請(qǐng)求的服務(wù)不同,交互過(guò)程主要有3種類型:直接調(diào)用、通過(guò)原生服務(wù)調(diào)用、通過(guò)原生守護(hù)進(jìn)程調(diào)用。考慮到上層的應(yīng)用一般是基于Java實(shí)現(xiàn)的,而底層服務(wù)則是基于C/C++實(shí)現(xiàn)的,為了完成跨語(yǔ)言的交互,就需要用到Java JNI機(jī)制。

1. Java JNI原生接口

考慮到底層的Linux內(nèi)核和中間層面的原生服務(wù)都是利用C/C++來(lái)寫(xiě)的,為了使應(yīng)用程序能夠訪問(wèn)到底層的原生服務(wù)和設(shè)備,就必須考慮Java和C/C++,甚至匯編語(yǔ)言間的互操作性。在Android中,Java和其他語(yǔ)言的交互是利用Java JNI機(jī)制來(lái)完成的。

自Java 1.1起,Java JNI(Java Native Interface)標(biāo)準(zhǔn)就已經(jīng)是Java的一部分,JNI允許Java與其他語(yǔ)言編寫(xiě)的代碼進(jìn)行交互。

Java通過(guò)Java JNI調(diào)用本地方法,而本地方法是以共享庫(kù)(*.so)文件的形式存放的,通過(guò)調(diào)用本地庫(kù)文件的內(nèi)部方法,使Java可以實(shí)現(xiàn)和本地機(jī)器的緊密聯(lián)系,調(diào)用系統(tǒng)級(jí)的各接口方法。

在Android中,通過(guò)JNIEnv,使得C代碼也能調(diào)用Java提供的服務(wù),這方面的一個(gè)重要實(shí)例為IBinder通信。

但需要注意的是,利用C/C++等完成的底層代碼的安全性較弱,無(wú)法防止開(kāi)發(fā)者利用無(wú)效的指針來(lái)改寫(xiě)內(nèi)存,這會(huì)導(dǎo)致虛擬機(jī)安全性的削弱。

在Android中,原生接口主要位于frameworks\base\core\jni \AndroidRuntime.cpp文件中。利用Java JNI注冊(cè)原生接口的方法為:

/*static*/ int AndroidRuntime::registerNativeMethods(JNIEnv* env,
        const char* className, const JNINativeMethod* gMethods, int numMethods)
    {
        return jniRegisterNativeMethods(env, className, gMethods, numMethods);
    }

2. 直接調(diào)用

在直接調(diào)用模式中,上層應(yīng)用通過(guò)IBinder機(jī)制與框架層的服務(wù)直接通信,框架層服務(wù)通過(guò)Java JNI動(dòng)態(tài)加載相關(guān)的共享庫(kù),完成服務(wù)。

如圖1-1所示為上層應(yīng)用調(diào)用硬件抽象層(HAL,Hardware Abstraction Layer)提供的實(shí)時(shí)服務(wù)時(shí)的調(diào)用層次說(shuō)明。需要說(shuō)明的是,HAL的出現(xiàn)更多的是為底層提供封裝,保護(hù)平臺(tái)廠商和第三方廠商的利益。


圖1-1 實(shí)時(shí)服務(wù)調(diào)用層次說(shuō)明

如圖1-2所示為智能手機(jī)中常見(jiàn)的位置服務(wù)的調(diào)用層次說(shuō)明,上層的導(dǎo)航應(yīng)用和其他的位置應(yīng)用在獲取底層的GPS服務(wù)時(shí),首先調(diào)用位置管理器服務(wù)(Location Manager Service),然后通過(guò)Java JNI終調(diào)用libgps.so共享庫(kù)。


圖1-2 位置服務(wù)調(diào)用層次

3. 原生服務(wù)調(diào)用

在原生服務(wù)調(diào)用模式中,由于應(yīng)用本身更加復(fù)雜,應(yīng)用的抽象實(shí)現(xiàn)會(huì)放置在原生層,當(dāng)上層應(yīng)用調(diào)用底層的服務(wù)時(shí),首選會(huì)通過(guò)Java JNI調(diào)用應(yīng)用本身的原生接口,然后通過(guò)IPC通信與其他的原生服務(wù)進(jìn)行交互。如圖1-3所示為媒體播放應(yīng)用的調(diào)用層次關(guān)系。

在多媒體應(yīng)用中,這是常用的交互方式。


圖1-3 原生服務(wù)

4.原生守護(hù)進(jìn)程調(diào)用

在原生守護(hù)進(jìn)程調(diào)用模式中,調(diào)用的原生服務(wù)通常是后臺(tái)的守護(hù)進(jìn)程,在這種模式中,上層應(yīng)用會(huì)首先通過(guò)Java JNI和應(yīng)用本身的原生接口通信,然后通過(guò)套接字或者IPC和守護(hù)進(jìn)程通信。如圖1-4所示為通話應(yīng)用的調(diào)用層次關(guān)系。


圖1-4 原生守護(hù)進(jìn)程調(diào)用

 更多相關(guān)文章

·Android IBinder通信機(jī)制
·Android ONC RPC遠(yuǎn)程調(diào)用
·Dalvik虛擬機(jī)原生方法的注冊(cè)
·Android Dalvik虛擬機(jī)啟動(dòng)
·Android服務(wù)管理器守護(hù)進(jìn)程