我正在研究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(...)
的位置以及它如何链接到下一层?
答案 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源代码,但我认为它仍然存在。