2017-09-28 102 views
2

我正在研究Google Pixel AOSP build(android-8.0.0_r3)的NFC代碼。我可以理解,從內核調用流程一路Android的硬件模塊system\nfc\halimpl\pn54x\nfc_nci.c如下:從HAL到應用程序框架層的AOSP NFC設備調用流程

struct nfc_nci_module_t HAL_MODULE_INFO_SYM = { 
    .common = 
     { 
      .tag = HARDWARE_MODULE_TAG, 
      .module_api_version = 0x0100, /* [15:8] major, [7:0] minor (1.0) */ 
      .hal_api_version = 0x00,  /* 0 is only valid value */ 
      .id = NFC_NCI_HARDWARE_MODULE_ID, 
      .name = "NXP PN54X NFC NCI HW HAL", 
      .author = "NXP Semiconductors", 
      .methods = &nfc_module_methods, 
     }, 
}; 

此硬件模塊被加載通過hw_get_module(NFC_NCI_HARDWARE_MODULE_ID)發現它在hardware/interface/nfc/1.0/default/nfc.cpp : HIDL_FETCH_INfc(...)。現在我被困在這裏,無法找到AOSP在哪裏調用HIDL_FETCH_INfc(...)以及它如何鏈接到下一層?

回答

0

對於與硬件交互的android服務,它按以下方式連接。 在nfc.cpp應該有類似於一個功能:

JNINativeMethod method_table[]= { 
    {"external_name","(I)Z)",(void*)internal_name}, 
}; 

int register_android_server_FlexcanService(JNIEnv* env) 
{ 
    return jniRegisterNativeMethods(env,"com/android/server/MyService",method_table,NELEM(method_table)); 
} 

這jniRegisterNativeMethods被稱爲在onload.cpp和nfc.cpp被添加到Android.mk在同一文件夾

然後在java包com.android.server.MyService(核心/ JAVA/COM /安卓/服務器)會出現在本地函數的調用:

public static native boolean external_name(int someVar); 

從那裏會有一個.aidl活頁夾文件將服務方法公開給SDK並最終進入頂級的Android應用程序。

+0

我在dir的'hardware/interface/nfc'中沒有看到任何'jniRegisterNativeMethods(...)' – Consy

+0

您的意思是在終端輸入'grep -r jniRegisterNativeMethods'找不到'jniRegisterNativeMethods'硬件/接口/ nfc目錄? –

+0

是的,試過了,在hardware/interface/nfc目錄中找不到它dir – Consy

0

在Android 7.x中,NFC JNI位於packages/apps/Nfc/nci/jni /。我沒有檢查過Android 8.x源代碼,但我認爲它仍然存在。

+0

是的,你是對的路徑是正確的,但是對於HIDL_FETCH_INFc(...)'與那裏的任何文件有什麼聯繫,仍然沒有答案。 – Consy

+0

您可以在packages/apps/Nfc/nci/jni /中找到 'hw_get_module(NFC_HARDWARE_MODULE_ID,&hw_module);' ,爲什麼需要'HIDL_FETCH_INfc'? – ZhouZhuo