AOSP NFC设备从HAL到应用框架层的呼叫流程

时间:2017-09-28 06:06:27

标签: android nfc android-source

我正在研究Google Pixel AOSP构建的NFC代码(android-8.0.0_r3)。我可以理解从内核到Android硬件模块system\nfc\halimpl\pn54x\nfc_nci.c的调用流程如下:

 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(...)的位置以及它如何链接到下一层?

2 个答案:

答案 0 :(得分: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));
}

在onload.cpp中调用此jniRegisterNativeMethods,并将nfc.cpp添加到同一文件夹中的Android.mk

然后在java包com.android.server.MyService(core / java / com / android / server)中将调用本机函数:

public static native boolean external_name(int someVar);

从那里会有一个.aidl活页夹文件,用于向SDK公开服务方法,最终进入顶级Android应用程序。

答案 1 :(得分:0)

在Android 7.x中,NFC JNI位于packages / apps / Nfc / nci / jni /。我还没有检查Android 8.x源代码,但我认为它仍然存在。